不废话,直接上效果图:
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;
}
}
由于代码是从项目截取部分出来,所以只给出了关键代码,千万不要照着复制,因为里面调用了很多其他地方的类(到时候可替换成自己的实现),自己把关键思想搞明白即可