Materail Design 入门(四)——Toolbar的使用方法(2)

这一篇呢,我们就接着上一篇继续,给大家介绍下在BaseActivity中如何集成Toolbar的功能。本文主要介绍两种方法,一种是BaseActivity中不包含布局文件的,一种是BaseActivity中包含布局文件的

(一)BaseActivity中不包含布局文件

1、编写Toolbar的xml布局文件

内容详见上一篇 Materail Design 入门(四)——Toolbar的使用方法(1)

2、在需要Toolbar的地方,通过将Toolbar的布局引入
3、创建BaseActivity并初始化Toolbar,同时提供Toolbar的操作方法
public abstract class BaseToolbarActivity extends AppCompatActivity{
    private Toolbar mToolbar;
    private TextView mTitle;
    private ImageView mRightImg;
    private TextView mRightTv;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());

        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        mTitle = (TextView) findViewById(R.id.toolbar_title_layout_title);
        mRightImg = (ImageView) findViewById(R.id.toolbar_title_layout_right_iv);
        mRightTv = (TextView) findViewById(R.id.toolbar_title_layout_right_tv);
        if (mToolbar != null) {
            setSupportActionBar(mToolbar);               getSupportActionBar().setDisplayShowTitleEnabled(false);
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        /**
         * 判断是否有Toolbar,并默认显示返回按钮
         */
        if (null != getToolbar() && isShowBacking()) {
            showBack();
        }
    }

    /**
     * this Activity of tool bar.
     * 获取头部.
     *
     * @return support.v7.widget.Toolbar.
     */
    public Toolbar getToolbar() {
        return (Toolbar) findViewById(R.id.toolbar);
    }

    /**
     * 本号小于21的后退按钮图片
     */
    private void showBack() {
        //setNavigationIcon必须在setSupportActionBar(toolbar);方法后面加入
        getToolbar().setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }

    /**
     * 是否显示后退按钮,默认显示,可在子类重写该方法.
     *
     * @return
     */
    protected boolean isShowBacking() {
        return true;
    }

    public void setTitle(String title) {
        mTitle.setText(title);
    }

    public void setRightContent(boolean showRightImg, int imgId, boolean showRightTv, int
            contentId) {
        if (showRightImg) {
            mRightImg.setVisibility(View.VISIBLE);
            mRightImg.setImageResource(imgId);
        } else {
            mRightImg.setVisibility(View.GONE);
        }

        if (showRightTv) {
            mRightTv.setVisibility(View.VISIBLE);
            mRightTv.setText(getString(contentId));
        } else {
            mRightTv.setVisibility(View.GONE);
        }
    }

    public abstract int getLayoutId();
}

BaseActivity中提供了一些Toolbar的操作方法,比如返回键的响应,设置右边 图片和文字,设置标题内容等,通常情况下,我们只设置标题和右边的图片文字即可,返回键的事件 不用另做处理,如果Activity在点击back键要先进行一些判断再关闭,比如说,弹出一个对话框,提示用户是否真的要关闭当前页面,这时我们需要在BaseActivity中再添加一个重载的back方法。

(二)BaseActivity中包含布局文件

1,编写ToolBar布局文件

内容详见上一篇 Materail Design 入门(四)——Toolbar的使用方法(1)

2、初始化根布局
    private void initDecorView() {
        mDecorView = new LinearLayout(this);
        mDecorView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams
                .MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
        mDecorView.setOrientation(LinearLayout.VERTICAL);
        addToolbar();
        mContentView = new FrameLayout(this);
        mContentView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams
                .MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        mDecorView.addView(mContentView);
    }
3、重写setContentView,把子布局添加进根布局
 getLayoutInflater().inflate(layoutId, mContentView);
        super.setContentView(mDecorView);
4、Toolbar的公共方法
 public Toolbar getToolbar() {
        return mToolbar;
    }

    public void initToolbar(Toolbar toolbar) {
        //toolbar.setTitle("Toolbar");
        //toolbar.setLogo(R.mipmap.ic_launcher);
        toolbar.setNavigationIcon(R.drawable.img_back_white);
    }

代码完整版如下:

public abstract class BaseActivity extends AppCompatActivity {
    private LinearLayout mDecorView;
    private Toolbar mToolbar;
    private FrameLayout mContentView;

    /**
     * 初始化根布局
     */
    private void initDecorView() {
        mDecorView = new LinearLayout(this);
        mDecorView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams
                .MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
        mDecorView.setOrientation(LinearLayout.VERTICAL);
        addToolbar();
        mContentView = new FrameLayout(this);
        mContentView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams
                .MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        mDecorView.addView(mContentView);
    }

    /**
     * 添加Toolbar
     */
    private void addToolbar() {
        View view = getLayoutInflater().inflate(R.layout.toolbar, mDecorView);
        mToolbar = (Toolbar) view.findViewById(R.id.toolbar);
    }

    public void setContentView(int layoutId) {
        getLayoutInflater().inflate(layoutId, mContentView);
        super.setContentView(mDecorView);
    }

    public Toolbar getToolbar() {
        return mToolbar;
    }

    public void initToolbar(Toolbar toolbar) {
        //toolbar.setTitle("Toolbar");
        //toolbar.setLogo(R.mipmap.ic_launcher);
        toolbar.setNavigationIcon(R.drawable.img_back_white);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (mDecorView == null) {
            initDecorView();
        }

        //如果已经创建就先把内容清空,再添加
        if (mContentView.getChildCount() != 0) {
            mContentView.removeAllViews();
        }

        setContentView(getLayoutId());
        //布局渲染完了之后,才能setSupportActionBar
        setSupportActionBar(mToolbar);
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null){
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setDisplayShowTitleEnabled(false);
        }
        initToolbar(getToolbar());
    }

    public abstract int getLayoutId();
}

好了到此,Toolbar的用法就基本结束了,有什么疑问多多交流。
切记,这个例子中子类继承BaseActivity之后一定不能再写setContentView()了,这样会覆盖BaseActivity中的view的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值