DrawerLayout + NavigationView + BottomNavigationView 搭配使用

不废话,直接上效果图:

 

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">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include layout="@layout/toolbar"/>

        <include layout="@layout/container"/>

        <android.support.design.widget.BottomNavigationView
            android:id="@+id/bottom_navigation"
            style="@style/Widget.Design.BottomNavigationView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_gravity="bottom"
            android:background="@color/viewBackground"
            app:elevation="16dp"
            app:itemIconTint="@drawable/nav_item_color_state"
            app:itemTextColor="@drawable/nav_item_color_state"
            app:layout_behavior="com.example.administrator.funread.widget.BottomNavigationBehavior"
            app:menu="@menu/bottom_navigation_main"/>

    </android.support.design.widget.CoordinatorLayout>

    <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/nav_menu"/>

</android.support.v4.widget.DrawerLayout>

toolbar.xml

导航栏

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/AppBarLayout01"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="false"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:elevation="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>

</android.support.design.widget.AppBarLayout>

container.xml

装载新闻详情页等

<FrameLayout
    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/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/viewBackground"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:layout="@layout/fragment_news_tab"/>

nav_header_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="168dp"
    android:background="@drawable/ic_launcher_background"
    android:clickable="true"
    android:foreground="?attr/selectableItemBackground"
    android:gravity="bottom"
    android:orientation="vertical"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <!--<com.example.administrator.widget.CircleImageView-->
    <!--android:layout_width="72dp"-->
    <!--android:layout_height="72dp"-->
    <!--android:scaleType="centerCrop"-->
    <!--app:srcCompat="@color/gray"/>-->

    <!--<TextView-->
    <!--android:layout_width="wrap_content"-->
    <!--android:layout_height="wrap_content"-->
    <!--android:layout_marginLeft="4dp"-->
    <!--android:paddingTop="8dp"-->
    <!--android:text="点击头像登录 (开发中)"-->
    <!--android:textStyle="bold"/>-->
</LinearLayout>

nav_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

   <group android:id="@+id/other">
       <item
           android:id="@+id/nav_switch_night_mode"
           android:icon="@drawable/ic_night_gray_24dp"
           android:title="@string/nav_switch_night_mode"/>
       <item
           android:id="@+id/nav_setting"
           android:icon="@drawable/ic_setting_gray_24dp"
           android:title="@string/nav_setting"/>
       <item
           android:id="@+id/nav_share"
           android:icon="@drawable/ic_share_grey_24dp"
           android:title="@string/nav_share"/>
   </group>
</menu>

Main_Activity.java:

package com.example.administrator.funread;

import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.NavigationView;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.FrameLayout;

import com.example.administrator.funread.Setting.SettingActivity;
import com.example.administrator.funread.module.csdn.CSDNTabLayout;
import com.example.administrator.funread.module.news.NewsTabLayout;
import com.example.administrator.funread.module.photo.PhotoTabLayout;
import com.example.administrator.funread.module.search.SearchActivity;
import com.example.administrator.funread.module.weather.WeatherTabLayout;
import com.example.administrator.funread.util.Setting;
import com.example.administrator.funread.widget.BottomNavigationViewHelper;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{

    @BindView(R.id.toolbar)
    Toolbar mToolbar;
    @BindView(R.id.container)
    FrameLayout mContainer;
    @BindView(R.id.bottom_navigation)
    BottomNavigationView mBottomNavigation;
    @BindView(R.id.nav_view)
    NavigationView mNavView;
    @BindView(R.id.drawer_layout)
    DrawerLayout mDrawerLayout;
    private static final String TAG="MainActivity";
    private static final String POSITION="position";
    private static final String SELECT_ITEM="bottomnavigationSelectItem";
    private static final int FRAGMENT_NEWS=0;
    private static final int FRAGMENT_CSDN=1;
    private static final int FRAGMENT_WEATHER=3;
    private static final int FRAGMENT_PHOTO=2;
    private NewsTabLayout newsTabLayout;
    private CSDNTabLayout csdnTabLayout;
    private PhotoTabLayout photoTabLayout;
    private WeatherTabLayout weatherTabLayout;
    private long exitTime = 0;
    private long firstClickTime = 0;
    private int position;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initView();
    }

    private void initView(){
        mToolbar.inflateMenu(R.menu.menu_activty_main);
        BottomNavigationViewHelper.disableShiftMode(mBottomNavigation);
        setSupportActionBar(mToolbar);

        mBottomNavigation.setOnNavigationItemSelectedListener(item ->{
            switch (item.getItemId()){
                case R.id.action_news:
                    showFragement(FRAGMENT_NEWS);
                    doubleClick(FRAGMENT_NEWS);//双击刷新
                    break;
                case R.id.action_csdn:
                    showFragement(FRAGMENT_CSDN);
                    doubleClick(FRAGMENT_CSDN);
                    break;
                case R.id.action_photo:
                    showFragement(FRAGMENT_PHOTO);
                    doubleClick(FRAGMENT_PHOTO);
                    break;
                case R.id.action_weather:
                    showFragement(FRAGMENT_WEATHER);;
                    doubleClick(FRAGMENT_WEATHER);
                    break;
            }
            return true;
        } );

        //这个类提供了一种方便的方法来将DrawerLayout的功能和框架ActionBar结合起来,从而实现导航抽屉的推荐设计
        ActionBarDrawerToggle toggle=new ActionBarDrawerToggle(
                this,mDrawerLayout,mToolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close);
        mDrawerLayout.addDrawerListener(toggle);
        toggle.syncState();//将折叠项指示器或者启示项的状态与链接的DrawerLayout同步
        mNavView.setNavigationItemSelectedListener(this);
    }

    /**
     * @param index
     */
    public void doubleClick(int index){

    }

    /**
     * @param index
     */
    private void showFragement(int index){

        FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
        hideFragMent(ft);
        position=index;
        switch (index){
            case FRAGMENT_NEWS:
                mToolbar.setTitle(R.string.title_news);
                /**
                 * 如果Fragment为空,就新建一个实例
                 * 如果不为空,就将它从栈中显示出来
                 */
                if (newsTabLayout == null) {
                    newsTabLayout = NewsTabLayout.getInstance();
                    ft.add(R.id.container, newsTabLayout, NewsTabLayout.class.getName());
                } else {
                    ft.show(newsTabLayout);
                }
                break;
            case FRAGMENT_CSDN:
                mToolbar.setTitle(R.string.title_csdn);
                /**
                 * 如果Fragment为空,就新建一个实例
                 * 如果不为空,就将它从栈中显示出来
                 */
                if (csdnTabLayout == null) {
                    csdnTabLayout = CSDNTabLayout.getInstance();
                    ft.add(R.id.container, csdnTabLayout, CSDNTabLayout.class.getName());
                } else {
                    ft.show(csdnTabLayout);
                }
                break;
            case FRAGMENT_PHOTO:
                mToolbar.setTitle(R.string.title_photo);
                /**
                 * 如果Fragment为空,就新建一个实例
                 * 如果不为空,就将它从栈中显示出来
                 */
                if (photoTabLayout == null) {
                    photoTabLayout = photoTabLayout.getInstance();
                    ft.add(R.id.container, photoTabLayout, PhotoTabLayout.class.getName());
                } else {
                    ft.show(photoTabLayout);
                }
                break;
            case FRAGMENT_WEATHER:
                mToolbar.setTitle(R.string.title_weather);
                /**
                 * 如果Fragment为空,就新建一个实例
                 * 如果不为空,就将它从栈中显示出来
                 */
                if (weatherTabLayout == null) {
                    weatherTabLayout = weatherTabLayout.getInstance();
                    ft.add(R.id.container, weatherTabLayout,WeatherTabLayout.class.getName());
                } else {
                    ft.show(weatherTabLayout);
                }

        }
        ft.commit();
    }
    private void hideFragMent(FragmentTransaction ft){
        if(newsTabLayout!=null){
            ft.hide(newsTabLayout);
        }
        if(csdnTabLayout!=null){
            ft.hide(csdnTabLayout);
        }
        if(photoTabLayout!=null){
            ft.hide(photoTabLayout);
        }
        if(weatherTabLayout!=null){
            ft.hide(weatherTabLayout);
        }
    }

    /**
     * 出事菜单栏布局
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_activty_main,menu);
        return true;
    }

    /***
     * 菜单栏事件处理
     *  @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId()==R.id.action_search){
            startActivity(new Intent(MainActivity.this,SearchActivity.class));
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int id=item.getItemId();
        switch (id){
            case R.id.nav_switch_night_mode:
                int mode=getResources().getConfiguration().uiMode&Configuration.UI_MODE_NIGHT_MASK;
                if(mode==Configuration.UI_MODE_NIGHT_YES){
                    Setting.getInstance().setIsNightMode(false);
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                }else{
                    Setting.getInstance().setIsNightMode(true);
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                }
                getWindow().setWindowAnimations(R.style.WindowAnimationFadeInOut);
                recreate();
                return  false;
            case R.id.nav_setting:
                startActivity(new Intent(this,SettingActivity.class));
                mDrawerLayout.closeDrawers();
                return false;
            case R.id.nav_share:
                Intent shareIntent=new Intent()
                        .setAction(Intent.ACTION_SEND)
                        .setType("text/plain")
                        .putExtra(Intent.EXTRA_TEXT,getString(R.string.share_app_text)+getString(R.string.source_code_url));
                startActivity(Intent.createChooser(shareIntent, getString(R.string.share_to)));//活动选择器
                mDrawerLayout.closeDrawers();
                return false;

        }
        return false;
    }
}

由于代码是从项目截取部分出来,所以只给出了关键代码,千万不要照着复制,因为里面调用了很多其他地方的类(到时候可替换成自己的实现),自己把关键思想搞明白即可

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值