精华内容
下载资源
问答
  • Toolbar封装

    2016-06-01 16:49:47
    BaseToolbar 封装
  • Toolbar是活动的标题栏,把ToolBar 封装成一个抽象Base类,可以加快开发的脚步使代码更整洁清晰。这里我附上源码,非常实用,新手必备,加快开发速度和保持项目统一风格。
  • toolbar封装

    热门讨论 2016-07-07 15:01:28
    Android 5.0的时候就用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代...一个应用的几乎所有界面都需要头部app bar,为了能够方便各个界面方便使用,统一管理,这里就来对toolBar进行简单的封装
  • ToolBar封装策略

    2020-10-13 13:42:16
    策略一: 使用原生toolbar进行封装 流程: * 1所有的类都继承此AppToolBarActivity. * 2打气筒加载一个布局到根布局(即layout_toolbar),此布局包含ToolBar+Framelayout. * 3getContentView()为抽象方法,返回一个View...

    效果:

    策略一: 使用原生toolbar进行封装

    流程:

    * 1所有的类都继承此AppToolBarActivity.
    
    * 2打气筒加载一个布局到根布局(即layout_toolbar),此布局包含ToolBar+Framelayout.
    
    * 3getContentView()为抽象方法,返回一个View 将此View add到framelayout中.
    
    * 4做一些ToolBar的初始化操作.
    
    * 5使用
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            View view = LayoutInflater.from(this).inflate(R.layout.layout_toolbar, (ViewGroup) getWindow().getDecorView().getRootView(), false);
            mContent_frame = view.findViewById(R.id.content_frame);
            if(getContentView() != null){
                mContent_frame.addView(getContentView());
            }
            setContentView(view);
    
            ButterKnife.bind(this);
            steepTitle();
            setSupportActionBar(mToolbar);
            getSupportActionBar().setTitle("");
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
            setTitle(getTitle());
    
            initWidget();
            initData();
        }
    
    • 处理ToolBar的返回事件:
        //style.xml中
        <item name="android:homeAsUpIndicator">@mipmap/back_white</item>
        //AppToolBarActivity中
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            if(item.getItemId() == android.R.id.home){
                onBackPressed();
            }
            return super.onOptionsItemSelected(item);
        }
    
    • 处理中间Title 重写setTitle()
        //bar 中间标题
        @Override
        public void setTitle(CharSequence title) {
            mToolbar_tv_title.setText(title);
            mRadioGroup.setVisibility(View.GONE);
        }   
    
    • 处理右侧可能是文字或图片按钮 中间可能是多按钮
        //bar右侧是文字
        protected void setRightTextButtonEnable(@StringRes int rid, View.OnClickListener onClickListener) {
            mTv_title_right.setText(rid);
            mTv_title_right.setOnClickListener(onClickListener);
            mTv_title_right.setVisibility(View.VISIBLE);
        }
        
        //bar右侧是图标
        protected void setRightImageButtonEnable(@DrawableRes int rid, View.OnClickListener onClickListener) {
            mIv_title_right.setImageResource(rid);
            mIv_title_right.setOnClickListener(onClickListener);
            mIv_title_right.setVisibility(View.VISIBLE);
            mTv_title_right.setVisibility(View.GONE);
    
        }
    
        //bar中间是多按钮
        protected void setCenterRadioGroupEnable(String btnLefttext,String btnRighttext, RadioGroup.OnCheckedChangeListener onClickListener) {
            mRadioBtnLeft.setText(btnLefttext);
            mRadioBtnRight.setText(btnRighttext);
            mRadioGroup.setOnCheckedChangeListener(onClickListener);
            mRadioGroup.setVisibility(View.VISIBLE);
            mToolbar_tv_title.setVisibility(View.GONE);
        }
        
    
    • 处理所谓的沉浸式
        //加载沉浸式状态栏
        public void steepTitle() {
            if (Build.VERSION.SDK_INT >= 21) {
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                //注意要清除 FLAG_TRANSLUCENT_STATUS flag
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                getWindow().setStatusBarColor(getResources().getColor(R.color.maincolor));
            }
        }
       
    
    • 最后使用超简单:
        @Override
        protected View getContentView() {
            return initRId(R.layout.activity_main);
        }
    
        @Override
        protected void initWidget() {
            setBackEnable(false);
            setTitle("主页");
        }
    

    github地址传送门

    策略2:自己写一个Bar 使用重载方法初始化

    • 核心代码:
        protected void initAppBar() {
            initAppBar(true, false, -1, -1);
        }
    
        protected void initAppBar(boolean isBack) {
            initAppBar(isBack, false, -1, -1);
        }
    
        protected void initAppBar(boolean isBack, boolean isRightText) {
            initAppBar(isBack, isRightText, -1, -1);
        }
    
        protected void initAppBar(boolean isBack, boolean isRightText, @ColorRes int bgColor, @ColorRes int textColor) {
            //动态添加appbar 这样无需在每个xml中includ进去appbar的布局
            //如果不写这四行 需要在每个xml中incloud进去bar布局
            ViewGroup view = getWindow().getDecorView().findViewById(android.R.id.content);
            ViewGroup inflate = (ViewGroup) view.getChildAt(0);
            View barView = getLayoutInflater().inflate(R.layout.common_appbar, inflate,false);
            inflate.addView(barView,0);
    
            RelativeLayout layout = findViewById(R.id.common_appbar_rl);
            if (layout == null) {
                return;
            }
            invadeStatusBar();
            if (bgColor != -1) {
                layout.setBackgroundResource(bgColor);
            }
            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) layout.getLayoutParams();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                layoutParams.setMargins(0, getStatusBarHeight(), 0, 0);
            } else {
                layoutParams.setMargins(0, 0, 0, 0);
            }
            layout.setLayoutParams(layoutParams);
            ImageView iconIV = findViewById(R.id.common_appbar_iv);
            if (!isBack) {
                iconIV.setVisibility(View.GONE);
            } else {
                iconIV.setVisibility(View.VISIBLE);
                iconIV.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        finish();
                    }
                });
            }
            TextView centerTV = findViewById(R.id.common_appbar_center_tv);
            if (textColor != -1) {
                centerTV.setTextColor(getResources().getColor(textColor));
            }
            centerTV.setText(TypeUtil.isBlank(setAppBarTitle()) ? "" : setAppBarTitle());
            TextView rightTV = findViewById(R.id.common_appbar_right_tv);
            if (!isRightText) {
                rightTV.setVisibility(View.GONE);
            } else {
                rightTV.setVisibility(View.VISIBLE);
                if (textColor != -1) {
                    centerTV.setTextColor(getResources().getColor(textColor));
                }
                rightTV.setText(TypeUtil.isBlank(setAppBarRightTitle()) ? "" : setAppBarRightTitle());
                rightTV.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onAppBarRightClick();
                    }
                });
            }
        }
    
    • 重载方法:
        protected abstract String setAppBarTitle();
    
        protected abstract String setAppBarRightTitle();
    
        protected abstract void onAppBarRightClick();
    
    • 使用:
      initAppBar(true,true);
    
      @Override
        protected String setAppBarTitle() {
            return "Tactics2";
        }
    
        @Override
        protected String setAppBarRightTitle() {
            return "更多";
        }
    
        @Override
        protected void onAppBarRightClick() {
            ToastUtil.showToast("更多");
        }
    

    最后安利一个小技巧:

    • Activity跳转时候,可以这么写,更舒服:
        //只需要在目标Activity敲下start 就会出现自带的方法,可以传递一些数据:
        public static void start(Context context, String id) {
            Intent starter = new Intent(context, TacticsOneActivity.class);
            starter.putExtra("id", id);
            context.startActivity(starter);
        }
    
        //在执行跳转的某按钮处,只需简短一句:
        XxxActivity.start(this,"1");
    
    • 同理Fragment:
        //只需要在目标Fragment敲下newI :
        public static ChargeRecordFragment newInstance(int type,String coinName,String coinDetailName) {
            Bundle args = new Bundle();
            args.putInt("type",type);
            args.putString("coinName",coinName);
            args.putString("coinDetailName",coinDetailName);
            ChargeRecordFragment fragment = new ChargeRecordFragment();
            fragment.setArguments(args);
            return fragment;
        }
        //Activity的某处拿到实例并传递数据:
        ChargeRecordFragment.newInstance(0,mCoinName,mCoinDetailName);
    
    展开全文
  • 我的Android开发之旅(一):BaseActivity的浅入为什么要写BaseAcivity一行代码实现 Toolbar 效果“少啰嗦,先看东西”最后 为什么要写BaseAcivity 我们都知道在做Android应用开发的时候都需要创建一个Activity,但...
  • ToolBar封装

    2016-12-12 16:51:30
    实现ToolBar封装 1.更改主题  在Value文件夹中的style文件里修改主题为 style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 2.创建一个帮助类,在该类中实现ToolBar封装 import ...

    实现ToolBar的封装

    1.更改主题

     在Value文件夹中的style文件里修改主题为

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

    2.创建一个帮助类,在该类中实现ToolBar的封装

    import android.content.Context;
    import android.support.v7.widget.Toolbar;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.FrameLayout;
    
    
    /**
     * Created by hatsune39 on 2016/12/12.
     * function:Toolbar的帮助类,把它做好后就不用做大修改,直接用即可
     */
    public class ToolBarHelp {
    
        //ToolBar帮助类的构造方法,方便用户自定义ToolBar,进行对象的初始化
        //layoutID:布局资源,context:上下文
    
    
        //上下文,把一个Xml布局资源转换成View的时候用到
        private Context context;
        //布局资源
        private FrameLayout contextView;
        //打气筒,为了转换成View对象
        private final LayoutInflater inflater;
        //用户传入的XML资源对象
        private View userView;
        //Toolbar的对象,通过getToolBar获取
        private Toolbar toolbar;
    
        public ToolBarHelp(Context context,int layoutID) {
            //传递上下文
            this.context = context;
            //因为普通类没有getInflater()方法可以调用,所以传递一个上下文,通过Layout.from()静态方法得到LayoutInfater的一个对象
            inflater = LayoutInflater.from(context);
            //初始化整个内容
            initContextView();
            //初始化用户自定义布局
            initUserView(layoutID);
            //初始化ToolBar对象
            initToolBar();
        }
    
        /**
         * 初始化整个布局内容
         */
        public void initContextView() {
            //创建一个布局作为视图的容器,视图容器的父容器
            contextView = new FrameLayout(context);
            //设置参数对象,定义宽高都是填充父窗体,
            //ctrl+q
            ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            //把参数对象传递给视图容器
            contextView.setLayoutParams(params);
        }
    
        //初始化用户自定义的布局
        private void initUserView(int layoutID) {
            //把用户传递过来的XML布局资源转化为一个View对象
            userView = inflater.inflate(layoutID, null);
            //设置参数对象,定义宽高都是填充父窗体
            ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            //把参数对象传递给视图容器
            userView.setLayoutParams(params);
        }
    
        private void initToolBar() {
            //把一个装有ToolBar的布局资源转换为一个View对象
            View inflate = inflater.inflate(R.layout.activity_tool_bar, contextView);
            //找到布局XML资源里的ToolBar,设置为全局变量
            toolbar = (Toolbar) inflate.findViewById(R.id.toolbar);
        }
    
        /**
         * 返回ToolBar的对象,方便用户对ToolBar的自定义
         * @return
         */
        public Toolbar getToolBar(){
            return toolbar;
        }
    
        /**
         * 获取默认的根布局对象,FrameLayout
         */
        public FrameLayout getContextView(){
            return contextView;
        }
    }

    3.创建一个ToolBar基类,哪个Activity有ToolBar,就继承该类

    import android.support.annotation.LayoutRes;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.MenuItem;
    
    //自定义toolBar的Activity,那个Activity有ToolBar,就继承该类
    public class ToolBarActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.activity_bar_tool);
            //把加载布局的方法进行重写
        }
    
        //进行布局加载方法的复写
        @Override
        public void setContentView(@LayoutRes int layoutResID) {
            super.setContentView(layoutResID);
            //创建ToolBarHelp对象,传递参数,1.上下文 2.布局资源(就由继承ToolBarActivity的Activity去写)
            ToolBarHelp toolBarHelp = new ToolBarHelp(this, layoutResID);
            //获取封装好的ToolBar对象
            Toolbar toolBar = toolBarHelp.getToolBar();
            //设置ToolBarhelp类中默认指定的根容器
            setContentView(toolBarHelp.getContextView());
            //设置支持ToolBar
            setSupportActionBar(toolBar);
            //自定义一些ToolBar的个性化设置
            onCreateCustomToolbar(toolBar);
        }
    
        /**
         * 自定义一些ToolBar的个性设置,继承的Activity记得要对它进行复写
         * @param toolBar
         */
        public void onCreateCustomToolbar(Toolbar toolBar) {
    
        }
    
        //当用户点击菜单栏中的某一个选项时,会调用该方法,重写此方法,当点击左上方图标时,关闭Activity
        @Override
        public boolean onContextItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home){
                finish();
                return true;
            }
            return super.onContextItemSelected(item);
        }
    }

    布局文件中声明一个ToolBar,设置ID与Background即可.

    4.使用封装好的ToolBar

    package com.zhiyuan3g.toolbar;
    
    import android.support.annotation.LayoutRes;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.MenuItem;
    
    //自定义toolBar的Activity,那个Activity有ToolBar,就继承该类
    public class ToolBarActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.activity_bar_tool);
            //把加载布局的方法进行重写
        }
    
        //进行布局加载方法的复写
        @Override
        public void setContentView(@LayoutRes int layoutResID) {
            super.setContentView(layoutResID);
            //创建ToolBarHelp对象,传递参数,1.上下文 2.布局资源(就由继承ToolBarActivity的Activity去写)
            ToolBarHelp toolBarHelp = new ToolBarHelp(this, layoutResID);
            //获取封装好的ToolBar对象
            Toolbar toolBar = toolBarHelp.getToolBar();
            //设置ToolBarhelp类中默认指定的根容器
            setContentView(toolBarHelp.getContextView());
            //设置支持ToolBar
            setSupportActionBar(toolBar);
            //自定义一些ToolBar的个性化设置
            onCreateCustomToolbar(toolBar);
        }
    
        /**
         * 自定义一些ToolBar的个性设置,继承的Activity记得要对它进行复写
         * @param toolBar
         */
        public void onCreateCustomToolbar(Toolbar toolBar) {
              toolBar.inflateMenu(R.menu.toolbar_menu);
              toolBar.setTitle("abc");
              //设置支持ToolBar
              setSupportActionBar(toolBar);
        }
    
        //当用户点击菜单栏中的某一个选项时,会调用该方法,重写此方法,当点击左上方图标时,关闭Activity
        @Override
        public boolean onContextItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home){
                finish();
                return true;
            }
            return super.onContextItemSelected(item);
        }
    }
    

    Demo中用到的MenuXML文件

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto">
        <!--注意:xmlns:app=.../res-auto 是要修改的地方,下面要引用app-->
        <!--    app:showAsAction= 对item是否隐藏折叠的设置,隐藏折叠显示文本,否则显示图片
                always就是一直显示,never就是隐藏折叠-->
    
        <item android:id="@+id/item0"
              app:showAsAction="always"
              android:icon="@drawable/miku"
              android:title="item0"
            />
    </menu>

    效果图如下


    展开全文
  • ToolBar封装

    千次下载 热门讨论 2015-06-12 23:54:03
    ToolBar封装,使代码步重复,快捷开发
  • 由于公司项目渐渐落地,无聊时间封装了史上最新最强封装toolbar,供大伙学习和参考。
  • BaseActivity中封装通用的Toolbar

    千次阅读 2017-04-28 23:35:33
    之前写过一篇关于Toolbar的文章,最近在搭建新项目时对Toolbar做了简单的封装封装的预期目标是只在BaseActivity中引入Toolbar,然后子Activity通过继承BaseActivity就能显示Toolbar。话不多说,看看效果如何实现。...

    之前写过一篇关于如何使用Toolbar的文章,最近在搭建新项目时对Toolbar做了封装。封装的预期目标是只在BaseActivity中引入Toolbar,然后子Activity通过继承BaseActivity就能显示Toolbar。接下来就看看如何实现这样的功能。
    因为我们使用toolbar作为titlebar,因此首先需要去掉Actionbar。在style文件下修改默认Theme的parent为Theme.AppCompat.Light.NoActionBar便可以去掉默认的Actionbar,如下:

        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>

    然后定义一个toolbar_layout的xml文件,在toolbar中加入俩个TextView作为标题和子标题,如下:

    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:minHeight="?attr/actionBarSize">
        <!--自定义toolbar的title 和subtitle -->
        <TextView
            android:id="@+id/tv_right"
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:maxLines="1"
            android:textColor="@color/white"
            android:text="right"
            android:paddingRight="10dp"
            android:layout_gravity="right" />
    
        <TextView
            android:id="@+id/tv_title"
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:lines="1"
            android:ellipsize="end"
            android:text="title"
            android:scrollHorizontally="true"
            android:textColor="@color/white"
            android:layout_gravity="center" />
    
    </android.support.v7.widget.Toolbar>

    接着在BaseActivity的布局文件中include进toolbar_layout,如下:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <include layout="@layout/toolbar_layout"/>
    
    </LinearLayout>
    

    这样BaseActivity中就可以正常显示出Toolbar了。那么如何实现子Activity继承BaseActivity而显示toolbar呢?其实我们可以在BaseActivity中做文章。
    首先在BaseActivity中声明一个LinearLayout,然后把BaseActivity的布局文件添加到该LinearLayout中。我们知道子Activity通过setContentView()方法来关联布局文件,因此我们可以在BaseActivity中去重写setContentView()方法,在重写的setContentView中把子类的布局文件也添加到事先声明的LinearLayout中,接下来应该解决如何将这个LinearLayout与Activity关联。查阅相关资料可以知道,可以通过 findViewById(android.R.id.content)拿到window的ViewGroup然后将刚才声明的LinearLayout添加到这个ViewGroup中,这样就可以在子Activity中显示出BaseActivity中的Toolbar了。(具体原因可以查阅android.R.id.content和 DecorView)代码如下:

    public abstract class BaseActivity extends AppCompatActivity{
         //the container of this activity layout and sub-activity layout
        private LinearLayout parentLinearLayout;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initContentView(R.layout.activity_base);
            setContentView(getLayoutId());
            initToolBar();
            init();
        }
    //  overwrite the function in sub-activity and return the layout id of sub-activity   
     protected abstract int getLayoutId();
    
     private void initContentView(@LayoutRes int layoutResID) {
            ViewGroup viewGroup = (ViewGroup) findViewById(android.R.id.content);
            viewGroup.removeAllViews();
            parentLinearLayout = new LinearLayout(this);
            parentLinearLayout.setOrientation(LinearLayout.VERTICAL);
            //  add parentLinearLayout in viewGroup
            viewGroup.addView(parentLinearLayout);
            //  add the layout of BaseActivity in parentLinearLayout
            LayoutInflater.from(this).inflate(layoutResID, parentLinearLayout, true);
        }
       /**
         * @param layoutResID  layout id of sub-activity
         */
        @Override
        public void setContentView(@LayoutRes int layoutResID) {
            //  added the sub-activity layout id in parentLinearLayout
            LayoutInflater.from(this).inflate(layoutResID, parentLinearLayout, true);
    
        }
    }
    

    上述代码通过initContentView()方法将BaseActivity中的布局文件添加到了声明的parentLinearLayout中,通过setContentView()方法将子Activity的布局也添加到了parentLinearLayout中,然后又将parentLinearLayout添加到了viewGroup中实现了Activity与布局文件的关联。至此我们完成了第一步,使子Activity可以显示出BaseActivity中的Toolbar布局。
    接下来,我们需要在BaseActivity中对Toolbar进行封装,使其能够更加方便的在子Activity中使用。比如添加toolbar回退键的监听,添加是否显示回退键的方法等。完整的BaseActivity如下:

    public abstract class BaseActivity extends AppCompatActivity{
        //the container of this activity layout and sub-activity layout 
        private LinearLayout parentLinearLayout;
        private TextView mTvTitle;
        private TextView mTvRight;
        private Toolbar mToolbar;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initContentView(R.layout.activity_base);
    
            setContentView(getLayoutId());
            initToolBar();
            setBackIcon();
            init();
        }
    //  overwrite the function in sub-activity and return the layout id of sub-activity 
     protected abstract int getLayoutId();
    
     private void initContentView(@LayoutRes int layoutResID) {
            ViewGroup viewGroup = (ViewGroup) findViewById(android.R.id.content);
            viewGroup.removeAllViews();
            parentLinearLayout = new LinearLayout(this);
            parentLinearLayout.setOrientation(LinearLayout.VERTICAL);
            viewGroup.addView(parentLinearLayout);
            //  add the layout of BaseActivity in parentLinearLayout
            LayoutInflater.from(this).inflate(layoutResID, parentLinearLayout, true);
        }
       /**
         * @param layoutResID  the layout id of sub Activity
         */
        @Override
        public void setContentView(@LayoutRes int layoutResID) {
            //  added the sub-activity layout id in parentLinearLayout
            LayoutInflater.from(this).inflate(layoutResID, parentLinearLayout, true);
    
        }
    
    private void setBackIcon(){
            if (null != getToolbar() && isShowBacking()) {
                getToolbar().setNavigationIcon(R.drawable.icon_back);
                getToolbar().setNavigationOnClickListener((v) -> onBackPressed());
            }
        }
    
        /**
         * @return TextView in center
         */
        public TextView getToolbarTitle() {
            return mTvTitle;
        }
    
        /**
         * @return TextView on the right
         */
        public TextView getSubTitle() {
            return mTvRight;
        }
    
        /**
         * set Title
         * @param title
         */
        public void setToolBarTitle(CharSequence title) {
            if (mTvTitle != null) {
                mTvTitle.setText(title);
            } else {
                getToolbar().setTitle(title);
                setSupportActionBar(getToolbar());
            }
        }
    
        /**
         * the toolbar of this Activity
         * @return support.v7.widget.Toolbar.
         */
        public Toolbar getToolbar() {
            return (Toolbar) findViewById(R.id.toolbar);
        }
    
        /**
         * is show back icon,default is none。
         * you can override the function in subclass and return to true show the back icon
         * @return
         */
        protected boolean isShowBacking() {
            return true;
        }
    }

    最后我们可以在子Activity中去使用toolbar了。
    我们让MainActivity继承BaseActivity,并在布局文件中添加一个button,切布局文件中没有添加标题栏,布局文件的代码就不再贴出了。然后 重写isShowBacing()方法,使其返回false,隐藏MainActivity的回退键。
    代码如下:

    public class MainActivity extends BaseActivity {
        @BindView(R.id.btn)
        Button mBtn1;
        @Override
        protected int getLayoutId() {
            return R.layout.activity_main;
        }
    
         @Override
        protected boolean isShowBacking() {
            return false;
        }
    
    @OnClick({R.id.btn})
        public void Onclick(View view){
            switch (view.getId()){
                case R.id.btn:
                    startActivity(new Intent(this,TestActivity.class));
                    break;
            }
        }
    }

    创建TestActivity并继承BaseActivity,TestActivity的布局文件中不添加任何view。然后在TestActivity中给toolbar设置内容,如下:

    public class TestActivity extends BaseActivity {
    
        @Override
        protected int getLayoutId() {
            return R.layout.activity_test;
        }
    
        @Override
        protected void init() {
            getToolbarTitle().setText("中间标题");
            getSubTitle().setText("右边标题");
            Toolbar toolbar = getToolbar();
            toolbar.setLogo(R.mipmap.ic_launcher);
            toolbar.setNavigationIcon(R.drawable.back_white);
        }
    }

    效果如下图所示

    这里写图片描述

    展开全文
  • Android之ToolBar项目封装,踩坑过河

    千次阅读 2016-06-23 22:50:37
    Toolbar封装

    欢迎各位访问的博客,博客地址

    概述

    继承关系:

    java.lang.Object
       ↳    android.view.View
           ↳    android.view.ViewGroup
               ↳    android.widget.Toolbar

    其实toolbar就是一个封装好的ViewGroup,其主要五大部分对应的子View如下:

    //菜单,ActionMenuView也是个ViewGroup
    private ActionMenuView mMenuView;
    //主标题
    private TextView mTitleTextView;
    //副标题
    private TextView mSubtitleTextView;
    //导航按钮
    private ImageButton mNavButtonView;
    //Logo图标
    private ImageView mLogoView;

    看下图,比较清晰:

    ToolBar图解

    项目封装

    配置theme

    为了适配5.0之后安卓的设计,做起statusbar的颜色适配

    <style name="AppTheme" parent="Theme.AppCompat.Light.Theme.AppCompat.Light.NoActionBar">
            <item name="colorPrimaryDark">@color/main_dark</item>
            <item name="colorPrimary">@color/main</item>
            <item name="colorAccent">@color/strong</item>
            <item name="android:textColorPrimary">@android:color/white</item>
            <item name="android:actionBarSize">@dimen/nav_bar_height</item>
        </style>

    这里注意下,主题使用的parent是Theme.AppCompat.Light.NoActionBar,当然有些项目中配全局Theme时候还是用的Theme.AppCompat.Light.DarkActionBar,这时候需要改成没有ActionBar的主题,这里可以直接改成Theme.AppCompat.Light.NoActionBar,但是有些项目里如果想有些地方使用Actionbar有些地方使用Toolbar(当然很少。。)可以这样配一下即可:

    <style name="AppTheme.NoActionBar">
            <item name="windowActionBar">false</item>
            <item name="windowNoTitle">true</item>
    </style>

    然后在需要使用Toolbar的activity里给他配上这样的theme即可:

    <activity
            android:name=".ui.activity.MainTabBarActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:launchMode="singleTask"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="stateHidden">
    </activity>

    关于theme中几个color字段的描述看谷歌官方图,如下:

    几种color

    或者看谷歌文档(自备梯子):Material Theme

    由于我们项目里设定了toobar的高度,这里指定了actionBarSize,然后通过设置toolbar高度为这个值;

    布局代码

    由于项目中toolbar归属于fragment管理,所以这里是将toolbar封装在fragment中处理了,这里通过各个fragment的xml添加<include layout="@layout/toolbar_layout"/>

    toolbar_layout.xml如下:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="1dp">
        <TextView
            android:id="@+id/nav_left_text"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:drawableLeft="@drawable/nav_back_light"
            android:drawableStart="@drawable/nav_back_light"
            android:layout_gravity = "start"
            android:gravity="center"
            android:minWidth="50dp"
            android:text="返回"
            android:textColor="@android:color/white"
            android:textSize="@dimen/font_title"
            android:visibility="gone"/>
        <TextView
            android:id="@+id/center_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity = "center"
            android:textColor="@android:color/white"
            android:textSize="@dimen/font_large"
            tools:text="标题" />
        <TextView
            android:id="@+id/nav_right_text_button"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity = "end"
            android:gravity="center"
            android:minWidth="50dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:textColor="@color/color_999"
            android:textSize="@dimen/font_normal"
            android:visibility="gone" />
    </android.support.v7.widget.Toolbar>

    toolbar上的东西被我分成五种:

    1. navigationicon:通过.setNavigationIcon去处理
    2. logo:通过setlogo
    3. title与subtitle:通过.setTitle与setSubtitle去处理
    4. 自定义部分:这里也分成左中右三个部分,可以看上面布局文件,通过标签android:layout_gravity 来指定位置,这里有坑,自定义部分布局最左边有间隙,如果要去掉,可以设置:contentInset 这个标签去除。
    5. menu:menu的显示方式可以自行设置

    这样来看,基本所有的需求都能满足了;

    fragment中抽象封装:

    这里要看各个项目需求,由于我们公司项目中对最右边图标灵活度要求并不高,我一般使用menu就可以解决了,如果menu不能满足你,完全可以使用自定义部分中的“右部分”。

    下面进入封装,在baseFragment中做了如下封装,项目中使用的是JakeWharton的注入框架butterknife链接

    1. 首先注入toolbar及自定义部分中除最右边图标的控件,因为最右边图标我们项目中一般menu就够用了:
     @BindView(R.id.toolbar)
     protected Toolbar mToolBar;
     @BindView(R.id.center_title)
     TextView mCenterTitle;
     @BindView(R.id.nav_left_text)
     TextView mNavLeftText;
    1. 然后在初始化fragment视图时候将mToolBar、mCenterTitle、mNavLeftText传给其子fragment进行定制,这三个控件传递出去后完全可以定制navigationicon、logo、title与subtitle、自定义部分这四个部分。以下代码中的initview和popFragment是我封装好的在fragment的OncreateView时候调用的,详细封装请看:浅谈Activity,Fragment模块化封装
    @Override
    protected void initView(View view, Bundle savedInstanceState) {
          initToolBar(mToolBar, mCenterTitle, mNavLeftText);
    }
    protected void initToolBar(Toolbar toolbar, TextView centerTitle, TextView navLeftText){
            ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
            ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);
    toolbar.setNavigationIcon(R.drawable.nav_back_light);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    popFragment();
                }
            });
        }

    这里有个坑:

    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayShowTitleEnabled(false);

    必须设置这个,不然默认的title一直在,即使你设置了toolbar.settitle(“xxoo”)。。。

    这里做了一件事,给navigationButton导航按钮做了个监听,pop出当前这个fragment出栈

    1. 还剩最后一个东西没有定制:menu

    这个很简单,不过也要注意下,必须在fragment中设置菜单,一定要先设置:

    setHasOptionsMenu(true);

    关于源码,可以去看下,然后处理方式很简单了:

    @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            inflater.inflate(R.menu.search, menu);
            super.onCreateOptionsMenu(menu, inflater);
        }

    这里也有个坑:如果你没有设置:

    ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);

    那么onCreateOptionsMenu 并不会被回调。

    1. 最后做下menu的监听即可:
    toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()){
                        }
                    return true;
                }
            });

    总结:

    Toolbar是android5.0之后出现的MD设计风的控件,支持5.0之后的elevation特性,相比较Actionbar具有高度自定义的特性,因为其本身是一个ViewGroup内部布局完全自由处理,这样大大扩展了其自由定制性,不多说,赶紧开始替换Actionbar吧!

    具体代码请看我的github:Android练习小项目

    展开全文
  • #1.Toolbar封装处理 #####试想了很多场景.死了n个脑细胞,最后得出来的结构图: ##(1).Appcompat风格: "1.0" encoding= "utf-8" ?> xmlns:android= "http://schemas.android.com/apk/res/android" xmlns...
  • toolbar封装

    2017-03-16 13:33:09
    使用builder设计模式进行toolbar封装,使用非常方便
  • 前言 在2015年的Google I/O大会上推出Design Support库,这个库讲Material Design 中最具代表性的一些控件和效果进行了封装,使得开发者在即使不了解Material Design的情况下也能轻松地将自己的应用Material华。...
  • ToolBar封装

    2017-05-19 11:55:38
    ToolBar封装 在开发app过程中,切换不同的fragment经常需要显示不同的toolbar,为了提高代码的质量和编程的效率,需要对toolbar进行统一的封装; 首先toolbar最常用的习惯的在xml中实现 xmlns
  • BaseActivity和toolBar简单使用和封装,可以添加菜单项去除重复代码等,方便开发继承使用
  • 封装Toolbar到BaseActivity

    千次阅读 2018-01-17 17:02:00
    Android 5.0的时候Google用Toolbar替代了ActionBar,而...一个应用的几乎所有界面都需要头部app bar,为了能够方便各个界面方便使用,统一管理,这里把toolBar封装到BaseActivity中。 1,定义一个toolbar_l...
  • Android ToolBar封装

    千次阅读 2017-04-08 14:03:24
    标题文字”类型的普通toolbar,也有“返回图标-标题文字-菜单图标”和“文字-标题文字-文字”这种类型的,也就是说,Toolbar的左边和右边都有可能是文字或者图标,而中间一般都是标题,所以寻思着封装toolbar,使...
  • Android ToolBar 的简单封装

    万次阅读 多人点赞 2015-06-12 23:56:00
    使用过 ToolBar 的朋友肯定对其使用方法不陌生,因为其用法很简单,如果对 ActionBar 使用比较熟练的人来说,ToolBar 就更容易了!不过,相信大家在使用的过程中都遇到过这样一个问题,需要在每一个我们要使用的 xml...
  • android Toolbar封装

    千次阅读 2016-07-07 16:42:35
    你们还在用自定义标题栏吗,你们还在为actionbar标题不能居中不灵活苦恼吗,Toolbar一切问题都帮你搞定Toolbar 标题居中 编写带有Toolbar的基类 Toolbar 标题居中 Toolbar的标题是默认左对齐的,不过Toolbar继承...
  • 封装前后对比 封装前: 在每个Activity或者Fragement写标题栏布局文件 在每个Activity或者Fragement给相应控件赋值,设置点击事件 在BaseActivity中进行赋值或者点击事件 封装后: 只需要在相应的Activity或者...
  • Toolbar封装

    2016-03-17 22:29:21
    toolbar的整合封装,适合新手学习,实现toolbar的标题居中,更改返回按钮图片,动态设置textview中的图片,添加点击事件,关闭原始title,添加状态栏颜色。
  • Toolbar封装及使用

    2016-12-12 19:37:24
    所以要对Toolbar进行封装. 代码框架 程序效果(这里进行简单的设置) 布局文件 主窗体中没有进行编写 ToolbarActivity的xml文件代码 xml version="1.0" encoding="utf-8"?> ...
  • Toolbar简单封装

    2018-12-27 17:57:03
    对Toolbar进行封装,为后续使用做铺垫,作者认为常见的对Toolbar封装的有2中方法。 第一种在BaseActivity中封装,这种封装不足之处在于BaseActivity会比较复杂,耦合性高,不利于后期维护,BaseActivity一般封装语言...
  • 接下来跟我一起动手封装标题栏,废话不多说,走起!!! 1.build.gradle下添加(哪个module需databinding就在对应的build.gradle下添加): android { dataBinding { enabled = true } ………………………… }...
  • Toolbar完整封装

    千次阅读 2016-03-17 22:20:44
    Toolbar封装使用
  • 前言 距离 上篇文章 的发表时间已经过去两个多月了,这两个月时间里我没写文章但...就在前段时间我在 鸿洋公众号 上看到了一篇文章,大概是介绍怎么封装 BaseActivity ,让 Activity 通过几行代码就可以实

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,209
精华内容 4,883
关键字:

toolbar封装