Android自定义view——组合控件

来源:互联网 发布:固结快剪试验数据 编辑:程序博客网 时间:2024/05/17 03:19

前言

当我们需要使用标题栏时,很显然标题栏都是一样的,这个时候我们就很可能使用组合控件,既然是组合控件我们当然是把几个已有的控件组合到一起。这里我们打算实现如下效果:
这里写图片描述
组合两个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

原创粉丝点击