【问题标题】:Orientation interferes with NavigationDrawer方向干扰 NavigationDrawer
【发布时间】:2013-08-29 10:30:38
【问题描述】:

我有一个使用 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

【问题讨论】:

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


    【解决方案1】:

    当一些配置发生变化时,比如方向,应用会重启,视图会重新创建,onCreate会被调用。

    当视图重新创建时,ActionBar 会转为原始状态。

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

    更新1

    你应该保留android:configChanges="keyboardHidden|orientation|screenSize",然后在屏幕大小和方向发生变化后改变布局,方法:onConfigurationChanged

    这里有一些例子:Handling Runtime Changes

    【讨论】:

    • 所以方向改变后视图创建​​一定有问题——它试图显示错误的片段。如果在方向更改后调用 onCreate,那么即使我不在那个位置,它也会尝试调用 selectItem(0)。
    • 是的,方法onCreate会被调用,但是savedInstanceState不为null,所以selectItem(0)不会被调用。
    • 谢谢 - 我会尝试使用onConfigurationChanged
    • 我看到我在你的Activity。我在 google talk 中发送了添加为我的朋友的邀请,我认为通过它聊天会更方便。
    【解决方案2】:

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

    所以按照我的建议,只需使用以下内容:

    android:configChanges="keyboard|orientation"
    

    这样,您将让片段保持选中状态,并且布局不会更新。

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

    【讨论】:

    • 我也想改变方向的布局,所以这不能解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2012-07-17
    • 2019-06-17
    • 2015-02-12
    • 2011-04-02
    • 2020-04-01
    • 2017-08-27
    相关资源
    最近更新 更多