Toolbar Menu的显示与隐藏

        我们在写项目的时候,一般都会用到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~~~

项目地址:https://github.com/xiyouZmt/E-Read

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值