我一行代码都不写实现Toolbar!你却还在封装BaseActivity?

Android-一个共享的开发框架包含各种实用的BaseActivity 一个共享的开发框架,包含各种实用的BaseActivity 立即下载

前言

距离 上篇文章 的发表时间已经过去两个多月了,这两个月时间里我没写文章但一直在更新着我的 MVPArms 框架,让他逐渐朝着 可配置化集成框架 发展

就在前段时间我在鸿洋公众号上看到了一篇文章,大概是介绍怎么封装 BaseActivity ,让 Activity 通过几行代码就可以实现 ToolBar

刚好我的 MVPArms 框架也更新了一个功能: 通过非继承 Activity Fragment 来实现以前需要封装进 BaseActivity BaseFragment 通过继承来实现的一些公共逻辑

那我就来说说我怎么在不使用继承的情况下让 Activty 一行代码都不写就能实现 Toolbar

为什么我提倡少封装BaseActvity少用继承

BaseActivity 封装多了,除了不好管理外,还有最重要的一点就是, Java 只能单继承,当如果你的 Activity 需要使用到某个三方库,那个三方库必须让你继承于它的 Activity 但是你又需要你自己封装的 BaseActivity 的某些特性,这时你怎么办? 你不能改三方库的 Activity 所以你只有改你的 BaseActivity 让它去继承三方库的 Activity,但是当改了 BaseActivity 后,发现有很多继承于 BaseActivity 的 Activity 并不需要这个三方库,却被迫继承了它的 Activity ,这时你又要重新封装一个 BaseActivity

当这种情况发生的多了,你的 BaseActiviy 也越来越多,这样就恶性循环了,所以我不仅提倡 App 开发者少封装 BaseActivity 少用继承,也提倡 三方库 开发者少封装 BaseActivity 少用继承,为什么呢?因为当 App 开发者的 Activity 需要使用到两个三方库,两个三方库都需要继承它的 Activity,这时你让 App 开发者怎么办?所以作为一个可配置化集成框架作者,我不能让开发者去直接改我的 BaseActivity 我必须通过其他扩展的方式去解决这个问题

进入正题

好了进入正题,要想解决上面提到的问题,我们就要思考我们为什么一定要封装 BaseActivity 通过继承来实现一些 Activity 的公共逻辑,而不能将公共逻辑封装到其他类里面?

答案很简单,因为我们必须使用到 Activity 的一些生命周期,在对应的生命周期里执行对应的逻辑,这个就是我们不能通过封装其他类来实现的原因,找到了问题关键,那我们就从生命周期上下手来解决问题

ActivityLifecycleCallbacks

提到 Activity 的生命周期,这时我就要介绍一个接口了,它叫 ActivityLifecycleCallbacks ,不知道有同学之前了解过它吗?不了解不要紧,我现在来介绍介绍它

ActivityLifecycleCallbacks 是 Application 中声明的一个内部接口,我们来看看它的结构

public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

这个接口有什么用呢?

Application 提供有一个 registerActivityLifecycleCallbacks() 的方法,需要传入的参数就是这个 ActivityLifecycleCallbacks 接口,作用和你猜的没错,就是在你调用这个方法传入这个接口实现类后,系统会在每个 Activity 执行完对应的生命周期后都调用这个实现类中对应的方法,请记住是每个!

这个时候我们就会想到一个需求实现,关闭所有 Activity !你还在通过继承 BaseActivity 在 BaseActivity 的 onCreate 中将这个 Activity 加入集合???

那我现在就告诉你这样的弊端,如果你 App 中打开有其他三方库的 Activity ,这个三方库肯定不可能继承你的 BaseActivity ,这时你怎么办?怎么办?

这时 ActivityLifecycleCallbacks 就派上用场了, App 中的所有 Activity 只要执行完生命周期就一定会调用这个接口实现类的对应方法, 那你就可以在 onActivityCreated 中将所有 Activity 加入集合,这样不管你是不是三方库的 Activity 我都可以遍历集合 finish 所有的 Activity

使用 ActivityLifecycleCallbacks 实现 ToolBar

设置 NoActionBar 主题

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    ...
</application>

创建 ToolBar 的布局并引用

大家不要纠结我的 Toolbar 布局方式,这里只是实现思想,你可以自己改成自己的布局方式

<me.jessyan.art.widget.autolayout.AutoToolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="120px"
    android:background="?attr/colorPrimary"
    app:contentInsetStart="0dp"
    >

    // toolbar 中的返回按钮
    <com.zhy.autolayout.AutoRelativeLayout
        android:id="@+id/toolbar_back"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="left"
        >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30px"
            android:layout_marginRight="30px"
            android:layout_centerVertical="true"
            android:src="@mipmap/login_return"/>

    </com.zhy.autolayout.AutoRelativeLayout>

    // toolbar 中的标题名
    <TextView
        android:id="@+id/toolbar_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18dp"
        android:textColor="#fff"
        android:layout_gravity="center"
        tools:text="MVPArt"/>


</me.jessyan.art.widget.autolayout.AutoToolbar>

在你需要 Toolbar 的 Activity 布局中 include 上面的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    //将 Toolbar 包裹进来
    <include layout="@layout/include_title"/>

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="15px"
        android:paddingTop="15px"
        >

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"
            tools:listitem="@layout/recycle_list"
            />

    </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

实现 ActivityLifecycleCallbacks 并注册给 Application

下面只是对 ToolBar 简单的设置,你可以自己配置更多复杂的功能,你想象力有多丰富,这里就有多强大

public class WEApplication extends BaseApplication{

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                //这里全局给Activity设置toolbar和title,你想象力有多丰富,这里就有多强大,以前放到BaseActivity的操作都可以放到这里
                if (activity.findViewById(R.id.toolbar) != null) { //找到 Toolbar 并且替换 Actionbar
                    if (activity instanceof AppCompatActivity) {
                        ((AppCompatActivity) activity).setSupportActionBar((Toolbar) activity.findViewById(R.id.toolbar));
                        ((AppCompatActivity) activity).getSupportActionBar().setDisplayShowTitleEnabled(false);
                    } else {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            activity.setActionBar((android.widget.Toolbar) activity.findViewById(R.id.toolbar));
                            activity.getActionBar().setDisplayShowTitleEnabled(false);
                        }
                    }
                }
                if (activity.findViewById(R.id.toolbar_title) != null) { //找到 Toolbar 的标题栏并设置标题名
                    ((TextView) activity.findViewById(R.id.toolbar_title)).setText(activity.getTitle());
                }
                if (activity.findViewById(R.id.toolbar_back) != null) { //找到 Toolbar 的返回按钮,并且设置点击事件,点击关闭这个 Activity
                    activity.findViewById(R.id.toolbar_back).setOnClickListener(v -> {
                        activity.onBackPressed();
                    });
                }
            }

            ...

        });
    }
}

在 AndroidManifest.xml 中设置 Label

以后你想让一个 Activity 实现 ToolBar ,只用做两件事情:

  1. 在布局文件中
 <include layout="@layout/include_title"/>
  1. 在 AndroidManifest.xml 给这个 Activity 设置 Label ,这个 Label 就是标题名
        <activity
            android:name=".mvp.ui.activity.SplashActivity"
            android:label="@string/app_name"
            />

再介绍给大家一个全局配置所有 Activity 进入退出过度动画的方法,设置 Theme 属性

 <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>
        <item name="android:windowAnimationStyle">@style/AnimaActivity</item>
    </style>
    <style name="AnimaActivity">
        <item name="android:activityOpenEnterAnimation">@anim/translate_right_to_center</item>
        <item name="android:activityOpenExitAnimation">@anim/translate_center_to_left</item>
        <item name="android:activityCloseEnterAnimation">@anim/translate_left_to_center</item>
        <item name="android:activityCloseExitAnimation">@anim/translate_center_to_right</item>
    </style>

在 Activity 中你根本不用继承任何 Activity ,不用写任何一行代码,就可以实现很多繁琐复杂的功能

很多公共逻辑都可以写到 ActivityLifecycleCallbacks 中,只要敢于尝试,你想象力有多丰富,这里就有多强大

扩展

因为所有 Activity 在执行对应生命周期时, ActivityLifecycleCallbacks 对应的方法都会被调用,有些 Activity 可能不需要 Toolbar ,比如三方库的 Activity ,虽然在 onActivityCreated 方法中,判断了 ToolBar 的 Id 找不到就不执行设置 ToolBar 的逻辑,但是未免不够优雅

自定义接口

其实我们可以让 Activity 实现对应的自定义接口, 在 onActivityCreated 中 instanceof 这个自定义接口,如果不实现这个自定义接口,就说明不需要设置 ToolBar ,这样就优雅很多

储存数据

在 ActivityLifecycleCallbacks 中,所有 Activity 执行对应的生命周期后,它对应的方法都会被调用,所以我们必须区分这个 Activity 到底是哪个 Activity ,所以 ActivityLifecycleCallbacks 每个方法都会传入 Activity 做为参数,我们就可以用来区分 Activity

public void onActivityCreated(Activity activity, Bundle savedInstanceState){
    if (activity instanceof xxxActivity){
        ....
    }

}

但是又有一个问题出现这个 ActivityLifecycleCallbacks 是公用的,当一个 Activity 在 onCreate 方法产生了一个对象 ,我们需要在这个 Activity 执行 onDestroy 时用到这个对象,怎么办?因为每个 Activity 都要产生这个对象,我们不可能把这个对象存储在 ActivityLifecycleCallbacks 中啊

现在就可以用到 Activity.getIntent 来存储一些数据, Intent 中持有一个 Bundle 对象可以存储一些数据,

举个例子

我们需要使用 ActivityLifecycleCallbacks 实现给所有 Activity 执行 ButterKnife.bind(activity)

Bundle 中可以存储 Parcelable 对象

public class ActivityBean extends Parcelable {
    private Unbinder unbinder;
    public void setUnbinder(Unbinder unbinder){
        thid.unbinder = unbinder;
    }

    public Unbinder getUnbinder(){
        return unbinder;
    }
}

在 ActivityLifecycleCallbacks 执行对应逻辑

public class WEApplication extends BaseApplication{

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                ActivityBean bean = new ActivityBean();
                Unbinder unbinder = ButterKnife.bind(activity);
                bean.setUnbinder(unbinder);
                activity.getIntent().putExtra("ActivityBean", bean);
           }

            ...

            @Override
            public void onActivityDestroyed(Activity activity) {
                ActivityBean bean = activity.getIntent().getParcelableExtra("ActivityBean");
                bean.getUnbinder().unbind();
            }
        }

        });
    }
}

需要Activity初始化某些事,或者提供某些数据

BaseActivity 有些时候需要,子 Activity 实现某些方法,或者提供某些数据,如需要子 Activity
实现 initView 返回 setContentView() 中的布局 ID ,实现 initData 初始化一些数据,这样就可以不需要 Activity 再重写 onCreate ,达到规范的目的, 这样使用 ActivityLifecycleCallbacks 同样能做到,那我该怎么做呢?

只需要 Activity 实现某个自定义接口

public interface IActivity {

    int initView();

    void initData();

}

然后在 ActivityLifecycleCallbacks 的 onActivityCreated 中调用这些方法,就可以实现

public class WEApplication extends BaseApplication{

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            if (activity instanceof IActivity) {
               activity.setContentView(((IActivity)activity).initView());
               ((IActivity)activity).initData();          
            }

           }

            ...

        }

        });
    }
}

注意事项

由于 ActivityLifecycleCallbacks 中所有方法的调用时机都是在 Activity 对应生命周期的 Super 方法中进行的,所以在 Activity 的 onCreate 方法中使用 setContentView 必须在 super.onCreate(savedInstanceState); 之前,不然在 onActivityCreated 方法中 findViewById 会发现找不到

@Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_home);
        super.onCreate(savedInstanceState);
    }

也可以结合上面的方式使用自定义接口,调用 initView 后,在 findViewById() 找到 ToolBar

一不小心实现了这么多以前必须写到 BaseActivity 中通过继承才能达到的功能,发现没有 BaseActivity ,也并没有什么不舒服的地方,突然感觉自己好牛逼 ��,赶快关注我吧,虽然我并不会经常更新博客,但是我更新的文章在质量上绝对有保证!

总结

以上提到的思想以及解决方案已经使用到了我的 MVPArms 框架中,想知道更详细的用法可以去看看我的框架实现,我上面提到的所有的实现,其实都是最简单的一些需求,相信已经颠覆了以前的实现方式了,而且更加优雅,更不用担心 Java 单继承的束缚

但是千万不要以为, ActivityLifecycleCallbacks 就只能实现这些简单的需求,它还可以用到更多更复杂的功能之上,还是我之前的话, 只要敢于尝试,你想象力有多丰富,这里就有多强大 ,思想以及解决方案已经介绍的很清楚了,至于更多需求的实现就靠大家去尝试咯,虽然我不敢保证以前封装 BaseActivity 通过继承实现的所有功能都能被 ActivityLifecycleCallbacks 所替代,但是我想大多数功能还是能实现的

以前大家都是分享自己封装的 BaseActivity ,说不定有一天大家就开发分享自己写的 ActivityLifecycleCallbacks 呢! 当以前的方式已经不能满足我们的需求,敢于跳出传统的方式,尝试不同的解决方案,才能扩宽自己的视野,增长自己的技术, MVPArms 正在不断的努力着!


Hello 我叫Jessyan,如果您喜欢我的文章,可以在以下平台关注我 ��

– The end

BaseActivity和toolBar简单使用和封装 BaseActivity和toolBar简单使用和封装,可以添加菜单项去除重复代码等,方便开发继承使用 立即下载

相关推荐

我的Android开发之旅(一):BaseActivity的浅入之简单封装 Toolbar

我的Android开发之旅(一):BaseActivity的浅入为什么要写BaseAcivity一行代码实现 Toolbar 效果“少啰嗦,先看东西”最后 为什么要写BaseAcivity 我们都知道在做Android应用开发的时候都需要创建一个Activity,但很多时候我们的程序有多个界面并且每个界面都有相似的内容(例如:Toolbar、DrawerLayout)和后台的操作有共同的方法,这个时候我们写一个BaseActivity作为每一个Activity的基类,统一管理程序中的每个Activity。 一行代码实现 Toolbar 效果 activity_main.xml 的代码 Ma

推荐一款神器:JessYanCoding的AndroidAutoSize

在Android开发中,适配不同屏幕尺寸和分辨率始终是一个棘手的问题。 是一个由开发者JessYanCoding创建的小巧却强大的框架,旨在简化Android应用的尺寸适配,让你的UI在各种设备上都能保持良好的显示效果。 ## 技术分析 AndroidAutoSize基于Android的Density-independent Pixel (dp)单位,通过动态计算控件的实际像素大小来实现自适应...

gitblog_00067的博客 781

Debian下Rust环境极速安装指南:国内镜像+避坑配置(附清华/中科大源对比)

本文详细介绍了在Debian系统上快速安装和配置Rust开发环境的完整指南。针对国内网络环境,重点对比评测了清华大学、中国科学技术大学等主流镜像源,提供了详细的安装配置步骤、Cargo优化技巧以及常见问题排查方案,帮助开发者显著提升依赖下载和编译效率。

s8t9u0v1w的博客 1162

探索 JessYanCoding 的 AudioManagerSDK:一款强大的音频管理解决方案

探索 JessYanCoding 的 AudioManagerSDK:一款强大的音频管理解决方案 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个由开发者 JessYanCoding 创建的开源项目,旨在为移动应用提供高效、灵活的音频管理服务。通过使用此 SDK,开发者可以轻松地处理音频播放、音量控制和音频焦点管理等复杂问题,从而专注于构建更优秀的用户体验。 技术...

gitblog_00043的博客 551

基于TI C2000的CCS安装与工程创建完整示例

手把手演示基于TI C2000系列的CCS安装过程及首个工程创建步骤,涵盖环境配置与常见问题处理,助力快速上手嵌入式开发,ccs安装和工程搭建不再难。

weixin_42476987的博客 970

LabView实战:精准实现float到十六进制的转换与高低位拆分

本文详细讲解了在LabVIEW中实现单精度浮点数(float)到十六进制字符串转换,并进行高低16位拆分的实战方法。针对工业通信中设备协议要求,核心使用强制类型转换(Type Cast)获取内存原始数据,避免数值转换错误,并提供了完整的VI构建步骤、交叉验证技巧及常见踩坑经验(如字节序、字符串格式),确保数据通信的准确性。

assembly8low的博客 1767

探索高效开发: JessYanCoding的ArmsComponent-Template

探索高效开发: JessYanCoding的ArmsComponent-Template 项目简介 是一个由开发者 JessYanCoding 创建的项目,旨在提供一种快速搭建Android应用基础架构的方法。该项目基于阿里巴巴的MVVM框架ArmsComponent,为开发者提供了模板化的初始化配置和最佳实践,以帮助他们更高效地开始新项目的开发。 技术分析 MVVM 架构 ArmsCompone...

gitblog_00028的博客 390

FCL碰撞检测库在Windows下的编译与配置(MinGW+CMake)

本文详细介绍了在Windows系统下使用MinGW和CMake编译配置FCL碰撞检测库的完整流程。内容涵盖MinGW-w64、CMake的安装与环境配置,关键依赖库Eigen和libccd的安装,以及FCL源码的编译、安装与实战测试。重点解析了CMake配置命令中的关键参数与常见错误解决方案,旨在帮助开发者高效完成FCL在Windows平台的部署,适用于机器人、游戏物理引擎等需要精确碰撞检测的开发场景。

sunny的博客 483

封装Toolbar到BaseActivity

Android 5.0的时候Google用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代,那么使用方法就是引入Toolbar设置到Activity中。 一个应用的几乎所有界面都需要头部app bar,为了能够方便各个界面方便使用,统一管理,这里把toolBar封装到BaseActivity中。 1,定义一个toolbar_l...

thothsun 的博客 1849

PCIE Lane Margining Linux 环境配置

Copy all the provided files in folder PYC38 or PYC310 to the created pcie_lmt folder. Index of /ftp/python/3.8.10/Copy below commands to a file and rename it as "scan_pcie.py", the commands are from "685662 PCIe-LMT-Gen4_Gen5-r0p77.pdf" in the lane margi

mysongshine的博客 1436

灰度重心法实战:从原理到MATLAB代码实现激光条纹中心线提取

本文详细介绍了激光条纹中心线提取的核心方法——灰度重心法。通过物理类比阐释其原理,并提供从图像预处理到MATLAB代码实现的完整实战教程。文章重点解析了算法流程、关键参数调整及常见问题避坑指南,帮助读者快速掌握这一机器视觉与三维测量中的基础且高效的技术。

cake8的博客 461

Android日常开发(17)在使用JessYanCoding/AndroidAutoSize库时遇到的几个问题的解决办法,解决办法是在issue case中找到的

前言 最近注意到android系统默认字体的修改会影响到,页面布局,更会影响到正在使用的AndroidAutoSize框架,不熟悉这个框加的同学可以自行了解https://github.com/JessYanCoding/AndroidAutoSize它是一个很好的屏幕适配方案。 FAQ 1.全局设置屏幕适配方法 答:在BaseActivity中重写getResources @Override p...

ZPCrobot的博客 2399

Open3D 计算点云的倒角距离(Chamfer Distance)【2025最新版】

;Chamfer Distance距离可以计算生成点云数据与标签点云数据之间的平均最短点距离。Open3D可以直接用来计算点云的Chamfer Distance距离。博客长期更新,本文最近一次更新时间为:2025年2月18日。

点云侠的博客 3254

指令级并行ILP实战:从依赖分析到乱序执行与分支预测

在现代CPU性能优化中,指令级并行(ILP)决定了单核每个周期能完成多少工作,而IPC正是衡量这一能力的核心指标。其原理是在一条指令流中识别独立操作,通过寄存器重命名消除名称依赖,借助动态调度、乱序执行和分支预测隐藏等待,再配合循环展开与软件流水扩大调度窗口。技术价值在于突破主频与功耗瓶颈,让超标量流水线更充分地利用发射宽度。无论是高性能计算、加密内核还是数组归约,理解依赖距离与关键路径都能指导工程调优。围绕指令级并行、依赖分析、Tomasulo、重排序缓冲与预测精度,这些机制共同构成微架构性能挖掘的主线。

weixin_33911824的博客 318

详解AUTOSAR:专栏总述

本专栏系统介绍AUTOSAR规范及车用控制器软件开发,内容覆盖基础架构、SWC/RTE、通信栈、诊断、存储、安全、看门狗、工具链、环境配置与项目实战,并持续更新各模块的集成机制与工程要点。

不脱发的程序猿 3924

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android自行封装系统状态栏,我一行代码都不写实现Toolbar!你却还在封装BaseActivity?...

前言距离 上篇文章 的发表时间已经过去两个多月了,这两个月时间里我没写文章但一直在更新着我的 MVPArms 框架,让他逐渐朝着 可配置化集成框架 发展就在前段时间我在鸿洋公众号上看到了一篇文章,大概是介绍怎么封装 BaseActivity ,让 Activity 通过几行代码就可以实现 ToolBar刚好我的 MVPArms 框架也更新了一个功能:通过非继承 Activity Fragment ...

weixin_35390379的博客 282

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

BaseActivity中封装通用的Toolbar

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

smily的博客 8392

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

带ToolBar的BaseActivity

Toolbar是我们最常用的一个控件,几乎每一个activity都要用到,如果我们每一个界面都要去加一个toolbar然后再去findviewbyid,而且toolbar上的设置可能很activity都是相同的,那代码会不会很多重复呢? 下面就根据android界面构架的思想,自己去封装一个toolbar到BaseActivity上,其它activity只要继承BaseActivity并重写它的方

wenthkim的博客 1876
上一篇: 传统MVP用在项目中是真的方便还是累赘?
下一篇: 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听
JessYanCoding
博客等级 码龄10年 63粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值