在没有TitleBar的情况下实现导航抽屉

时间:2015-08-22 03:19:11

标签: android button navigation drawer

我计划实施导航栏,让用户导航到不同的活动。 但问题出在这里, 我发现很多关于创建导航抽屉的文章,但它似乎对我不起作用,因为我的UI没有任何标题栏。 我真正想要的是每当用户按下导航抽屉附近的按钮时调出导航抽屉。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

是的,您可以使用DrawerLayout实施ActionBar。您可以手动打开和关闭DrawerLayout之类的

    drawerLayout.openDrawer(Gravity.LEFT);

    drawerLayout.closeDrawer(Gravity.LEFT);

答案 1 :(得分:0)

这很简单。

以下是您的主要活动的布局activity_main.xml

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:fitsSystemWindows="true"
    android:layout_height="match_parent">

    <FrameLayout
        android:animateLayoutChanges="true"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        tools:ignore="MergeRootFrame" />

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_list_header"
        app:menu="@menu/navigation"/>
</android.support.v4.widget.DrawerLayout>

这是你的MainActivity

public class MainActivity extends AppCompatActivity {

    NavigationView navigationView;
    DrawerLayout drawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        navigationView = (NavigationView) findViewById(R.id.navigation_view);

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    case R.id.navi_1:
                        // on 1st item in the menu, do something
                        break;
                    case R.id.navi_2:
                        // on 2nd item in the menu, do something
                        break;
                }
                drawerLayout.closeDrawers();
                return false;
            }
        });

        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    }

    // [...]

    private void openDrawer() {
        if (!drawerLayout.isDrawerOpen(navigationView)) {
            drawerLayout.openDrawer(navigationView);
        }
    }

    private void closeDrawer() {
        if (drawerLayout.isDrawerOpen(navigationView)) {
            drawerLayout.closeDrawers();
        }
    }
}

现在,您可以使用openDrawer()打开抽屉,然后使用closeDrawer()关闭它。

示例navigation.xml文件位于 res (资源)文件夹中的菜单目录下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/navi_1"
            android:checked="true"
            android:icon="@drawable/ic_android"
            android:title="First item"/>
        <item
            android:id="@+id/navi_2"
            android:icon="@drawable/ic_android"
            android:title="Second item"/>
    </group>
</menu>

示例drawer_list_header.xml文件,位于 res 文件夹中的 layout 目录下:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list_header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scaleType="fitXY"
    android:adjustViewBounds="true"
    android:paddingBottom="8dp"
    android:src="@drawable/list_header_final">

</ImageView>

以下是一些注释:

  • 您必须为抽屉声明一个菜单文件,请参阅布局文件中的app:menu="@menu/navigation"
  • 您可能希望声明标题布局,该布局显示在抽屉中的菜单元素上,请参阅app:headerLayout="@layout/drawer_list_header"
  • 抽屉可以通过屏幕边缘的类似甩动的动作打开。为防止用户这样做,您可能希望使用drawerLayout.setDrawerLockMode(...);锁定/解锁抽屉,请参阅documentation for details

另请注意,为了使用NavigationView,您需要通过将依赖项添加到模块的gradle文件中来获得最新的设计支持lib:compile 'com.android.support:design:22.2.0'。 详细了解here