gpt4 book ai didi

android - 无法通过更改方向或保存 fragment UI 使 fragment 保持 Activity 状态

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:38 25 4
gpt4 key购买 nike

我有一个使用 SherlockActionBar 并通过 Action Bar 中的 ActionItems 在动态 fragment 之间切换的应用。

问题是我无法保存 fragment 状态及其 UI 数据。

这是 FragmentActivity:

public class MainActivity extends SherlockFragmentActivity {

private LocationFragment locationFragement;
private HomeFragment homeFragment;
private SettingsFragment settingsFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(false);


locationFragement = new LocationFragment();
homeFragment = new HomeFragment();
settingsFragment = new SettingsFragment();

}

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
return true;
}



@Override
public boolean onOptionsItemSelected(MenuItem item) {

FragmentManager fragManager = getSupportFragmentManager();
FragmentTransaction fragTransaction = fragManager.beginTransaction();

switch (item.getItemId()){

case R.id.home:

fragTransaction.replace(android.R.id.content, homeFragment);
break;

case R.id.location:

fragTransaction.replace(android.R.id.content, locationFragement);
break;

case R.id.settings:

fragTransaction.replace(android.R.id.content, settingsFragment);
break;

}
fragTransaction.commit();
return true;
}

首先,我尝试调用 fragment 的单个实例,但每次我在 onOptionsItemSelected 开关 block 中调用时都遇到 NullPointerExceptions

  fragTransaction.replace(android.R.id.content, myFragmentClassName);

fragment 实例化时

 if(savedInstanceState == null){
locationFragement = new LocationFragment();
homeFragment = new HomeFragment();
settingsFragment = new SettingsFragment();
}

fragment 显然不会在方向改变的情况下创建,而且我无法想象我是否可以让它们实例化。所以我决定在每次 onCreate 时重新创建它们(这很糟糕,但我想要一些东西可以工作)并保存 UI 数据只是为了将它传递回 fragment 。

这是其中一个 fragment ,其他2个相同:

public class LocationFragment extends SherlockFragment {

private View myView;
private CheckBox myCheckBok;

@Override
public void onCreate(Bundle savedInstanceState) {
setRetainInstance(true);
Log.d("LocationFragment", "onCreate running");
super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.d("LocationFragment", "onCreateView running");

myView = inflater.inflate(R.layout.map_fragment, container, false);
myCheckBok = (CheckBox) myView.findViewById(R.id.mapFragmentCheckBox);

if(savedInstanceState != null){
myCheckBok.setChecked(savedInstanceState.getBoolean("isChecked"));
}

return myView;

}

@Override
public void onResume()
{
Log.d("LocationFragment", "onResume running");
super.onResume();
}

@Override
public void onPause() {

Log.d("LocationFragment", "onPause running");

super.onPause();

}

@Override
public void onSaveInstanceState(Bundle outState) {
boolean isChecked = myCheckBok.isChecked();
outState.putBoolean("isChecked", isChecked);

Log.d("LocationFragment", "onSaved Instant running");

super.onSaveInstanceState(outState);
}

我正在保存复选框的状态,当我通过图标时,复选框状态被保存,并且还通过方向改变。但是,当我改变方向,按下另一个图标(或按下同一个图标)并返回到我的 fragment 时,状态不会被保存。我意识到这是由于当我更改为另一个 fragment 时 onSavedInstanceState 没有运行(因此没有保存或传递复选框数据)造成的。

关于如何从 fragment 中正确保存 UI 数据(只是通过 savedInstanceState 并没有为我的目的削减它)或如何在更改它们的同时管理多个 fragment 实例化,我没有在任何地方找到答案。我知道每次我改变一个 fragment ,都是数据由系统自动保存,但似乎无法使其正常工作。

请帮忙。

最佳答案

这不是问题的一部分,但您应该知道 saving a View 不需要使用 onSaveInstanceState状态。只要 View 有一个 ID,Android 就已经为您完成了。

您面临的问题似乎是您没有从它们的 FragmentManager 中恢复 fragment 。 fragment 在那里,但您根本没有去 FragmentManager 并在 onCreate 再次发生后将它们带走。

此代码应放在 onCreate 中:

    // Try and fetch the fragments from the manager
locationFragement = fragmentManager.findFragmentByTag(LOCATION_FRAGMENT_TAG);
homeFragment = fragmentManager.findFragmentByTag(HOME_FRAGMENT_TAG);
settingsFragment = fragmentManager.findFragmentByTag(SETTINGS_FRAGMENT_TAG);

// If the fragment weren't found - meaning it's the first time the activity was
// started, create them
if (locationFragement == null) locationFragement = new LocationFragment();
if (homeFragment == null) homeFragment = new HomeFragment();
if (settingsFragment == null) settingsFragment = new SettingsFragment();

并且,无论何时添加/删除/替换 fragment ,请确保使用 TAG 添加他,即

    // EXAMPLE HOW TO USE A REPLACE WITH A TAG
getSupportFragmentManager().beginTransaction().replace(android.R.id.content,
locationFragement, LOCATION_FRAGMENT_TAG);

这样行吗?

关于android - 无法通过更改方向或保存 fragment UI 使 fragment 保持 Activity 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com