6

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); 
} 

}

Antwort

2

ich vor kurzem dieses Problem auch auftreten. Ich habe es angesprochen, indem ich die Methode onRetainCustomNonConfigurationInstance für die Aktivität überschrieben habe.

@Override 
public Object onRetainCustomNonConfigurationInstance() { 
    // return true so that onCreate will know it is an orientation change 
    return true; 
} 

In meinem onCreate war ich dann in der Lage folgendes zu implementieren:

... 
Object lastCustomNonConfigurationInstance = getLastCustomNonConfigurationInstance(); 
if (lastCustomNonConfigurationInstance != null) { 
    mIsOrientationChange = (Boolean) getLastCustomNonConfigurationInstance(); 
} 
... 

Schließlich ich onNavigationItemSelected aktualisiert, so dass es über mIsOrientationChange

@Override 
public boolean onNavigationItemSelected(int position, long id) { 
    if (!mIsOrientationChange) { 
     // real navigation selected logic   
    } 

    mIsOrientationChange= false; 

    return true; 
} 

bearbeiten wusste: Ich habe die Idee zu Implementieren Sie dies aus dem folgenden Android Developer-Artikel: http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject

+0

Hallo, was ich tatsächlich getan habe, bestand darin, den Index des Artikels in der Dropdown-Liste in der gespeicherten Instanz – urSus

+0

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. –

+0

Dadurch wird das falsche Fragment im Dropdown-Menü auf der Aktionsleiste angezeigt. – howettl