一步一步手撸Android通用框架 (四)

手撸一个基类通用视图

相信大家项目几乎都会用到标题栏吧?标题栏几乎每个页面都会用到,而标题栏的尺寸也是一致,所以公共的东西,我们要尽量抽取和复用,所以这里我们提取标题栏到基类,让我们继承基类就能自动加载标题栏,同时我们子类又能灵活控制。

标题栏布局文件编写:include_title_bar.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="45dp"
    android:background="@color/colorPrimary"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:src="@drawable/common_top_back" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="首页"
        android:textColor="@color/white"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/tv_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="10dp"
        android:text="保存"
        android:textColor="@color/white"
        android:textSize="12sp" />


RelativeLayout>

基类布局文件编写:activity_base.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


LinearLayout>

include_title_bar.xml布局预览:

一步一步手撸Android通用框架 (四)_第1张图片

改造之前的BaseActivity

/**
 * Activity基类
 * Created by Chao on 2017-12-23.
 */

public abstract class BaseActivity extends AppCompatActivity implements BaseInterFace {
    protected Context mContext;
    LinearLayout ll_content;
    ImageView iv_back;
    TextView tv_title;
    TextView tv_right;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.activity_base);
        ll_content = findViewById(R.id.ll_content);
        init();
    }

    private void init() {
        initContent();
        FindView.bind(this);
        initView();
        initData();
        initListener();
    }

    private void initContent() {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        if (showTitleBar()) {
            View titleBar = inflater.inflate(R.layout.include_title_bar, ll_content);
            iv_back = titleBar.findViewById(R.id.iv_back);
            tv_title = titleBar.findViewById(R.id.tv_title);
            tv_right = titleBar.findViewById(R.id.tv_right);
            iv_back.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onBackPressed();//这里复写返回键监听,默认关闭当前页面,免去子类设置监听,麻烦。
                }
            });
            setTitleBar(iv_back, tv_title, tv_right);
        }
        inflater.inflate(getLayout(), ll_content);
    }

    @Override
    public void initView() {

    }

    @Override
    public void initData() {

    }

    @Override
    public void initListener() {

    }

    /**
     * 是否加载标题栏,子类可复写
     */
    protected boolean showTitleBar() {
        return true;
    }

    protected abstract void setTitleBar(ImageView iv_back, TextView tv_title, TextView tv_right);

}

测试:

一步一步手撸Android通用框架 (四)_第2张图片

一步一步手撸Android通用框架 (四)_第3张图片

至此,只要我们继承BaseActivity,就会默认附带标题栏,子类可以复写showTitleBar()控制显示。

    @Override
    protected boolean showTitleBar() {
        return false;
    }

在子类设置和显示标题栏内容:

    @Override
    protected void setTitleBar(ImageView iv_back, TextView tv_title, TextView tv_right) {
        tv_title.setText("这是标题");
    }

以上三个控件分别代码返回键,标题,右边文本控件,可以随意设置或者GONE。

这会儿有事要出门了,下次继续扩展。

源码地址:https://github.com/zhangzhichaolove/BasicsFrame

你可能感兴趣的:(Android)