今天在自己嘗試製作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標題和顯示左右按鈕以及右鍵退出,是不是很方便?
附上效果圖: