TitleBar在很多界面中都会用到,每个界面都编写一遍,效率太低,故学习了一下TitleBar的复用。
1. 在layout文件夹中定义一个title.xml文件:一个Button,表示back按键;一个TextView,表示该活动的标题
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@mipmap/ic_launcher"
android:layout_margin="10dp"
android:id="@+id/btn_title_back"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Title"
android:textSize="20sp"
android:layout_centerHorizontal="true"
android:id="@+id/tv_title_text"/>
</RelativeLayout>
2. 定义一个TitleLayout类,使其集成自LinearLayout,并包含一个TitleListen接口,利用接口,使每个Activity设置各自的back按键响应和title标题
public class TitleLayout extends LinearLayout implements View.OnClickListener {
private static final String TAG = "TitleLayout";
private Button btn_title_back;
public TextView tv_title_text;
private TitleListen listent;
public TitleLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
View titleLayout = LayoutInflater.from(context).inflate(R.layout.title, this);
btn_title_back = titleLayout.findViewById(R.id.btn_title_back);
tv_title_text = titleLayout.findViewById(R.id.tv_title_text);
btn_title_back.setOnClickListener(this);
}
public void setListent(TitleListen listent){
this.listent = listent;
tv_title_text.setText(listent.getTitleText());
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_title_back:
Log.e(TAG, "onClick: back");
listent.back();
break;
}
}
interface TitleListen{
void back();
String getTitleText();
}
}
感觉设置标题的位置有些怪,不知道有没有更合适的位置……
3. 每个Activity在实现各自的TitleLayout时,都要实现TitleListen,即实现自己的back按键响应,及标题内容。注意,要先把已有的TitleBar隐藏
public class MainActivity extends Activity{
private static final String TAG = "lyl123";
private TitleLayout my_title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
if (null != actionBar) {
actionBar.hide();
}
my_title = (TitleLayout) findViewById(R.id.my_title);
my_title.setListent(new TitleLayout.TitleListen() {
@Override
public void back() {
Log.e(TAG, "back()");
}
@Override
public String getTitleText() {
Log.e(TAG, "setTitleText()");
return "lyl";
}
});
Log.e(TAG, "onCreate()");
}
}
4. 该活动对应的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@mipmap/ic_launcher"
android:layout_margin="10dp"
android:id="@+id/btn_title_back"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Title"
android:textSize="20sp"
android:layout_centerInParent="true"
android:id="@+id/tv_title_text" />
</RelativeLayout>
写在最后:
例子很简单,通过接口来实现各自界面的标题,及back响应。但觉得不太严谨,尤其是各种模式,还不了解,以后要多学习、多体悟。