前言
当我们需要使用标题栏时,很显然标题栏都是一样的,这个时候我们就很可能使用组合控件,既然是组合控件我们当然是把几个已有的控件组合到一起。这里我们打算实现如下效果:
组合两个button和一个TextView来模拟标题栏
对ActionBar的处理
我们自定义了标题栏我们便可以将原有的actionBar给隐藏,此时在MainActivity里:
// 隐藏Actionbar
ActionBar actionBar = getSupportActionBar();
if (actionBar!=null){
actionBar.hide();
}
定义布局
既然是组合控件我们当然需要先定义一个布局把我们的两个Button和一个textView给关联起来
于是我们定义一个zidingyi.xml
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#ff6677"
android:orientation="horizontal">
<Button
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="返回"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="主题页"
android:gravity="center"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/go"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="更多" />
</RelativeLayout>
到这里我们布局就基本实现了如果我们想要引用该布局必然得重写RelativeLayout因为此时我们的具体布局都包含在这个RelativeLayout布局里面。所以接着我们
定义Title类继承RelativeLayout
public class Title extends RelativeLayout{
//重写构造方法
public Title(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.zidingyi,this);
}
LayoutInflater.from(context).inflate(R.layout.zidingyi,this);
//加载我们定义好的布局
其实到这我们自定义布局差不多就完成了,此时只需要在activity_main.xml引用
<com.example.administrator.zidingyiview.Title
android:id="@+id/gg"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.administrator.zidingyiview.Title>
我们就算实现效果了,但是大家肯定想过,这样的话我们的这个自定义控件也没什么意义啊,我们使用include也可以实现这种效果,的确如此 ,因为我们的按钮没有监听事件,我们的TextView也不可以设置字体颜色字体大小等等,何谈自定义。所以我们继续来完善它
设置监听
由于我们的标题栏需要在多个Activity里面使用很显然我们不可以把监听写死,这时我们需要面向接口了
在我们的Title.class里面
// 重写里面的点击事件的接口
public interface setOnclick{
void Butt1(View view);
void Butt2(View view);
void Titles(View view);
}
并在Title方法中
LayoutInflater.from(context).inflate(R.layout.zidingyi,this);
//获取控件id
Button back=findViewById(R.id.back);
Button go=findViewById(R.id.go);
titles = findViewById(R.id.textView);
//设置监听
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (listener!=null){
//通过接口回调
listener.Butt1(view);
}
}
});
go.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if (listener!=null){
listener.Butt2(view);
}
}
});
titles.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
listener.Titles(view);
}
});
可以看到我们获取了组合控件的id并且设置他们的监听事件只不过我们没有写死只是通过接口,这时
我们需要定义方法来来接收我们具体实现的点击事件
setOnclick listener;
public void setListener(setOnclick listener){
this.listener=listener;
}
到这我们的Title类就完成了
我们只需要在MainActivity里面
public class MainActivity extends AppCompatActivity implements Title.setOnclick{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 隐藏Actionbar
ActionBar actionBar = getSupportActionBar();
if (actionBar!=null){
actionBar.hide();
}
// 设置自己的标题栏
Title gg=(Title)findViewById(R.id.gg);
gg.setListener(this);
}
@Override
public void Butt1(View view) {
Toast.makeText(MainActivity.this,"对返回的具体操作",Toast.LENGTH_LONG).show();
}
@Override
public void Butt2(View view) {
Toast.makeText(MainActivity.this,"对进入的具体操作",Toast.LENGTH_LONG).show();
}
@Override
public void Titles(View view) {
Toast.makeText(MainActivity.this,"对标题的具体操作",Toast.LENGTH_LONG).show();
}
}
实现我们自己写的接口 Title.setOnclick,重写我们的三个监听就可以做自己具体的点击事件操作了
到这里大家会发现还是差一步啊,如何我们想要对控件的大小颜色字体等更改时如何实现呢?
所以 我们继续实现,这里以TextView为例
实现对控件的细节等更改
首先要在values下面 新建attrs.xml文件,里面具体代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Title">
<attr name="Title_name" format="color"/>//设置标题颜色
<attr name="Title_Size" format="float"/>//设置标题字体大小
<attr name="Title_Font" format="string"/>//设置标题上面显示的内容
</declare-styleable>
</resources>
我们还需要在Title.clases里面实现最后一步,把我们的attrs里属性获取到
if (attrs!=null){
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.Title);
int color = array.getColor(R.styleable.Title_Title_name, Color.BLACK);//颜色
float aFloat = array.getFloat(R.styleable.Title_Title_Size, 12);//字体大小
String s = array.getString(R.styleable.Title_Title_Font);
if (TextUtils.isEmpty(s)){
titles.setText(getResources().getString(R.string.app_name));//这个是如果我们没有设置标题默认工程名字
}else {
titles.setText(s);
}
titles.setTextSize(aFloat);
titles.setTextColor(color);
array.recycle();
}
记得当用完array时一定得array.recycle();否则很容易 内存泄漏
最后在我们的activity_main.xml里面
<com.example.administrator.zidingyiview.Title
android:id="@+id/gg"
app:Title_name="#ff7"
app:Title_Size="20"
app:Title_Font="首页"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.administrator.zidingyiview.Title>
到这我们就大功告成了,我们既可以实现按钮的点击监听也可以实现对里面的属性设置了,具体效果见上图啦。
完整dome下载地址
http://download.csdn.net/detail/qiaoshi96_bk/9921248