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

Implementing Navigation Drawer Without TitleBar

我打算实现一个导航栏,让用户导航到不同的活动。 但问题来了, 我找到了很多关于创建导航抽屉的文章,但它似乎对我不起作用,因为我的 UI 没有任何标题栏。 而我真正想要的是每当用户按下导航抽屉附近的按钮时调用导航抽屉。

有什么方法可以做到这一点吗?

是的,您可以在 ActionBar 的情况下实现 DrawerLayout。您可以手动打开和关闭 DrawerLayout like

    drawerLayout.openDrawer(Gravity.LEFT);

    drawerLayout.closeDrawer(Gravity.LEFT);

很简单

这是您的主要 activity 布局,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 文件位于 menu 目录下的 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"
  • 抽屉可以从屏幕边缘通过类似投掷的动作打开。为防止用户这样做,您可能希望 lock/unlock 使用 drawerLayout.setDrawerLockMode(...); 对您的抽屉进行操作,请参阅 documentation for details

另请注意,为了使用 NavigationView,您需要最新的设计支持库,方法是将依赖项添加到模块的 gradle 文件:compile 'com.android.support:design:22.2.0'。 查看更多相关信息 here