Android Studio导航抽屉,如Gmail应用

时间:2016-01-13 14:00:05

标签: java android design-patterns navigation-drawer

我们正在制作Android应用,我们想要添加一些东西。 这是Gmail应用程序的效果。

您可以选择要查看的帐户(应用程序的其余部分也会相应地显示)。

Example

修改

我现在已经有了一个(工作)导航栏,但我想要的是标题中的圆形图标。我希望有人能够选择他们正在查看的用户。

4 个答案:

答案 0 :(得分:25)

您可以使用com.android.support:design支持库中的NavigationView来实现您想要的效果。

您可以找到here的完整教程。您可以从该教程here下载完整的源代码。

您可以关注here's another nice tutorial

但长话短说,该视图分为两个主要部分:标题和菜单部分,以及您必须在XML上定义的每个部分。

从该教程开始:

  

标题视图

     

此视图基本上是导航的顶部   抽屉,其中包含个人资料图片,姓名和电子邮件等。您需要   要在一个单独的布局文件中定义它,我们将调查它   只是片刻。

     

菜单

     

这是您要在标题下方显示的菜单,我们定义   菜单文件夹中的菜单,就像您为溢出定义菜单一样   菜单。所以基本上NavigationView是Header View的容器   和您将在滑动抽屉中使用的菜单。所以现在   您了解NavigationView我们可以开始构建我们的   导航抽屉。

考虑到这一点,像对待任何其他布局一样构建标题。菜单的定义有点像工具栏/操作栏菜单。 e.g:

<强> navigation_menu.xml

<?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/drawer_home"
            android:checked="true"
            android:icon="@drawable/icon_home"
            android:title="@string/title_home"/>

        <item
            android:id="@+id/drawer_content"
            android:icon="@drawable/icon_content"
            android:title="@string/title_content"/>

        <item
            android:id="@+id/drawer_about"
            android:icon="@drawable/icon_about"
            android:title="@string/title_about"/>

        <item
            android:id="@+id/drawer_exit"
            android:icon="@drawable/icon_exit"
            android:title="@string/title_exit"/>

        </group>
</menu>

然后,在Activity上,您只需使用DrawerLayoutNavigationView制作类似教程中的布局。

<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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:orientation="vertical"
        >
        <include
            android:id="@+id/toolbar"
            layout="@layout/tool_bar"/>
        <FrameLayout
            android:id="@+id/frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        </FrameLayout>

    </LinearLayout>

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

您还必须为要使用此Fragments显示的每个屏幕创建一些NavigationView。完成后,在Activity上,您可以通过实施NavigationView.OnNavigationItemSelectedListener来处理选择事件,如下所示:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 
    // Your Activity
        @Override
    public boolean onNavigationItemSelected(MenuItem menuItem) {
        Fragment fragment = null;

        switch(menuItem.getItemId()) {
            case R.id.drawer_home:
                fragment = new YourFragment();
                break;
            case R.id.drawer_content:
                fragment = new AnotherFragment();
                break;
            case R.id.drawer_about:
                fragment = new AboutFragment();
                break;
            case R.id.drawer_exit:
                // TODO - Prompt to exit.
                finish();
                break;
        }

        if (fragment == null) {
            fragment = new YourFragment();
        }

        drawerLayout.closeDrawers();

        FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.container, fragment)
                    .commit();

        return true;
    }
}

对于您的编辑,图标可以由ImageView表示。要在多个配置文件之间导航,这取决于您在应用上如何实现该逻辑,但作为“通用”答案,您可以使用类似Spinner的内容切换这些配置文件。

这些教程将帮助您完成该步骤:

标题上进行设置后,请处理项目选择并相应更改用户个人资料。 (最后一部分完全取决于您如何在应用程序上实现用户配置文件)。但作为先行者,您可以查看android training site,更具体地说,this part

答案 1 :(得分:3)

您应该使用 NavigationView

  

它提供了易于实现材料导航的框架   抽屉借助菜单中的导航项目   资源。 Befor Navigation View,我们很难制作材料   导航抽屉使用listview或linearlayout与自定义适配器,   但现在我们只需要在DrawerLayout中添加导航视图,   其他一切都将由导航视图处理。

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

     <!-- Your contents -->

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

对于此要求,您可以查看样本

  1. MaterialDrawer

  2. <强> How To Make Material Design Navigation Drawer

  3. <强> Playing with NavigationView

  4. 希望这有帮助。

答案 2 :(得分:1)

我认为这MaterialDrawer正是您所寻找的。这个库有很多例子。您可以直接使用此库,也可以阅读源代码并实现自己的抽屉。

答案 3 :(得分:0)

您可以使用MaterialNavigation库实现此Material Navigation抽屉。 有关实施的文章为here

您只需要导入该库就可以了。请参阅以下网站上的演示代码:。

https://github.com/PatilShreyas/MaterialNavigationView-Android