Android如何通过编程改变导航抽屉面板的宽度

5

我使用了Android Studio中提供的导航抽屉模板。 在我的活动布局中,我有以下代码:

<fragment android:id="@+id/navigation_drawer"
    android:layout_width="@dimen/navigation_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:name="com.smedilepaolo.newsfeed.NavigationDrawer.NavigationDrawerFragment"
    tools:layout="@layout/fragment_navigation_drawer" />

我需要通过编程方式改变面板的宽度。 我认为更改它的正确区域是这个:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news_feed);

        mNavigationDrawerFragment = (NavigationDrawerFragment)
                getFragmentManager().findFragmentById(R.id.navigation_drawer);
        mTitle = getTitle();

....

但是我不清楚如何实现我的目标。

/* 更新 */

抽屉面板的图标未显示在操作栏中。

    mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

            mDrawerListView.post(new Runnable() {
                @Override
                public void run() {
                    Resources resources = getResources();
                    float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 240, resources.getDisplayMetrics());
                    DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerListView.getLayoutParams();
                    params.width = (int) (width);
                    mDrawerListView.setLayoutParams(params);

                }
            });

            selectItem(position);
        }
    });



    mDrawerListView.post(new Runnable() {
        @Override
        public void run() {
            Resources resources = getResources();
            float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, resources.getDisplayMetrics().widthPixels-1, resources.getDisplayMetrics());
            DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerListView.getLayoutParams();
            params.width = (int) (width);
            mDrawerListView.setLayoutParams(params);
            mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            mDrawerLayout.openDrawer(mFragmentContainerView);
        }
    });

那就是selectItem方法。
    private void selectItem(int position) {
        mCurrentSelectedPosition = position;
        if (mDrawerListView != null) {
            mDrawerListView.setItemChecked(position, true);
        }
        if (mDrawerLayout != null) {
            mDrawerLayout.closeDrawer(mFragmentContainerView);
        }

....
1个回答

15

基于从导航抽屉模板生成的代码,您可以通过将此代码添加到NavigationDrawerFragment的onCreateView()方法中来更改面板的宽度。

 mDrawerListView.post(new Runnable() {
        @Override
        public void run() {
            Resources resources = getResources();
            float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, resources.getDisplayMetrics());
            DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerListView.getLayoutParams();
            params.width = (int) (width);
            mDrawerListView.setLayoutParams(params);
        }
    });
禁用DrawerLayout上的平移手势,方法如下:
// NavigationDrawerFragment
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
    mDrawerLayout = drawerLayout;
    mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}

打开/关闭DrawerLayout:

mDrawerLayout.openDrawer(mDrawerListView);
mDrawerLayout.closeDrawer(mDrawerListView);

为了防止抽屉面板的图标消失,请按以下方式更改setOnItemClickListener方法:

mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);
        }
});

将覆盖的onDrawerClose方法修改如下:

@Override
public void onDrawerClosed(View drawerView) {
    super.onDrawerClosed(drawerView);
    if (!isAdded()) {
        return;
    }

    mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

    Resources resources = getResources();
    float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 240, resources.getDisplayMetrics());
    DrawerLayout.LayoutParams params = (DrawerLayout.LayoutParams) mDrawerListView.getLayoutParams();
    params.width = (int) (width);
    mDrawerListView.setLayoutParams(params);

    getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}

非常感谢!它起作用了!我使用您的代码自动将宽度设置为最大可能值。在第一次单击项目后,我重新使用您的代码将宽度调整为240dp。但不幸的是,它删除了侧边栏左上角的抽屉菜单图标...我不知道为什么...我该如何修复?是否还可以自动打开抽屉菜单并禁用平移手势(并在第一次单击项目后重新启用)? - Usi Usi
我使用resources.getDisplayMetrics().widthPixels-1来修复图标问题,而不是使用resources.getDisplayMetrics().widthPixels! 所以我的剩下的问题现在有两个。第一个是是否可以通过编程方式打开抽屉面板并禁用手势?谢谢 :) - Usi Usi
谢谢您的回答……我已经更新了我的问题……现在只剩下一个bug……我已经尝试解决它超过一个小时了。在调整面板大小之后,抽屉面板栏的图标没有显示在操作栏中……但是如果您滑动一下它就会出现……我应该如何强制显示图标? - Usi Usi
请尝试按照我在编辑后的答案中所建议的进行代码编辑,谢谢:) - Víctor Albertos
非常感谢!它完美地运行了...但我不明白为什么会这样...你能解释一下吗?谢谢。 - Usi Usi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接