6

我有一个操作栏下拉导航。问题是当我切换到不同的片段,然后进行方向更改时,无论如何它都会将第一个片段放入其中,即使我认为我正确地处理了 savedInstanceState 。问题似乎是 onNavigationItemSelected 被调用,所以..我将如何正确处理这个?我可以将 savedInstanceState 变量设为字段,但这感觉不对……

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

}

4

1 回答 1

2

我最近也遇到了这个问题。我通过覆盖onRetainCustomNonConfigurationInstance活动的方法来解决它。

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

在我onCreate的情况下,我能够实现以下内容:

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

最后我更新onNavigationItemSelected了,让它知道mIsOrientationChange

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

    mIsOrientationChange= false;

    return true;
}

编辑:我从以下 Android 开发人员文章中得到了实现这一点的想法:http: //developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject

于 2013-01-16T03:34:06.260 回答