アクションバーのドロップダウンナビゲーションがあります。問題は、別のフラグメントに切り替えた後に方向変更を行うと、たとえ私がsavedInstanceStateを正しく渡しているとは思っても、最初のフラグメントを内側に置くことになります。問題は、onNavigationItemSelectedが呼び出されるように思われるので、どうすればこの問題を正しく処理できますか?私はsavedInstanceState変数フィールド作ることができますが、それは単に間違っている感じ...ActionBarドロップダウンナビゲーション - 方向変更によって間違ったフラグメントが挿入される
public class MainActivity extends FragmentActivity implements MyListFragment.OnArticleSelectedListener {
public static final String TAG = "MainActivity";
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null) {
Fragment savedFragment = getSupportFragmentManager().getFragment(savedInstanceState, "saved_fragment");
Log.d(MainActivity.TAG, "savedInstanceState != null: " + savedFragment.getTag());
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, savedFragment, savedFragment.getTag())
.commit();
} else {
Log.d(MainActivity.TAG, "savedInstanceState == null");
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new MyListFragment(), MyListFragment.TAG)
.commit();
}
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
String[] array = new String[] { "Inzeráty", "Dummy frag" };
SpinnerAdapter mSpinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item,
array);
actionBar.setListNavigationCallbacks(mSpinnerAdapter, new ActionBar.OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
Log.d(MainActivity.TAG, "onNavitagionItemSelected");
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
switch(itemPosition) {
case 0:
transaction.replace(R.id.fragment_container, new MyListFragment(), MyListFragment.TAG);
break;
case 1:
transaction.replace(R.id.fragment_container, new MyDummyFragment(), MyDummyFragment.TAG);
break;
}
transaction.commit();
return true;
}
});
}
@Override
public void onArticleSelected(Bundle bundle) {
Log.d(MainActivity.TAG, "MainActivity # onArticleSelected");
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtras(bundle);
startActivity(intent);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
Log.d(MainActivity.TAG, "MainActivity # onSaveInstanceState: " + currentFragment.getTag());
getSupportFragmentManager().putFragment(outState, "saved_fragment", currentFragment);
super.onSaveInstanceState(outState);
}
を}
こんにちは、私が実際にやったことは、savedinstanceのドロップダウンで選択された項目のインデックスを維持していたことです。 – urSus
これもやっていました(実際にはSharedPreferenceとしてインデックスを保存していました後でメモリに記憶されていないときに開かれた)。私が直面していた問題は、目に見えるフラグメントが別の子フラグメントを開始する可能性がある点で少し異なります。回転すると、それは子供の代わりに親フラグメントに戻ります。上記のコードでは、その2番目の問題を回避することができました。 –
これにより、アクションバーのドロップダウンメニューに誤ったフラグメントが表示されます。 – howettl