Navigation Drawer Activity

1 Navigation Drawer Activity是什么?

硬翻译出来就是导航抽屉Activity,不过翻译出来的意思大概也就是它相应的作用了。
Navigation Drawer是在 Material Design 中推出的一种侧滑导航菜单栏控件。包含两个部分,一部分是侧滑(DrawerLayout),一部分是导航菜单栏(NavigationView)。

1.1 DrawerLayout(抽屉布局)

DrawerLayout布局中,由两部分组成,一部分是内容布局,一部分是侧滑菜单布局。其中侧滑菜单布局通过设置 android:layout_gravity 属性,来控制是左侧滑,还是右侧滑。

右抽屉
<!-- 右抽屉,因为设置了android:layout_gravity="end" -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:gravity="center"
        android:background="@android:color/white"
        android:text="右抽屉"/>
左抽屉
<!-- 左抽屉,因为设置了android:layout_gravity="start" -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:gravity="center"
        android:background="@android:color/white"
        android:text="左抽屉"/>

1.2 Navigation(导航控件)

NavigationView是兼容包中提供用来实现导航菜单控件。使用menu资源填充数据,可以更简单高效的实现导航菜单。NavigationView分为两部分,一部分是headerLayout,一部分是menu。headerLayout就是对应菜单的顶部部分,一般用来显示用户信息,menu则对应实际的菜单选项,一般配合Fragment使用,打到点击菜单切换Fragment的效果。

<android.support.design.widget.NavigationView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

2 怎么用?

activity_main.xml
<?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">
    <!-- layout_gravity控制是左侧滑还是右侧滑:start表示左侧滑,end表示右侧滑 -->

    <!--主页面的容器-->
    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- 导航视图,因为设置了android:layout_gravity="start",所以是左抽屉 -->
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

    <!-- 右抽屉,因为设置了android:layout_gravity="end" -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:gravity="center"
        android:background="@android:color/white"
        android:text="右抽屉"/>

</android.support.v4.widget.DrawerLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); // 获取到Toolbar
        setSupportActionBar(toolbar); // 添加Toolbar
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); // 获取“浮动按钮”FloatingActionButton
        fab.setOnClickListener(new View.OnClickListener() { //设置“浮动按钮”的监听
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); // 获取“抽屉”DrawerLayout
        /**
         * 创建一个“抽屉”的“开关”ActionBarDrawerToggle到“抽屉”中
         * 参数:1.上下文,2.抽屉,3.工具栏toolbar,4.
         */
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle); //设置Drawer设置开关的监听
        toggle.syncState(); //同步状态“开关状态”,这里实现了toolbar和Drawer的联动

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); // 获取“导航视图”NavigationView
        navigationView.setNavigationItemSelectedListener(this); //设置导航视图中Item的监听
    }

    /**
     * 手机回退键被按下之后调用
     */
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    /**
     * 创建Toolbar菜单时调用
     * @param menu 菜单的引用
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu); //创建菜单
        return true;
    }

    /**
     * 菜单Item被选择时调用
     * @param item 被选择的菜单Item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId(); //获取选项ID

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * MainActivity实现的“导航”Navigation的监听
     * @param item “导航”Navigation的Item
     * @return
     */
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START); //关闭“抽屉”
        return true;
    }
}

3 用在哪里?

一般用于进行“应用的导航”,是一种除了Button Navigation Activity布局方式以外使用得更频繁的布局方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值