再來看一個群組控制項,帶刪除按鈕的EidtText。即在使用者輸入後,會出現刪除按鈕,點擊即可取消使用者輸入。首先寫一個自訂控制項的布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/et" android:layout_width="fill_parent" android:layout_height="wrap_content" android:singleLine="true" /> <ImageButton android:id="@+id/ib" android:visibility="gone" android:src="@drawable/menu_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#00000000" android:layout_alignRight="@+id/et" /> </RelativeLayout>
實現輸入框右側帶按鈕效果,注意將按鈕隱藏。然後寫一個EditCancel類,實現刪除使用者輸入功能。這裡用到了TextWatch這個介面,監聽輸入框中的文字變化。使用也很簡單,實現他的三個方法即可。看代碼:
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
public class EditCancel extends LinearLayout implements EdtInterface {
ImageButton ib;
EditText et;
public EditCancel(Context context) {
super(context);
}
public EditCancel(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.custom_editview, this, true);
init();
}
private void init() {
ib = (ImageButton) findViewById(R.id.ib);
et = (EditText) findViewById(R.id.et);
et.addTextChangedListener(tw);// 為輸入框綁定一個監聽文字變化的監聽器
// 添加按鈕點擊事件
ib.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hideBtn();// 隱藏按鈕
et.setText("");// 設定輸入框內容為空白
}
});
}
// 當輸入框狀態改變時,會調用相應的方法
TextWatcher tw = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
// 在文字改變後調用
@Override
public void afterTextChanged(Editable s) {
if (s.length() == 0) {
hideBtn();// 隱藏按鈕
} else {
showBtn();// 顯示按鈕
}
}
};
@Override
public void hideBtn() {
// 設定按鈕不可見
if (ib.isShown()) ib.setVisibility(View.GONE);
}
@Override
public void showBtn() {
// 設定按鈕可見
if (!ib.isShown()) ib.setVisibility(View.VISIBLE);
}
}
interface EdtInterface {
public void hideBtn();
public void showBtn();
}
在TextWatch介面的afterTextChanged方法中對文字進行判斷,若長度為0,就隱藏按鈕,否則,顯示按鈕。
另外,實現ImageButton(即那個叉)的點擊事件,刪除輸入框中的內容,並隱藏按鈕。