【问题标题】:Android - Is Navigation Drawer from right hand side possible?Android - 可以从右侧导航抽屉吗?
【发布时间】:2013-06-13 22:15:42
【问题描述】:

http://developer.android.com/training/implementing-navigation/nav-drawer.html

根据这个文档,它没有说是否可以从右侧实现抽屉。甚至可能吗? :(

【问题讨论】:

标签: android navigation-drawer


【解决方案1】:

NavigationDrawer 可以配置为从左侧、右侧或两者拉出。关键是抽屉在 XML 声明中的出现顺序,以及 layout_gravity 属性。这是一个例子:

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:baselineAligned="false" >
    </FrameLayout>

    <!-- Left drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:choiceMode="singleChoice" />

    <!-- Right drawer -->

    <ListView
        android:id="@+id/right_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:choiceMode="singleChoice" />
</android.support.v4.widget.DrawerLayout>

【讨论】:

    【解决方案2】:

    这是抽屉上的文档,您可以将其配置为从左侧或右侧拉出。

    抽屉的定位和布局由 子视图上的 android:layout_gravity 属性对应于哪个 您希望抽屉出现的视图的一侧:左侧或右侧。 (或在支持布局方向的平台版本上开始/结束。)

    http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html

    【讨论】:

    • 为什么他们的例子在我的情况下不起作用?我的意思是,我将它设置为希伯来语,但看不到它在右侧。
    • 我将需要更多继续。你确定一切都配置正确吗?我建议发布一个新问题。
    • 我决定放手。我设法通过使用其他东西使他们的项目工作,然后我决定不使用它,因为将导航抽屉放在另一边可能会造成混淆。也许我以后会改变主意。
    • @LarryMcKenzie - 可以在右侧设置可绘制菜单吗?
    • @RoCk 我假设您正在谈论看起来像 3 条水平线的汉堡菜单图标。它不是 DrawerLayout 的组件。因此,您可以在任何可以打开导航抽屉的地方创建一个按钮。这不是推荐的模式,但您可以将图标放在菜单中,将其放置在工具栏的右侧。
    【解决方案3】:

    我的应用程序因“没有发现重力向左的抽屉视图”错误而崩溃。

    所以将这个添加到 onOptionsItemSelected 中:

    if (item != null && item.getItemId() == android.R.id.home) {
            if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
                mDrawerLayout.closeDrawer(Gravity.RIGHT);
            } else {
                mDrawerLayout.openDrawer(Gravity.RIGHT);
            }
        }
    

    【讨论】:

      【解决方案4】:

      添加到https://stackoverflow.com/a/21781710/437039 解决方案。

      如果您使用的是由 Android Studio 创建的 Navigation Drawer 项目,那么onOptionsItemSelected 中的内容将会发生变化。由于他们创建了子类,因此您必须使用此代码

      if (item != null && id == android.R.id.home) {
              if (mNavigationDrawerFragment.isDrawerOpen(Gravity.RIGHT)) {
                  mNavigationDrawerFragment.closeDrawer(Gravity.RIGHT);
              } else {
                  mNavigationDrawerFragment.openDrawer(Gravity.RIGHT);
              }
              return true;
      }
      

      接下来。在NavigationDrawerFragment 类中,你必须创建 3 个方法:

      方法一

      public boolean isDrawerOpen(int gravity) {
          return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(gravity);
      }
      

      方法二

      public void closeDrawer(int gravity) {
          mDrawerLayout.closeDrawer(gravity);
      }
      

      方法三

      public void openDrawer(int gravity) {
          mDrawerLayout.openDrawer(gravity);
      }
      

      只有现在,右侧的抽屉才会起作用。

      【讨论】:

        【解决方案5】:

        您可以使用 Material design 中的NavigationView。例如:

        <?xml version="1.0" encoding="utf-8"?>
        <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            tools:openDrawer="start">
        
            <include
                layout="@layout/app_bar_main"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        
            <android.support.design.widget.NavigationView
                android:id="@+id/nav_view"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="end"
                android:fitsSystemWindows="true"
                app:headerLayout="@layout/nav_header_main"
                app:menu="@menu/activity_main_drawer" />
        
        </android.support.v4.widget.DrawerLayout>
        

        【讨论】:

          【解决方案6】:

          我知道这是一个老问题,但对于那些仍在寻找答案的人来说:

          是的,这是可能的。请在下面的链接中查看我的答案:

          https://stackoverflow.com/a/19358114/1572408

          【讨论】:

            【解决方案7】:

            然后使用这些代码@amal 我认为这会对您有所帮助。 XML:

            <!-- Framelayout to display Fragments -->
            
            <FrameLayout
                android:id="@+id/frame_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >
            
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="48dp"
                    android:background="@drawable/counter_bg" >
            
                    <ImageView
                        android:id="@+id/iconl"
                        android:layout_width="25dp"
                        android:layout_height="wrap_content"
                        android:layout_gravity="left"
                        android:layout_marginLeft="12dp"
                        android:layout_marginRight="12dp"
                        android:src="@drawable/ic_launcher" />
            
                    <ImageView
                        android:id="@+id/iconr"
                        android:layout_width="25dp"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:layout_alignParentTop="true"
                        android:layout_marginRight="17dp"
                        android:src="@drawable/ic_launcher" />
                </RelativeLayout>
            </FrameLayout>
            
            <!-- Listview to display slider menu -->
            
            <ListView
                android:id="@+id/list_slidermenu"
                android:layout_width="240dp"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:background="@color/list_background"
                android:choiceMode="singleChoice"
                android:divider="@color/list_divider"
                android:dividerHeight="1dp"
                android:listSelector="@drawable/list_selector" />
            
            <ListView
                android:id="@+id/list_slidermenu2"
                android:layout_width="240dp"
                android:layout_height="match_parent"
                android:layout_gravity="end"
                android:background="@color/list_background"
                android:choiceMode="singleChoice"
                android:divider="@color/list_divider"
                android:dividerHeight="1dp"
                android:listSelector="@drawable/list_selector" />
            

            //设置需要的图片

            活动代码:

            ImageView iconl,iconr;
            
            private DrawerLayout mDrawerLayout;
            private ListView mDrawerList,mDrawerList2;
            
            ImageView iconl,iconr;
            
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
            
                iconl = (ImageView)findViewById(R.id.iconl);
                iconr = (ImageView)findViewById(R.id.iconr);
            
                mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
                mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
                mDrawerList2 = (ListView) findViewById(R.id.list_slidermenu2);
                mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
                mDrawerList2.setOnItemClickListener(new SlideMenuClickListener());
                iconl.setOnClickListener(new OnClickListener() {
            
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mDrawerLayout.openDrawer(Gravity.START);
                        mDrawerLayout.closeDrawer(Gravity.END);
                    }
                });
                iconr.setOnClickListener(new OnClickListener() {
            
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mDrawerLayout.openDrawer(Gravity.END);
                        mDrawerLayout.closeDrawer(Gravity.START);
                    }
                });
            }
            }
            

            在这里您可以为两个列表设置自己的列表适配器,并在项目上单击调用 displayView(position);您可以将片段添加到框架布局的方法。

            /**
             * Diplaying fragment view for selected nav drawer list item
             * */
            private void displayView(int position) {
                // update the main content by replacing fragments
                Fragment fragment = null;
                switch (position) {
                case 0:
                    fragment = new HomeFragment();
                    break;
            
            
                default:
                    break;
                }
            
                if (fragment != null) 
                {
                    FragmentManager fragmentManager = getFragmentManager();
                    fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();
            
                    // update selected item and title, then close the drawer
                    mDrawerList.setItemChecked(position, true);
                    mDrawerList.setSelection(position);
            
                    mDrawerLayout.closeDrawer(mDrawerList);
                } else {
                    // error in creating fragment
                    Log.e("MainActivity", "Error in creating fragment");
                }
            }
            

            【讨论】:

              【解决方案8】:

              要从屏幕右侧设置导航抽屉,请将抽屉布局设置为导航视图的父级,并将导航视图的布局重力设置为右侧。

              【讨论】:

                【解决方案9】:

                将此代码写入您的 Main.java 中,im1 是 xml 文件右上角的导航栏图标。

                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_home);
                    im1=findViewById(R.id.humburgericon);
                    im1.setOnClickListener(new View.OnClickListener() {
                        @SuppressLint("WrongConstant")
                        @Override
                        public void onClick(View v) {
                              drawerLayout.openDrawer(Gravity.END);});
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-09-28
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多