Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android自定义view——组合控件

$
0
0

前言

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

作者:qiaoshi96_bk 发表于2017/8/4 15:18:47 原文链接
阅读:146 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>