android 通用Toolbar(Activtiy/Fragment)

一、基于Activity

在的其他Activity只要继承于这个BaseActivity,实现抽象方法会实现返回操作,可以根据自己的需求把initBaseView里面的设置title和回退按钮的逻辑分离出来,比较更加通用一些。

public abstract class BaseActivity extends AppCompatActivity {

    
  /**
     * 输入toolbar的id,和文本内容    
     */
   public void initBaseView(int id,String title)
   {
       Toolbar  commonToolBar =  (Toolbar)findViewById(id);
       TextView commonTitle=(TextView)findViewById(R.id.setting_title);
       commonTitle.setText(title);
       setSupportActionBar(commonToolBar);
       setBackArrow();
   }

    /**
     * 设置左上角back按钮
     */
    public void setBackArrow() {

        final Drawable upArrow = getResources().getDrawable(R.drawable.icon_back_left);
        //给ToolBar设置左侧的图标
        getSupportActionBar().setHomeAsUpIndicator(upArrow);
        // 给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        //设置actionBar的标题是否显示,对应ActionBar.DISPLAY_SHOW_TITLE。
        getSupportActionBar().setDisplayShowTitleEnabled(false);
    }


    /**
     * 点击左上角的返回按钮,结束本Activity
     * home就是左上角的小箭头,在toolbar上
     *
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (item.getItemId() == android.R.id.home) {
            basefinish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 抽象方法,用于结束activity
     */
    public abstract void basefinish();

  
    @Override
    public void onBackPressed() {

        basefinish();
    }

}

二、基于Fragment

这个需要注意的是onViewCreated里面进行了相关初始化,在继承这个BaseFragment 的子类想要调用方法必须onViewCreated或者这个方法之后,这个方法在Fragment的生命周期中是onCreateView之后执行做相关的初始化操作

public class BaseFragment extends Fragment {
    /**
     * 通用的ToolBar标题
     */
    private TextView commonTitle;
    /**
     * 通用的ToolBar
     */
    private Toolbar commonToolBar;

    public  Activity mActivity;
    private AppCompatActivity mAppCompatActivity;

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mActivity = getActivity();
        mAppCompatActivity=(AppCompatActivity)mActivity;
   }

    public void initBaseView(View view,int id,String title)
    {
        commonToolBar = (Toolbar)view.findViewById(id);
        commonTitle=(TextView)view.findViewById(R.id.setting_title);
        mAppCompatActivity.setSupportActionBar(commonToolBar);
        commonTitle.setText(title);
        setBackArrow();
    }


    /**
     * 设置左上角back按钮
     */
    public void setBackArrow() {

        final Drawable upArrow = getResources().getDrawable(R.drawable.icon_back_left);
        //给ToolBar设置左侧的图标
        mAppCompatActivity.getSupportActionBar().setHomeAsUpIndicator(upArrow);
        // 给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
        mAppCompatActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        //设置actionBar的标题是否显示,对应ActionBar.DISPLAY_SHOW_TITLE。
        mAppCompatActivity.getSupportActionBar().setDisplayShowTitleEnabled(false);
    }

}

还需要注意的就是菜单按钮的创建和Activity不同:

Activity是需要返回值的 public boolean onOptionsItemSelected(MenuItem item) 方法,

Fragment是需要提前设置setHasOptionsMenu(true),同时是 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 一个void方法。

三、改善版Fragment

上面的菜单(menu)获取在跳转过程中会出现显示不全的问题见(Android Fragment 使用的坑),下面舍弃采用初始默认的左上角后退图片的功能。


public class BaseFragment extends Fragment implements View.OnClickListener {
    /**
     * 通用的ToolBar标题
     */
   public TextView commonTitle;

    /**
     * 通用的ToolBar后退
     */
    public Button btnBack;
    /**
     * 通用的ToolBar
     */
    public Toolbar commonToolBar;

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
   }

    /**
     * 显示toolbar和title
     */
    public void initBaseView(View view,int id,String title)
    {
         commonToolBar = (Toolbar)view.findViewById(R.id.setting_toolbar);
         commonToolBar.setNavigationIcon(R.drawable.icon_back_left);
         commonToolBar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((BaseActivity)getActivity()).basefinish();
            }
        });

        commonTitle=(TextView)view.findViewById(R.id.setting_title);
        commonTitle.setText(title);
    }

}

菜单栏的实现,不是通用的,根据每一个fragment专门的在前期初始化生命周期内使用:

 commonToolBar.inflateMenu(R.menu.search_toolbar);
 commonToolBar.setOnMenuItemClickListener(this);

监听点击事件:

  @Override
    public boolean onMenuItemClick(MenuItem item) {
        if (item.getItemId()==R.id.history_search) {
            ((TransactionActivity) getActivity()).openSearchFragment();
            return true;
        }
        return false;
    }

或者

commonToolBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {

                    if (item.getItemId()==R.id.history_search) {
                        ((TransactionActivity) getActivity()).openSearchFragment();
                            return true;
                    }

                return false;
            }
        });

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值