android——打造超級方便的一鍵式添加型Title

今天在自己嘗試製作App,使用以前的老辦法自定義一個title,寫着寫着發覺很不方便:1,每個界面都有title,一直重複爲每個界面添加特別麻煩。2,不同的界面有不同的要求,有的界面之又返回鍵,有的界面有返回鍵和更多選項。

雖然以上兩個問題非常說起來很簡單,但是做起來代碼量真的非常大,於是開始想有沒有一種辦法可以用幾行代碼就控制title的添加與移除?更改title名稱?或者說爲每個右選項按鈕設置不同的點擊事件?

答案肯定是有的,如果是新手,請跟着文章的思路一直往下走,不要急。這裏就要用到自定義view的知識啦,首先我們創建一個TitleBar的類,並且製作一個title樣式:

xml

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#9089B3">

        <ImageView
            android:id="@+id/back"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:background="@drawable/back"
            android:visibility="gone" />

        <TextView
            android:id="@+id/activity_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:textColor="@android:color/white"
            android:textSize="25dp"
            tool:text="hahahahahah" />

        <ImageView
            android:id="@+id/more"
            android:layout_width="60dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="@drawable/more"
            android:visibility="gone" />

    </RelativeLayout>
</LinearLayout>

左右兩邊各一個按鈕,默認隱藏,需要的時候設置顯示,中間一個標題,根據不同的頁面設置不同的標題,這裏要說明一下爲什麼我們還要在外面嵌套一個LinaerLayout,因爲我們的思路是,將主頁面的佈局,添加到這個title下面,實現自動添加title,可能說起來比較難理解,我用一個圖畫給大家表示:

首先我們創建的title是一個這樣的佈局文件:


我們將每個需要使用title的頁面添加到紅框下方,這樣就實現了自動添加title了,這裏我們需要創建一個TitleBar類來加載紅框的title佈局

TitleBar類:

package com.example.administrator.bortherhotpot;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**  * Created by Administrator on 2018/3/8.  */  public class TitleBar extends RelativeLayout implements View.OnClickListener {
    public TextView title;
    public ImageView back, more;


    public TitleBar(Context context) {
        super(context);
    }

    public TitleBar(Context context, int res) {
        super(context);
        LayoutInflater from = LayoutInflater.from(context);
        LinearLayout view = (LinearLayout) from.inflate(R.layout.activity_title, this, false);
        title = view.findViewById(R.id.activity_title);
        back = view.findViewById(R.id.back);
        more = view.findViewById(R.id.more);
        view.addView(from.inflate(res, view, false));
        addView(view);
    }

    public TitleBar(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);

    }

    @Override  public void onClick(View v) {
        switch (v.getId()) {
            case R.id.back:
                ((BaseActivity) getContext()).finish();
                break;
            case R.id.more:
                ((BaseActivity) getContext()).onClickRight();
                break;
        }
    }
}

這裏設置TitleBar這個類繼承相對佈局,並且將我們的佈局文件添加到view上面,初始化控件,然後添加我們的頁面佈局,爲每個控件設置好監聽,左鍵設置點擊之後當前佈局關閉,右鍵設置點擊之後調用我定義的onClickRight()方法。

到了這裏這個東西就初步完成了,但是我們還沒有達到上面一行代碼添加title的要求,這裏,我們就可以創建一個BaseActivity繼承Activity,再用我們的每個界面的Activity繼承BaseActivity。

至於BaseActivity裏面應該添加什麼,代碼如下:

package com.example.administrator.bortherhotpot;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

/**  * Created by Administrator on 2018/3/8.  */  public abstract class BaseActivity extends Activity {
    private TitleBar title;

    @Override  protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public void setContentView(int res) {
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
ViewGroup.LayoutParams.WRAP_CONTENT);
        title = new TitleBar(this, res);
        title.setLayoutParams(layoutParams);
        super.setContentView(title);
        initView();
    }

    public abstract void initView();

    public void setDefule() {
        title.back.setVisibility(View.VISIBLE);
    }

    public void setMiddleTitle(String s) {
        title.title.setText(s);
    }

    public void setRightTitle() {
        title.more.setVisibility(View.VISIBLE);
    }

    public void onClickRight() {
    }
}

這裏和普通的Activity寫法差不多,唯一不同的,就是我們將setContentView卸載了oncreat方法的外面,爲什麼呢?這裏如果不懂的同學可以去源碼看看setContenView的介紹,setContentView()可以傳入幾個參數,其中一種就是資源id,這裏就是使用的這個方法,拿到了我們每個繼承自BaseActivity的Activity的佈局id,然後我們爲之前的Title設置顯示方式,再創建一個抽象類,用於調用下方的四種方法。

寫完之後,我們就可以寫頁面了,

MainActivity:

package com.example.administrator.bortherhotpot;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends BaseActivity {

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

    }

    @Override  public void initView() {
        setDefule();
        setMiddleTitle("hahah");
        setRightTitle();
    }
}

看,僅僅三行代碼,就添加了title並且設置了title標題和顯示左右按鈕以及右鍵退出,是不是很方便?

附上效果圖: