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