Android自定义ViewAndroid开发首页投稿(暂停使用,暂停投稿)

自定义View(一)组合View

2016-08-11  本文已影响276人  请你吃鱼

自定义View对于初学Android或许是一座很难逾越的大山,当然对于本人也不例外,但是我们总得要进步啊,本篇文章就对自定义View中最简单的自定义组合View做一个说明。


首先来看一个我们在开发过程中经常遇到的标题栏,熟悉的不能再熟悉了,那么布局文件大概可以这么写:

<RelativeLayout
        android:id="@+id/top"
        android:layout_width="match_parent"
        android:layout_height="@dimen/common_dian_44"
        android:background="@color/common_green">

        <ImageView
            android:id="@+id/back_image"
            android:layout_width="@dimen/common_dian_44"
            android:layout_height="match_parent"
            android:layout_centerVertical="true"
            android:background="@drawable/login_button_select"
            android:onClick="back"
            android:scaleType="center"
            android:src="@drawable/icon_common_back_image"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:text="@string/checkdata"
            android:textColor="@color/white"
            android:textSize="18sp"/>

    </RelativeLayout>

非常简单的代码,但是如果我们每个页面都有这么一个标题栏,难道我们都要这么写一遍吗?有人说我们可以使用include标签啊,的确可以,但是include仅仅是布局上的引用,如果这个布局需要有自己的逻辑呢,我们还是需要在activity中写一遍,倒不如全部写在自定义View,中那如果用自定义组合控件应该怎么做呢?
首先我们需要将上面的代码提取出来,创建一个布局文件,然后创建一个类继承RelativeLayout,重写构造方法并找到控件

 public BiaotiView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.biaoti_layout, this, true);
        iv = (ImageView) findViewById(R.id.back_iv);
        tv = (TextView) findViewById(R.id.title_tv);
    }

然后创建一个方法来设置标题

 public void setTitle(String title) {
        tv.setText(title);
 }

当然我们也可以通过attrs自定义属性,这里暂且不提,等到下一篇自定义View再讲。自定义组合View这样就好了,然后我们在布局文件中写上全名就可以显示了,但是这里还有一个问题,返回的监听事件怎么办呢,这里我们可以写一个接口,就像这样:

public void setOnBackListener(OnBackListener onBackListener) {
        this.onBackListener = onBackListener;
    }

    public BiaotiView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.biaoti_layout, this, true);
        iv = (ImageView) findViewById(R.id.back_iv);
        tv = (TextView) findViewById(R.id.title_tv);
        iv.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (onBackListener != null) onBackListener.back();
            }
        });
    }

    public interface OnBackListener {
        void back();
    }

然后再activity中使用的时候设置监听就可以啦。

biaotiView.setOnBackListener(new BiaotiView.OnBackListener() {
            @Override
            public void back() {
                finish();
            }
        });

好了,自定义组合View到这里就结束了,以后大家遇到重复使用的布局也可以这么做,不但节约时间,而且也可以使布局文件更加简洁,下篇文章我会说一下如何继承View从无到有自定义一个属于自己的控件。

上一篇下一篇

猜你喜欢

热点阅读