6

アクションバーのドロップダウンナビゲーションがあります。問題は、別のフラグメントに切り替えた後に方向変更を行うと、たとえ私がsavedInstanceStateを正しく渡しているとは思っても、最初のフラグメントを内側に置くことになります。問題は、onNavigationItemSelectedが呼び出されるように思われるので、どうすればこの問題を正しく処理できますか?私はsavedInstanceState変数フィールド作ることができますが、それは単に間違っている感じ...ActionBarドロップダウンナビゲーション - 方向変更によって間違ったフラグメントが挿入される

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

を}

答えて

2

私は最近、同様にこの問題が発生しました。私はアクティビティのonRetainCustomNonConfigurationInstanceメソッドをオーバーライドすることでそれに対処しました。

私は、次を実装することができた私の onCreate
@Override 
public Object onRetainCustomNonConfigurationInstance() { 
    // return true so that onCreate will know it is an orientation change 
    return true; 
} 

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

それはおよそmIsOrientationChange

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

    mIsOrientationChange= false; 

    return true; 
} 

編集]を知っていたように、最後に私はonNavigationItemSelectedを更新:私はにアイデアを得ました次のAndroidデベロッパーの記事から実装してください:http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject

+0

こんにちは、私が実際にやったことは、savedinstanceのドロップダウンで選択された項目のインデックスを維持していたことです。 – urSus

+0

これもやっていました(実際にはSharedPreferenceとしてインデックスを保存していました後でメモリに記憶されていないときに開かれた)。私が直面していた問題は、目に見えるフラグメントが別の子フラグメントを開始する可能性がある点で少し異なります。回転すると、それは子供の代わりに親フラグメントに戻ります。上記のコードでは、その2番目の問題を回避することができました。 –

+0

これにより、アクションバーのドロップダウンメニューに誤ったフラグメントが表示されます。 – howettl

関連する問題