孙孙啊i 之项目实战(一) 创建BaseActivity

本人是第一次写csdn,写的不好请见谅

每个项目都有自己独自的框架和架构,包括Activity。一般项目都会自己写一个抽象的Activity。让所有Activity继承它。方便用于项目管理和统一性,还有可维护性。

首先在项目底下创建一个base包,”base” 代表标准、基准的意思。当然有很多这包下面很多种类。例如 Fragment、网络请求等

创建一个抽象BaseActivity 继承appCompatActivity,

public abstract class BaseActivity extends AppCompatActivity
{

}

这时候可以导入第三方注入包 ( Butter Knife),节省开发效率、还有代码整洁性;

ButterKnife:控件地址


关于ButterKnife注入框架使用,在android studio 估计有点麻烦.(大神直接往下看)

第一步:在项目文件下的build.gradle(详情看图一)

buildscript{
    repositories{
        ....
        //添加Butter Knife注入;
        mavenCentral();
    }
    dependencies{
        ...
        //Butteer Knife
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}   
        详情图2

第二步:打开app文件下的build.gradle
    ...
    //Butter Knife注入
    apply plugin 'com.neenbedankt.android-apt'

    android{
        ....
    }

    dependencies{
        .....
        //Butter Knife注入
        compile 'com.jakewharton:butterknife:8.0.1'
        apt 'com.jakewharton:butterknife-compiler:8.0.1'
    }
    详情看图3:

然后点击右上角Sync Now (现在同步),就ok了
图1:
孙孙啊i 之项目实战(一) 创建BaseActivity_第1张图片
图2:
孙孙啊i 之项目实战(一) 创建BaseActivity_第2张图片
图3:
孙孙啊i 之项目实战(一) 创建BaseActivity_第3张图片


回到BaseActivity上,接下来介绍ButterKnife使用方法

重写BaseActivity里的setContentView三个方法。并且初始化ButterKnife

public abstract class BaseActivity extends AppCompatActivity
{
    ....
    /**
     *  使用频率高 一般用于Activity初始化界面
     *  例如 onCreate()里。初始化布局就用到setContentView(R.layout.xxxx) 就是初始化页面布局
     */
    @Override
    public void setContentView(int layoutResId){
        super.setContentView(layoutResId);
        //Butter Knife初始化
        ButterKnife.bind(this);
    }

    /**
     * 这个一般用于加载自定义控件,或者系统空间的布局
     */
    @Override
    public void setContentView(View view){
        super.setContentView(view);
        //Butter Knife初始化
        ButterKnife.bind(this);
    }

    /**
     *
     */
    @Override
    public void setContentView(View view,LayoutParams params){
        super.setContentView(view,params)
        //Butter Knife初始化
        ButterKnife.bind(this);
    }
    ...
}

这样我们就完成来一个ButterKnife初始化导入。在项目文件下创建一个名为”activity”的包(包的位置随便选,不局限创建在项目文件下)。创建一个新的Activity 并继承BaseActivity。

public class TestActivity extends BaseActivity
{
    /**
     *
     * 这是一个注入
     * 相当于  TextView mTestView = (TextView)findViewById(R.id.test);
     * 从上面看出,解决以前麻烦的findViewById,并且还要强制转换的时代了
     */
    @BindView(R.id.test)
    TextView mTextView;

    /**
     *
     * 如果你觉得上面还是麻烦, 这是多注入
     * 相当于 mTestView[0] = (EditView)findViewById(R.id.test_01);
     *          .....
     */
    @BindViews({R.id.test_01,R.id.test_02})
    EditText mTestViews[];

    /**
     * 如果你感觉每次从String.xml提取文字麻烦可以用
     * 相当于String name = getString(R.string.app_name)
     */
     @BindString(R.string.app_name)
     String mAppName;

    /**
     *
     * 这是一个点击事件
     *      相当于 findViewById(R.id.test).setOnClickListener(....)
     * @param v 这参数可有可无
     */
    @OnClick(R.id.test)
    void onTestClick(View v) {
        //代码块
    }

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

关于以上几个是在开发中比较常用的几个方法。

每次当创建一个Activity的时候,都要重写onCreate()方法,不知道大家都有种烦的感觉不?下面教大家一种省代码的方法,只需要重写一次onCreate()方法。

第一步:打开BaseActivity,重写onCreate()方法。创建一个抽象方法getLayoutResId();当需要展示布 局的时候直接getLayoutResId()就行了。

public abstract class BaseActivity extends AppCompatActivity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //用户在继承BaseActivity页面可以使用
        setContentView(getLayoutId());
    }

    /**
     * 这里用来返回res-->layout 里面布局
     */
     public abstract int getLayoutResId();

     .....
}

第二步在继承BaseActivity 重写getLayoutResId()方法

public class TestActivity extends BaseActivity
{
    /**
     * 返回布局
     * 其实就是把onCreate()方法里面的setContentView(R.layout.xxx)提取出来
     */
    @Override
    public int getLayoutResId()
    {
        return R.layout.activity_main;
    }
    ...
}

有人会问,如果要初始化数据那些咋办呢。没写onCreate()不行耶。

public abstract class BaseActivity extends AppCompatActivity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //用户在继承BaseActivity页面可以使用
        setContentView(getLayoutId());
        //初始化
        init();
    }

    /**
     * 这里用来返回res-->layout 里面布局
     */
     public abstract int getLayoutResId();

    /**
     * 初始化逻辑
     */
     public void init(){};

     .....
}

然后在继承BaseActivity页面重写init()方法就解决了无法初始化的问题了
public class TestActivity extends BaseActivity
{
    /**
     * 返回布局
     * 其实就是把onCreate()方法里面的setContentView(R.layout.xxx)提取出来
     */
    @Override
    public int getLayoutResId()
    {
        return R.layout.activity_main;
    }

    /**
     * 页面初始化
     */
     public void init(){
          //可以在这填写初始化
     }
    ...
}

当然不局限写init()这个方法初始化。例如initLogic(页面逻辑),initWeb(初始化网络) … 下面是我做的一张流程图。不怎么好 大家能借鉴一下。也希望大神在下面教我如何修改。欢迎指教

孙孙啊i 之项目实战(一) 创建BaseActivity_第4张图片

你可能感兴趣的:(项目实战)