两种构建具有ToolBar的BaseActivity的方式

两种构建具有ToolBar的BaseActivity的方式

本着挤一点写一点的原则,写下这篇博文,一直都有农友在封装BaseActivity的路上越陷越深,我觉得没有必要纠结你BaseActivity的完善性,本着挤一点写一点的原则就行了,这里我用了两种方式来实现BaseActivity,一种是常用的继承方式,令一种是在构建app的activity管理长效机制的时候动态的加入我们为每一个activity的配置,各有千秋,看您的喜好吧。

  • Annotation的使用
  • 基础配置
  • 传统方式
  • ActivityLifecycleCallbacks方式
  • 效果图

Annotation

自定义注解的实现,须要了解Java为我们提供的元注解和相关定义注解的语法,可以用这个手写Butternife

  1.@Target,
  2.@Retention,
  3.@Documented,
  4.@Inherited
  
  这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。
  
@Target

   @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

  作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

  取值(ElementType)有:
    1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

使用:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface LayoutId {
    int value() default 0;
}

  
@Retention:

  @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

  作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效),这里我们大部分使用RUNTIME,如果要手写Butternife,要用class,并且用代理对注解进行编译时的类创建

  取值(RetentionPoicy)有:
    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

  Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。如实现Butternife部分实现如下:

 public class ZhsViewBinder {
    private static final ActivityViewFinder act_viewFinder=new ActivityViewFinder();
    private static final FragmentViewFinder frg_viewFinder=new FragmentViewFinder();
    private static final HashMap<String,ViewBinder> binderMap=new HashMap<>();
    public static void bind(Activity activity){
        bind(activity,activity,act_viewFinder);
    }
    public static void bind(Fragment fragment){
        bind(fragment,fragment,frg_viewFinder);
    }
    private static void bind(Object host,Object object,ViewFinder finder){
        String className=host.getClass().getName();
        try {
            ViewBinder viewBinder=binderMap.get(className);
            if(viewBinder==null){
                Class<?> aclass=Class.forName(className+ "$$ViewBinder");
                viewBinder= (ViewBinder) aclass.newInstance();
                binderMap.put(className,viewBinder);
            }
            if(viewBinder!=null){
                viewBinder.bindView(host,object,finder);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
    public static void unBind(Object host){
        String className=host.getClass().getName();
        ViewBinder viewBinder=binderMap.get(className);
        if(viewBinder!=null){
            viewBinder.unBind(host);
        }
        binderMap.remove(className);
    }
}
/**
 * ui提供者
 */
public interface ViewFinder {
    View findView(Object object,int id);
}

/**
 * 接口绑定
 * @param <T>
 */
public interface ViewBinder<T> {
    void bindView(T host,Object object,ViewFinder finder);
    void unBind(T host);
}
/**
 * activity 的入口
 */
public class ActivityViewFinder implements ViewFinder{
    @Override
    public View findView(Object object, int id) {
        return ((Activity)object).findViewById(id);
    }
}
/**
 * activity 的使用
 */
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface BindView {
    int value();
}

在activity中即可这样使用
public class MainActivity extends AppCompatActivity {

    @BindView(R.id.tv_id)
    TextView textView;
    ...
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ZhsViewBinder.bind(this);//注意这个要在setContentView之后调用,在baseactivity中使用也是一样
        }
}

@Documented:

  @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

@Inherited:

  @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

  注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

  当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

@Inherited
public @interface BindView{
    public enum ViewText { DEFAULT,WAIT,BLACK};
    String name();
    ViewText test() default FontColor.DEFAULT;
}

灵活运用以上即可达到很好的效果

ToolBar布局

注意使用自定义的ToolBar,将acativity的主题设置为NoActionBar,我这里的布局没有写的很好看,自己根据设计稿来优化

设置NoActionBar,
这里写图片描述
Theme下的
这里写图片描述

TOOLBAR布局

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:id="@+id/toolbar"
    app:contentInsetStart="0dp"
    android:layout_height="48dp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="48dp">
        <RelativeLayout
            android:layout_width="48dp"
            android:id="@+id/base_left_rl_content"
            android:layout_height="48dp"
            android:layout_alignParentLeft="true">
            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:scaleType="fitXY"
                android:src="@mipmap/back_defaut"
                android:layout_centerVertical="true"
                android:layout_marginLeft="10dp"
                android:id="@+id/base_left_img"
                android:visibility="gone"
                />
            <TextView
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_centerVertical="true"
                android:text="返回"
                android:id="@+id/base_left_tv"
                android:layout_marginLeft="10dp"
                android:visibility="gone"
                android:gravity="center"/>
        </RelativeLayout>
        <LinearLayout
            android:layout_width="200dp"
            android:layout_height="48dp"
            android:gravity="center"
            android:layout_centerInParent="true"
            android:orientation="horizontal"
            android:id="@+id/base_center_ll_content"
            >

            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:scaleType="fitXY"
                android:src="@mipmap/back_defaut"
                android:layout_centerInParent="true"
                android:visibility="gone"
                android:id="@+id/base_center_img"
                />
            <TextView
                android:layout_margin="10dp"
                android:layout_width="wrap_content"
                android:layout_height="48dp"
                android:layout_centerVertical="true"
                android:text="创建累的色是"
                android:visibility="gone"
                android:id="@+id/base_center_tv"
                android:gravity="center"/>
        </LinearLayout>
        <RelativeLayout
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:id="@+id/base_right_rl_content"
            android:layout_alignParentRight="true">
            <ImageView
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:scaleType="fitXY"
                android:visibility="gone"
                android:src="@mipmap/back_defaut"
                android:layout_centerVertical="true"
                android:layout_marginRight="10dp"
                android:id="@+id/base_right_img"
                />
            <TextView
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:layout_centerVertical="true"
                android:text="返回"
                android:visibility="gone"
                android:id="@+id/base_right_tv"
                android:layout_marginRight="10dp"
                android:gravity="center"/>
        </RelativeLayout>
        <TextView
            android:layout_width="match_parent"
            android:layout_alignParentBottom="true"
            android:layout_height="1dp"
            android:id="@+id/base_bottom_line"
            android:background="#8a8a8a"/>
    </RelativeLayout>
</android.support.v7.widget.Toolbar>

以后为每一个BaseActivity设置

<include layout="@layout/basetoolbar_layout"></include>

为ToolBar配置Annotation和为Activity配置一个布局id的注解
这里写图片描述

//toolbar的中间图片的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface CenterImag {
    int value() default 0;
}
//activity的布局id的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface LayoutId {
    int value() default 0;
}
//toolbar的左边图片的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface LeftImag {
    int value() default 0;
}
//toolbar的左边文字的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface LeftText {
    String value() default "";
}
//toolbar的右边图片的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RightImag {
    int value() default 0;
}
//toolbar的右边文字的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RightText {
    String value() default "";
}
//toolbar的中间文字的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface TitleText {
    String value() default "";
}

是不是很简单,过会再提他的具体使用,先来说一下实现BaseActivity

BaseActivity封装方式一

本着挤一点写一点的原则,我仿照Recovery写了一个crash框架,发现它里面利用了ActivityLifecycleCallbacks来实现对Activity的恢复记录以及相关的操作,我才发现这个东西的用处很大,感谢郑晓勇大神

  • 第一步手写一个类实现ActivityLifecycleCallbacks
    UiReinstateActivityLifecycleCallback
/**
 * Created by zhanghs on 2017/11/21/021.
 * crash 的初始化以及对activity的butternife的初始化
 * 这里需要activity 实现一个接口UiActivityAnnitation,就会自动为实现接口的activity增加toolbar
 * 或者使用baseactivity,
 */

public class UiReinstateActivityLifecycleCallback implements Application.ActivityLifecycleCallbacks {
    public TextView tvCenter, tvLeft, tvRight;
    public ImageView imgCenter, imgLeft, imgRight;
    public RelativeLayout rlLeft, rlRight;
    public LinearLayout llCenter;
    private Unbinder unbinder; //butternife的配置
    @Override
    public void onActivityCreated(final Activity activity, Bundle bundle) {
        Class mClass = activity.getClass();
        //判断该activity是否实现了UiActivityAnnitation接口,如果是我们才给她加toolbar
        //为的是一些特殊的activity不需要实现toolbar的我们可以跳过
        if (activity instanceof UiActivityAnnitation) {
            //一下均为对annotation的获取,是不是特别甘醇
            LayoutId layoutId = (LayoutId) mClass.getAnnotation(LayoutId.class);
            if (layoutId != null && layoutId.value() != 0) {
                activity.setContentView(layoutId.value());
            }
            unbinder = ButterKnife.bind(activity);
            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);
                    }
                }
                tvCenter = activity.findViewById(R.id.base_center_tv);
                tvLeft = activity.findViewById(R.id.base_left_tv);
                tvRight = activity.findViewById(R.id.base_right_tv);
                imgLeft = activity.findViewById(R.id.base_left_img);
                imgCenter = activity.findViewById(R.id.base_center_img);
                imgRight = activity.findViewById(R.id.base_right_img);
                rlLeft = activity.findViewById(R.id.base_left_rl_content);
                rlRight = activity.findViewById(R.id.base_right_rl_content);
                llCenter = activity.findViewById(R.id.base_center_ll_content);
                LeftImag leftImag = (LeftImag) mClass.getAnnotation(LeftImag.class);
                LeftText leftText = (LeftText) mClass.getAnnotation(LeftText.class);
                TitleText titleText = (TitleText) mClass.getAnnotation(TitleText.class);
                CenterImag centerImag = (CenterImag) mClass.getAnnotation(CenterImag.class);
                RightImag rightImag = (RightImag) mClass.getAnnotation(RightImag.class);
                RightText rightText = (RightText) mClass.getAnnotation(RightText.class);
                if (titleText != null && titleText.value().length() != 0) {
                    tvCenter.setVisibility(View.VISIBLE);
                    tvCenter.setText(titleText.value());
                }
                if (leftText != null && leftText.value().length() != 0) {
                    tvLeft.setVisibility(View.VISIBLE);
                    tvLeft.setText(leftText.value());
                }
                if (rightText != null && rightText.value().length() != 0) {
                    tvRight.setVisibility(View.VISIBLE);
                    tvRight.setText(rightText.value());
                }
                if (leftImag != null && leftImag.value() != 0) {
                    imgLeft.setVisibility(View.VISIBLE);
                    imgLeft.setImageResource(leftImag.value());
                }
                if (rightImag != null && rightImag.value() != 0) {
                    imgRight.setVisibility(View.VISIBLE);
                    imgRight.setImageResource(rightImag.value());
                }
                if (centerImag != null && centerImag.value() != 0) {
                    imgCenter.setVisibility(View.VISIBLE);
                    imgCenter.setImageResource(centerImag.value());
                }
                rlLeft.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        activity.onBackPressed();
                    }
                });
            }
            //将这个callback回掉回去,既可以满足每个activity的初始化,又可以对toolbar的控件进行相关操作
            ((UiActivityAnnitation) activity).initView(this);
            ((UiActivityAnnitation) activity).initEvent(this);
        }
    }

    @Override
    public void onActivityStarted(final Activity activity) {
    //注意这里是我对crash的封装,你们可以删除掉一下代码
        //判断是否是应该跳过的activity或者是crash的显示activity
        boolean isLegal = ReinstateStore.getInstance().verifyActivity(activity);
        if (!isLegal)
            return;

        if (activity.getIntent().getBooleanExtra(ReinstateActivity.RECOVERY_MODE_ACTIVE, false)) {
            Reflect.on(Reinstate.class).method("registerRecoveryProxy").invoke(Reinstate.getInstance());
        }

        if (ReinstateStore.getInstance().contains(activity))
            return;

        Window window = activity.getWindow();
        if (window != null) {
            View decorView = window.getDecorView();
            if (decorView == null)
                return;
            decorView.post(new Runnable() {
                @Override
                public void run() {
                    ReinstateStore.getInstance().putActivity(activity);
                    Object o = activity.getIntent().clone();
                    ReinstateStore.getInstance().setIntent((Intent) o);
                }
            });
        }
    }

    @Override
    public void onActivityResumed(Activity activity) {

    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        ReinstateStore.getInstance().removeActivity(activity);
        if(unbinder!=null){
            unbinder.unbind();
            unbinder=null;
        }

    }
}

//这里的UiActivityAnnitation就是变相的让Activity成为BaseActivity
/**
 * Created by zhanghs on 2017/11/21/021.
 * 对注解的提示,以及对ui的封装
 */

public interface UiActivityAnnitation {
    void initView(UiReinstateActivityLifecycleCallback callback);
    void initEvent(UiReinstateActivityLifecycleCallback callback);
}

配置一个全局的Application对UiReinstateActivityLifecycleCallback初始化

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new UiReinstateActivityLifecycleCallback());
    }
}
//别忘了在清单文件中配置这个Application 
 android:name=".App"

Activity的使用

@LayoutId(R.layout.activity_test1)
@TitleText("第二页")
@LeftText("返回")
@RightText("你好啊1")
//由于是implements 可以使activity不在因为单继承BaseActivity而带来很多麻烦
public class TestActivity1 extends AppCompatActivity implements UiActivityAnnitation{
    @BindView(R.id.make)
    Button make;
    @BindView(R.id.next)
    Button next;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @OnClick({R.id.make,R.id.next})
    public void onClick(View view){
        switch (view.getId()){
            case R.id.make:
                System.out.println(1/0);
                break;
            case R.id.next:
                startActivity(new Intent(this,TestActivity2.class));
                break;
        }
    }
    //回掉回来可以对toolbar的所有控件进行设置与操作,嘎嘣脆
    @Override
    public void initView(UiReinstateActivityLifecycleCallback callback) {
        callback.tvCenter.setText("哈哈哈 我回来了");
    }
    @Override
    public void initEvent(UiReinstateActivityLifecycleCallback callback) {
    }
}

效果图,不要在意一些细节- -、

这里写图片描述

其他的一些配置就看你想怎么玩了

BaseActivity封装方式二

传统的BaseActivity的书写方式也游一遍,这里我只简单的封装了一个BaseHandler,为了防止一直占有Activity的引用,造成泄露

BaseHander

/**
 * Created by zhanghs on 2017/11/21/021.
 * 防止内存泄漏的handler
 */

public abstract class BaseHandler extends Handler {
    protected WeakReference<Activity> activityWeakReference;
    protected WeakReference<Fragment> fragmentWeakReference;
    /** 标记异步操作返回时目标界面已经消失时的处理状态 */
    public static final int ACTIVITY_GONE = -1;
    protected BaseHandler(){}
    public BaseHandler(Activity activity){
        this.activityWeakReference=new WeakReference<Activity>(activity);
    }
    public BaseHandler(Fragment fragment){
        this.fragmentWeakReference=new WeakReference<Fragment>(fragment);
    }

    @Override
    public void handleMessage(Message msg) {
        if (activityWeakReference != null&& activityWeakReference.get() != null&& (!activityWeakReference.get().isFinishing())) {
            // 确认Activity是否可用
            handleMessage(msg,  msg.what);
            return;
        } else if(fragmentWeakReference != null && fragmentWeakReference.get() != null &&(! fragmentWeakReference.get().isRemoving())){
            handleMessage(msg,  msg.what);
            return;
        }else {
            handleMessage(msg,ACTIVITY_GONE);
        }
    }
    /**
     * 抽象方法用户实现,用来处理具体的业务逻辑
     *
     * @param msg
     * @param what
     */
    public abstract void handleMessage(Message msg, int what);
}

具体的BaseActivity

//实现对EventBus的封装
public interface BaseEventEnter {
    void registerEvent();
    void unregisterEvent();
}
//BaseActivity
public abstract class BaseActivity<T> extends AppCompatActivity implements View.OnClickListener, BaseEventEnter {
    private TextView tvCenter, tvLeft, tvRight;
    private ImageView imgCenter, imgLeft, imgRight;
    private RelativeLayout rlLeft, rlRight;
    private LinearLayout llCenter;
    private Toolbar toolbar;
    private Unbinder unbinder;
    protected static BaseHandler baseHandler ;
    protected Context bContext;
    protected LayoutInflater bInflater;
    protected View bContentView;
    protected HttpManager bApi;
    protected RequestManager bGlide;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        baseHandler=new MyHandler(this) {
            @Override
            public void handleMessage(Message msg, int what) {
                handleMessageThis(msg,what);
            }
        };
        bContext=this;
        bInflater=LayoutInflater.from(this);
        bApi=HttpManager.init(this);
        bGlide=Glide.with(this);
        LayoutId layoutId = getClass().getAnnotation(LayoutId.class);
        if (layoutId != null && layoutId.value() != 0) {
            setContentView(layoutId.value());
        } else {
            setContentView(contentLayoutId());
        }
    }
    public static abstract class MyHandler extends BaseHandler{
        public MyHandler(Activity activity) {
            super(activity);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterEvent();
        if(unbinder!=null){
            unbinder.unbind();
            unbinder=null;
        }
    }

    public  void handleMessageThis(Message msg, int what){};
    public void setContentView(@LayoutRes int layoutResID) {
        if(layoutResID==0)return;
        bContentView=bInflater.inflate(layoutResID,null);
        if(bContentView==null)return;
        super.setContentView(bContentView);
        registerEvent();
        //这里保存unbinder 千万别用Serializable的序列化
        unbinder=ButterKnife.bind(this);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        if(toolbar!=null){
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            tvCenter = (TextView) findViewById(R.id.base_center_tv);
            tvLeft = (TextView) findViewById(R.id.base_left_tv);
            tvRight = (TextView) findViewById(R.id.base_right_tv);
            imgLeft = (ImageView) findViewById(R.id.base_left_img);
            imgCenter = (ImageView) findViewById(R.id.base_center_img);
            imgRight = (ImageView) findViewById(R.id.base_right_img);
            rlLeft = (RelativeLayout) findViewById(R.id.base_left_rl_content);
            rlRight = (RelativeLayout) findViewById(R.id.base_right_rl_content);
            llCenter = (LinearLayout) findViewById(R.id.base_center_ll_content);

            Class mClass = getClass();
            LeftImag leftImag = (LeftImag) mClass.getAnnotation(LeftImag.class);
            LeftText leftText = (LeftText) mClass.getAnnotation(LeftText.class);
            TitleText titleText = (TitleText) mClass.getAnnotation(TitleText.class);
            CenterImag centerImag = (CenterImag) mClass.getAnnotation(CenterImag.class);
            RightImag rightImag = (RightImag) mClass.getAnnotation(RightImag.class);
            RightText rightText = (RightText) mClass.getAnnotation(RightText.class);
            if (titleText != null && titleText.value().length() != 0) {
                tvCenter.setVisibility(View.VISIBLE);
                tvCenter.setText(titleText.value());
            }
            if (leftText != null && leftText.value().length() != 0) {
                tvLeft.setVisibility(View.VISIBLE);
                tvLeft.setText(leftText.value());
            }
            if (rightText != null && rightText.value().length() != 0) {
                tvRight.setVisibility(View.VISIBLE);
                tvRight.setText(rightText.value());
            }
            if (leftImag != null && leftImag.value() != 0) {
                imgLeft.setVisibility(View.VISIBLE);
                imgLeft.setImageResource(leftImag.value());
            }
            if (rightImag != null && rightImag.value() != 0) {
                imgRight.setVisibility(View.VISIBLE);
                imgRight.setImageResource(rightImag.value());
            }
            if (centerImag != null && centerImag.value() != 0) {
                imgCenter.setVisibility(View.VISIBLE);
                imgCenter.setImageResource(centerImag.value());
            }
            rlLeft.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onBackPressed();
                }
            });
        }
    }



    @Override
    public void registerEvent() {
        EventBus.getDefault().register(this);
    }

    @Override
    public void unregisterEvent() {
        EventBus.getDefault().unregister(this);
    }

    public abstract void initView();

    public abstract void initEvent();

    protected  int contentLayoutId(){return 0;}

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onDataSynEvent(BaseEventBean<T> event) {
        onDataEvent(event);
    }

    protected void onDataEvent(BaseEventBean<T> event){

    }
    /**
     * 中间的点击事件
     *
     * @param onClickListener
     */
    public void setCenterClick(View.OnClickListener onClickListener) {
        llCenter.setOnClickListener(onClickListener);
    }

    /**
     * 左边的点击事件
     *
     * @param onClickListener
     */
    public void setLeftClick(View.OnClickListener onClickListener) {
        rlLeft.setOnClickListener(onClickListener);
    }

    /**
     * 右边的点击事件
     *
     * @param onClickListener
     */
    public void setRightClick(View.OnClickListener onClickListener) {
        rlRight.setOnClickListener(onClickListener);
    }

    /**
     * 左边的文字
     *
     * @param text
     */
    public void setTvLeftText(String text) {
        tvLeft.setText(text);
    }

    /**
     * 中间的文字
     *
     * @param text
     */
    public void setTvCenterText(String text) {
        tvCenter.setText(text);
    }

    /**
     * 右边的文字
     *
     * @param text
     */
    public void setTvRightText(String text) {
        tvRight.setText(text);
    }
}

使用

//嘎嘣脆
@LayoutId(R.layout.activity_main)
@TitleText("主页")
@LeftImag(R.drawable.back_defaut)
@RightText("你好啊")
public class MainActivity extends BaseActivity<BaseBean>{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

   }
    @Override
    public void initView() {
    }
    @Override
    public void initEvent() {
    }
    @Override
    protected void handleMessageThis(Message msg, int what) {
    }
    @Override
    protected void onDataEvent(BaseEventBean<BaseBean> event) {
    }
}
                                    效果图类似,就不贴了,我去写log框架...

                           两种类型的BaseActivity的实现方式各有千秋,看大佬你喜好了

                                代码见我的另一个博文Rxjava2的网络框架搭建。

                                            抠脚来的不喜勿喷
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值