【问题标题】:ActionBar Drop Down navigation - orientation change puts wrong fragment inActionBar 下拉导航 - 方向更改将错误的片段放入
【发布时间】:2013-01-03 19:28:32
【问题描述】:

我有一个操作栏下拉导航。问题是当我切换到不同的片段,然后进行方向更改时,无论如何它都会将第一个片段放入其中,即使我认为我正确地处理了 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);
}

}

【问题讨论】:

    标签: android drop-down-menu navigation android-actionbar orientation-changes


    【解决方案1】:

    我最近也遇到了这个问题。我通过覆盖活动上的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

    【讨论】:

    • 嗨,我实际上最终做的是在保存的实例中保留下拉列表中选择的项目的索引
    • 我也在这样做(实际上我将索引存储为 SharedPreference 以便在启动应用程序时使用它,如果它在以后不再在内存中运行时打开)。我面临的问题有点不同,可见片段可以启动另一个子片段。在旋转时,它会回到父片段而不是子片段,上面的代码允许我解决第二个问题。
    • 这会导致在操作栏的下拉菜单中显示错误的片段。
    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多