我们在写项目的时候,一般都会用到fragment来显示多个页面,并且每个页面的功能可能都不尽相同,这样每个标题栏的菜单选项都会不太一样,所以我们就需要在不同的页面中显示不同的菜单选项,这就要求标题栏中menu的每个item选项要能够根据不同的页面显示或者隐藏,本文就着重解决这个问题。
先来看一下最终的显示效果
主页有三个页面选项
新闻页面,menu什么都没有
图片页面,同样menu啥都没有
视频页面,可以看到,多出了一个搜索菜单
现在能看到共有三个fragment页面,分别是新闻、图片和视频,现在我们需要让前两个页面的菜单项什么都不显示,在第三个页面显示一个搜索菜单,用于搜索视频,这里的标题栏我用的是toolbar,关于toolbar的用法及好处这里不再多说,网上有很多。先看一下activity页面的代码
package com.zmt.e_read.Activity;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import com.zmt.e_read.Fragment.ImageFragment;
import com.zmt.e_read.Fragment.NewsFragment;
import com.zmt.e_read.Fragment.VideoFragment;
import com.zmt.e_read.R;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
@BindView(R.id.drawerLayout)
DrawerLayout drawerLayout;
@BindView(R.id.navigationView)
NavigationView navigationView;
@BindView(R.id.coordinatorLayout)
CoordinatorLayout coordinatorLayout;
@BindView(R.id.title) TextView title;
@BindView(R.id.toolbar) Toolbar toolbar;
private FragmentManager fragmentManager;
private NewsFragment newsFragment;
private ImageFragment imageFragment;
private VideoFragment videoFragment;
private MenuItem menuItem;
private long exitTime = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
accessPermission();
}
public void initViews(){
ButterKnife.bind(this);
toolbar.setTitle("");
setSupportActionBar(toolbar);
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, 0, 0);
drawerToggle.syncState();
drawerLayout.addDrawerListener(drawerToggle);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_news:
fragmentManager.beginTransaction().replace(R.id.content_frame, newsFragment).commit();
menuItem.setVisible(false);
title.setText(getString(R.string.news));
break;
case R.id.nav_photo:
fragmentManager.beginTransaction().replace(R.id.content_frame, imageFragment).commit();
title.setText(getString(R.string.photo));
menuItem.setVisible(false);
break;
case R.id.nav_video:
fragmentManager.beginTransaction().replace(R.id.content_frame, videoFragment).commit();
title.setText(getString(R.string.video));
menuItem.setVisible(true);
break;
}
drawerLayout.closeDrawers();
return false;
}
});
newsFragment = new NewsFragment();
imageFragment = new ImageFragment();
videoFragment = new VideoFragment();
fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().add(R.id.content_frame, newsFragment).commit();
}
public void accessPermission(){
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode){
case 1 :
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
/**
* 授予权限
*/
} else {
/**
* 拒绝授予
*/
}
break;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
if(drawerLayout.isDrawerOpen(GravityCompat.START)){
drawerLayout.closeDrawer(GravityCompat.START);
} else {
if(System.currentTimeMillis() - exitTime > 2000){
exitTime = System.currentTimeMillis();
Snackbar.make(coordinatorLayout, "再按一次退出程序", Snackbar.LENGTH_SHORT).show();
} else {
finish();
}
}
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.toolbar, menu);
menuItem = menu.findItem(R.id.search);
menuItem.setVisible(false);
return true;
}
@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();
//noinspection SimplifiableIfStatement
switch (id){
case R.id.search :
Intent intent = new Intent(this, SearchActivity.class);
startActivity(intent);
break;
}
return super.onOptionsItemSelected(item);
}
}
代码其实很好理解,主要是一个toolbar结合drawerlayout的侧边栏,然后是一个权限的动态申请,针对6.0系统之后做的一个必要处理,我们主要来看下这段
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.toolbar, menu);
menuItem = menu.findItem(R.id.search);
menuItem.setVisible(false);
return true;
}
在引入菜单menu后,把我们需要的每个menuItem分别初始化一下,这里只用到了一个,然后再给它一个显示状态,也就是是否在第一个页面显示,这里设置了false,不显示,然后我们继续看这段
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_news:
fragmentManager.beginTransaction().replace(R.id.content_frame, newsFragment).commit();
title.setText(getString(R.string.news));
menuItem.setVisible(false);
break;
case R.id.nav_photo:
fragmentManager.beginTransaction().replace(R.id.content_frame, imageFragment).commit();
title.setText(getString(R.string.photo));
menuItem.setVisible(false);
break;
case R.id.nav_video:
fragmentManager.beginTransaction().replace(R.id.content_frame, videoFragment).commit();
title.setText(getString(R.string.video));
menuItem.setVisible(true);
break;
}
drawerLayout.closeDrawers();
return false;
}
});
navigationView来显示侧边栏中的菜单列表,同时监听菜单点击,之后切换frgment,设置toolbar标题,然后把要显示的menuItem进行显示或隐藏操作,这里让第一个和第二个页面不显示,最后一个页面显示进行搜索操作,这样我们就能够在每一个fragment中随意的显示和隐藏菜单啦啦啦啦~~~
~~~end~~~