【问题标题】:Android changing the width of the navigation drawer panel programmaticallyAndroid以编程方式更改导航抽屉面板的宽度
【发布时间】:2014-08-30 23:36:54
【问题描述】:

我在 Android Studio 中使用了 Navigation Drawer 模板。 在我的活动布局中,我有以下代码:

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

....

【问题讨论】:

    标签: java android navigation-drawer


    【解决方案1】:

    基于从 Navigation Drawer 模板生成的代码,您可以通过将此代码添加到 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。但不幸的是,它删除了侧边栏左上角的抽屉菜单图标......我不知道为什么......我该如何解决?是否也可以自动打开抽屉菜单并禁用平移手势(并在第一次单击项目后重新启用)
    • 我使用 resources.getDisplayMetrics().widthPixels-1 而不是 resources.getDisplayMetrics().widthPixels 来修复图标问题!所以我剩下的问题现在是 2. 是否可以以编程方式打开抽屉面板并禁用平移手势?谢谢:)
    • 感谢您的回答...我已经更新了我的问题...现在只剩下一个错误...我试图解决它超过一个小时。调整面板大小后..抽屉面板栏的图标未显示在操作栏中...但是如果您滑动它会出现..如何强制显示图标?
    • 请尝试按照我在编辑后的答案中向您建议的那样编辑您的代码:)
    • 非常感谢!它工作完美......但我不明白为什么这个工作......你能解释一下吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多