方向干扰导航抽屉

时间:2013-08-29 10:30:38

标签: android android-fragments android-orientation navigation-drawer android-configchanges

我有一个使用NavigationDrawer的应用程序。

我切换这样的片段:

private class DrawerItemClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            selectItem(position);
        }
    }

public void selectItem(int position) { 

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();
        String fragmentTag = String.valueOf(position);

        FragmentBase fragment = (FragmentBase) fragmentManager
                .findFragmentByTag(fragmentTag);
        if (null == fragment) { 
            fragment = createFragmentByPosition(position);
        }
        if (null == fragment)
            return;

        if (fragment.isAdded()) {
            fragmentTransaction.show(fragment);
        } else {
            fragmentTransaction.add(R.id.content_frame, fragment, fragmentTag); 
        }

        if (mCurrentFragment != null) {
            fragmentTransaction.hide(mCurrentFragment);
        }
        mCurrentFragment = fragment;
        fragmentTransaction.commitAllowingStateLoss();

        mDrawerList.setItemChecked(position, true);
        setTitle(mNoterActivities[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    }

    private FragmentBase createFragmentByPosition(int position) { // FragmentBase just extends Fragment
        FragmentBase fragment = null;

        if (position == 0) {
            fragment = new Fragment1();
            Bundle args = new Bundle();
            fragment.setArguments(args);

        } else if (position == 1) { // Reminder
            fragment = new Fragment2();
            Bundle args = new Bundle();
            fragment.setArguments(args);

        }

        return fragment;
    }

在onCreate()方法中,我执行selectItem(0)。

我以前使用android:configChanges="keyboardHidden|orientation|screenSize"作为Activity,但我现在想开始为不同的屏幕尺寸和方向创建不同的布局。如果此代码在清单中,我无法使用适当命名的文件夹。

所以,我决定把它删除(我记不起为什么我还是要它!)。但是,通过执行此操作,无论何时方向更改,显示的片段仍然相同,但操作栏更改为另一个片段配置(我认为之前显示的片段),如果我然后尝试切换片段,操作栏更改(我认为也是之前显示的片段),但显示的片段不会改变。

的作用是什么:

.add更改为.replace

2 个答案:

答案 0 :(得分:3)

当某些配置发生更改(例如方向)时,应用程序将重新启动,视图将重新创建,onCreate将被调用。

重新创建视图时,ActionBar将转向原始状态。

但是,如果您向android:configChanges="keyboardHidden|orientation|screenSize"添加Manifest.xml,则会调用onConfigurationChanged而不是onCreate,视图将不会重新创建。

UPDATE1

你应该保留android:configChanges =“keyboardHidden | orientation | screenSize”,然后在屏幕尺寸和方向发生变化后更改布局,方法是:onConfigurationChanged

以下是一些示例:Handling Runtime Changes

答案 1 :(得分:-1)

如果您不想对ScreenSize产生影响,那么您只能删除它。但是,如果你删除其他参数,如方向和键盘,那么只需在方向发生时加载整个布局。

所以我建议,只需使用如下内容:

android:configChanges="keyboard|orientation"

你将得到片段保持选中状态,布局不会更新。

如果没有帮助,请尝试告诉我。