Android笔记——组合控件实现自定义View之可清空内容的E
2021-03-29 本文已影响0人
麦香菌
之前用输入框时是用的别人的框架MaterialEditText,但看该框架似乎没有一键清空输入框的功能,所以迫不得已自己写了一个。
一开始想是自定义View,要用Java动态写各个控件的布局等等,觉得很麻烦,后来发现可以先在layout里写控件的布局,然后用类继承RelativeLayout(前面写的布局是用的RelativeLayout)并加载写好的组合控件就可以实现自定义View。
1.public_edittext
首先是组合控件的代码和实现效果
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="@dimen/pedit_hight"
android:background="@drawable/white_border_grey">
<TextView
android:id="@+id/txt_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="提示"
android:layout_marginLeft="10dp"
android:textColor="@color/black"
android:textSize="@dimen/text_size_18"/>
<EditText
android:id="@+id/edt_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toRightOf="@+id/txt_tip"
android:layout_marginLeft="30dp"
android:textCursorDrawable="@drawable/edit_cursor"
android:layout_toLeftOf="@+id/img_empty"
android:layout_marginRight="10dp"
android:background="@null"/>
<ImageView
android:id="@+id/img_empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/empty"
android:layout_alignParentRight="true"
android:visibility="visible"/>
</RelativeLayout>
效果图.png
2.PublicEdit.java
然后编写一个class继承RelativeLayout,再加载public_edittext,并为该控件编写自定义属性。
自定义的属性首先要在values中创建attrs.xml文件,并在里面编写具体的自定义属性。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="PublicEdit">
<attr name="tip" format="string" />
<attr name="empty" format="boolean" />
<attr name="hint" format="string"/>
</declare-styleable>
</resources>
自定义View的源码如下。
package com.mils.banke.publicWidget;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.mils.banke.R;
public class PublicEdit extends RelativeLayout {
private TextView txt_tip;
private ImageView img_empty;
private EditText edt_content;
private String tip;
private Boolean empty;
private String hint;
public void initView(Context context){
View.inflate(context, R.layout.public_edittext, this);
txt_tip = (TextView)findViewById(R.id.txt_tip);
img_empty = (ImageView)findViewById(R.id.img_empty);
edt_content = (EditText)findViewById(R.id.edt_content);
}
public PublicEdit(Context context) {
super(context);
initView(context);
}
public PublicEdit(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.PublicEdit);
tip = ta.getString(R.styleable.PublicEdit_tip);
empty = ta.getBoolean(R.styleable.PublicEdit_empty, false);
hint = ta.getString(R.styleable.PublicEdit_hint);
initWidget(tip,empty, hint);
}
public PublicEdit(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void setContentHint(String hint){
edt_content.setHint(hint);
}
private void initWidget(String tip, Boolean empty, String hint){
txt_tip.setText(tip);
if (empty){
img_empty.setVisibility(VISIBLE);
img_empty.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
edt_content.setText("");
}
});
}
else
img_empty.setVisibility(GONE);
edt_content.setHint(hint);
}
}
3.控件使用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/lightgrey">
<include
android:id="@+id/public_header"
layout="@layout/public_header"/>
<com.mils.banke.publicWidget.PublicEdit
android:id="@+id/pedt_name_ue"
android:layout_width="match_parent"
android:layout_height="@dimen/pedit_hight"
android:layout_below="@+id/public_header"
app:tip="姓名"
app:empty="true"
android:layout_marginTop="30dp"/>
<com.mils.banke.publicWidget.PublicEdit
android:id="@+id/pedt_snumber_ue"
android:layout_width="match_parent"
android:layout_height="@dimen/pedit_hight"
android:layout_below="@+id/pedt_name_ue"
app:tip="学号"
app:empty="true"
android:layout_marginTop="30dp"/>
<com.mils.banke.publicWidget.PublicEdit
android:id="@+id/pedt_gender_ue"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/pedt_snumber_ue"
app:tip="性别"
android:layout_marginTop="30dp"/>
<com.mils.banke.publicWidget.PublicEdit
android:id="@+id/pedt_school_ue"
android:layout_width="match_parent"
android:layout_height="@dimen/pedit_hight"
android:layout_below="@+id/pedt_gender_ue"
app:tip="学校"
android:layout_marginTop="30dp"/>
<com.mils.banke.publicWidget.PublicEdit
android:id="@+id/pedt_department_ue"
android:layout_width="match_parent"
android:layout_height="@dimen/pedit_hight"
android:layout_below="@+id/pedt_school_ue"
app:tip="院系"
android:layout_marginTop="30dp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/pedt_department_ue"
android:layout_marginTop="60dp"
android:background="@drawable/btn_rounded_blue"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:text="确认修改"
android:textColor="@color/white"/>
</RelativeLayout>