SherlockActionBar を使用し、アクション バーの ActionItems を介して動的フラグメントを切り替えるアプリがあります。
問題は、フラグメントの状態とその 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;
}
まず、フラグメントの単一のインスタンスを呼び出そうとしましたが、onOptionsItemSelected スイッチ ブロックで行うたびに NullPointerExceptions に遭遇するだけでした。
fragTransaction.replace(android.R.id.content, myFragmentClassName);
フラグメントのインスタンス化が行われている間
if(savedInstanceState == null){
locationFragement = new LocationFragment();
homeFragment = new HomeFragment();
settingsFragment = new SettingsFragment();
}
フラグメントは明らかに方向の変更の下では作成されませんでした。とにかく、それらをインスタンス化したままにしておくことができませんでした。そのため、onCreate ごとにそれらを新しく作成し (これは悪いことですが、何かを機能させたいと考えていました)、UI データを保存してフラグメントに戻すことにしました。
これはフラグメントの 1 つで、他の 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);
}
チェックボックスの状態を保存しています。アイコンを通過すると、チェックボックスの状態が保存され、方向の変更も行われます。しかし、向きを変えて別のアイコンを押して (または同じアイコンを押して)、フラグメントに戻ると、状態が保存されません。これは、別のフラグメントに変更したときに onSavedInstanceState が実行されていないことが原因であることに気付きました (したがって、checkBox データを保存または渡しません)。
フラグメントからUIデータを正しく保存する方法(savedInstanceStateが目的のためにそれをカットしないだけです)、または変更中にいくつかのフラグメントのインスタンス化を管理する方法についての答えはどこにも見つかりませんでした。フラグメントを変更するたびに、そのすべてのデータがシステムによって自動的に保存されることはわかっていますが、それを機能させることができないようです。
助けてください。