Android 自定义控件(二)

来源:互联网 发布:java开源库存管理系统 编辑:程序博客网 时间:2024/06/16 12:45

自定义控件的方式有很多种,在自定义控件(一)中记录的是自定义属性后在控件的java代码中实例化原生控件,这次记录下通过引入布局文件自定义组合控件。

依然以传统的头部视图为例,左侧返回按钮,中间标题,右侧文字

第一步,实现布局文件。

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <RelativeLayout        android:layout_width="match_parent"        android:background="#ff7428"        android:layout_height="44dp">        <ImageView            android:id="@+id/iv_widget_header_left"            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:paddingLeft="15dp"            android:paddingRight="15dp"            android:src="@mipmap/icon_back"            />        <TextView            android:id="@+id/tv_widget_header_title"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="页面标题"            android:textColor="#ffffff"            android:textSize="18sp"            />        <TextView            android:id="@+id/tv_widget_header_right"            android:layout_width="wrap_content"            android:layout_height="match_parent"            android:layout_alignParentRight="true"            android:layout_alignParentEnd="true"            android:paddingLeft="15dp"            android:paddingRight="15dp"            android:gravity="center"            android:text="取消"            android:textColor="#ffffff"            android:textSize="15sp"            />    </RelativeLayout>    <View        android:id="@+id/widget_header_bottom"        android:layout_width="match_parent"        android:layout_height="1dp"        android:background="#eaeaea"/></LinearLayout>

第二步,在控件的java代码中引入布局控件,设计常用的方法设置标题或者点击事件监听器等。
public class HeaderWidget extends LinearLayout {    private ImageView leftIV;    private TextView titleTV;    private TextView rightTV;    public HeaderWidget(Context context) {        super(context);        init(context);    }    public HeaderWidget(Context context, AttributeSet attrs) {        super(context, attrs);        init(context);    }    private void init(Context context){        LayoutInflater inflater = LayoutInflater.from(context);        View view = inflater.inflate(R.layout.widget_header, null);        leftIV = (ImageView) view.findViewById(R.id.iv_widget_header_left);        titleTV = (TextView) view.findViewById(R.id.tv_widget_header_title);        rightTV = (TextView) view.findViewById(R.id.tv_widget_header_right);        addView(view);    }    public void setOnLeftListener(OnClickListener leftListener){        leftIV.setOnClickListener(leftListener);    }    public void setTitle(String title){        titleTV.setText(title);    }    public void setOnRightListener(OnClickListener rightListener){        rightTV.setOnClickListener(rightListener);    }}
注意,此处只是简单演示怎么设计,在项目中使用的时候需求会各种各样,大家再添加相应的方法。

第三部,在Activity的布局文件中使用此控件。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"     android:layout_width="match_parent"    android:layout_height="match_parent">        <com.superman.prettygirl.widget.HeaderWidget        android:id="@+id/hw_header"        android:layout_width="match_parent"        android:layout_height="wrap_content"        />    </LinearLayout>

第四步,在Activity中获取此控件并根据需要进行设置
public class TextHeaderWidgetActivity extends Activity {    private HeaderWidget headerWidget;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test_widget_header);        headerWidget = (HeaderWidget) findViewById(R.id.hw_header);        headerWidget.setOnLeftListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                finish();            }        });        headerWidget.setTitle("测试页面");        headerWidget.setOnRightListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Toast.makeText(TextHeaderWidgetActivity.this, "取消", Toast.LENGTH_SHORT).show();            }        });    }}
附加,再次升级一下,头部视图用的比较多,每次在布局文件中都写太重复了,使用include导入会方便很多。
<?xml version="1.0" encoding="utf-8"?><com.superman.prettygirl.widget.HeaderWidget    xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/hw_header"    android:layout_width="match_parent"    android:layout_height="wrap_content"    />

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <include layout="@layout/include_header_widget"/></LinearLayout>
一行代码,复制粘贴即可。




0 0