tutorial item example create bar activity actionbar android drop-down-menu navigation android-actionbar orientation-changes

android - item - Navegación desplegable de ActionBar: el cambio de orientación coloca el fragmento incorrecto en



create toolbar menu android (1)

Recientemente me encontré con este problema también. Lo aborde 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 , pude implementar lo siguiente:

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

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

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

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

Tengo una navegación desplegable en la barra de acciones. El problema es cuando cambio a un fragmento diferente, luego hago un cambio de orientación, de todos modos coloca el primer fragmento, aunque creo que estoy entregando savedInstanceState correctamente. El problema parece ser que se llama a onNavigationItemSelected, así que ... ¿cómo manejaría esto correctamente? Podría hacer que la variable savedInstanceState fuera un campo, pero eso parece estar 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); }

}