ActionBar Drop Down navegación – el cambio de orientación pone fragmento incorrecto en

Tengo una navegación desplegable de la barra de acción. El problema es cuando cambio a un fragmento diferente, luego hago un cambio de orientación, pone el primer fragmento dentro de todos modos, aunque creo que estoy entregando savedInstanceState correctamente. El problema parece ser que onNavigationItemSelected se llama, así que .. ¿cómo manejaría correctamente esto? Podría hacer que la variable savedInstanceState sea un campo, pero eso se siente mal …

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

}

One Solution collect form web for “ActionBar Drop Down navegación – el cambio de orientación pone fragmento incorrecto en”

Recientemente he encontrado este problema también. Lo solucioné anulando el método onRetainCustomNonConfigurationInstance en la actividad.

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

En mi onCreate fui capaz de implementar lo siguiente:

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

Por último, actualizé onNavigationItemSelected para que supiera sobre mIsOrientationChange

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

Edit: Tengo la idea de implementar esto desde el siguiente artículo para desarrolladores de Android: http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject

  • ¿Qué ocurre con mi técnica de monitorización de sensores?
  • Tableta Android con vídeo incorporado pierde video en rotación
  • RecyclerView no se refresca después de girar el dispositivo con un DialogFragment abierto
  • ViewPager con diferentes adaptadores para retrato y paisaje
  • Android: Manejo eficiente de la rotación de la pantalla
  • Segunda instancia de actividad después del cambio de orientación
  • Cómo dejar de cambiar la orientación cuando una barra de progreso está girando en android
  • Solicitud de permiso duplicada después del cambio de orientación
  • Android PhotoView Mantenga el zoom después del cambio de orientación
  • Modo de orientación horizontal y vertical
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.