今天在自己尝试制作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标题和显示左右按钮以及右键退出,是不是很方便?
附上效果图: