Ich habe eine Aktionsleiste Dropdown-Navigation. Das Problem ist, wenn ich zu einem anderen Fragment wechsle, dann eine Orientierungsänderung mache, es bringt das erste Fragment trotzdem hinein, obwohl ich denke, dass ich savedInstanceState korrekt übergebe. Das Problem scheint zu sein, dass onNavigationItemSelected aufgerufen wird, also .. wie würde ich das richtig handhaben? Ich konnte die savedInstanceState Variable ein Feld machen, aber das fühlt sich einfach falsch ...ActionBar Drop Down Navigation - Orientierungsänderung setzt falsches Fragment in
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);
}
}
Hallo, was ich tatsächlich getan habe, bestand darin, den Index des Artikels in der Dropdown-Liste in der gespeicherten Instanz – urSus
beibehalten Ich tat dies auch (tatsächlich habe ich den Index als SharedPreference gespeichert, so dass es beim Starten der App verwendet werden könnte, wenn es wurde zu einem späteren Zeitpunkt geöffnet, als es nicht mehr im Speicher lief). Das Problem, dem ich gegenüberstand, ist etwas anders, da das sichtbare Fragment ein weiteres Kindfragment auslösen könnte. Bei der Rotation würde es dann zurück zum Elternfragment anstelle des Kindes gehen, der obige Code erlaubte mir, dieses zweite Problem zu umgehen. –
Dadurch wird das falsche Fragment im Dropdown-Menü auf der Aktionsleiste angezeigt. – howettl