這里自定義了一個RightPicClickEditText,繼承AppCompatEditText证芭,并且在其三個構造函數(shù)中調(diào)用父組件的相應構造函數(shù),是為了適配5.0以下應用MD風格疮方,代碼如下:
public RightPicClickEditText(Context context) {
super(context);
init();
}
public RightPicClickEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RightPicClickEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
我們或許還需要定義一個右側(cè)圖標變量的引用悍募,你可以對這個右側(cè)圖標干些自定義的事,代碼如下:
/**
* EditText右側(cè)的圖標
*/
protected Drawable mRightDrawable;
private void init() {
mRightDrawable = getCompoundDrawables()[2];
if (mRightDrawable == null) {
//這里當沒有設置右側(cè)圖標時你可以給它設置個默認的右側(cè)圖標常侦,當然根據(jù)你的項目需求來
return;
}
//這里當設置了右側(cè)圖標時,我們對圖標做了一些自定義設置贬媒,你也可以做其他設置
mRightDrawable.setBounds(0, 0, mRightDrawable.getIntrinsicWidth(), mRightDrawable.getIntrinsicHeight());
}
最關鍵的來了聋亡,我們需要重寫自定義EditText的觸摸事件onTouchEvent,這里我們通過判斷觸摸的坐標位置是否在右側(cè)圖標范圍內(nèi)來模擬右側(cè)圖標的點擊事件际乘。如果在這個范圍內(nèi)坡倔,則證明點擊了右側(cè)圖標,為了方便外部調(diào)用處理脖含,我們定義了一個接口在這里回調(diào)罪塔,一旦點擊了右側(cè)圖標,則觸發(fā)接口回調(diào)养葵。代碼如下:
public void setRightPicOnclickListener(RightPicOnclickListener rightPicOnclickListener) {
this.rightPicOnclickListener = rightPicOnclickListener;
}
public interface RightPicOnclickListener {
void rightPicClick();
}
private RightPicOnclickListener rightPicOnclickListener;
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (mRightDrawable != null) {
boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())
&& (event.getX() < ((getWidth() - getPaddingRight())));
if (touchable) {
//設置點擊EditText右側(cè)圖標EditText失去焦點征堪,
// 防止點擊EditText右側(cè)圖標EditText獲得焦點,軟鍵盤彈出
setFocusableInTouchMode(false);
setFocusable(false);
//點擊EditText右側(cè)圖標事件接口回調(diào)
if (onRightPicClickListener != null) {
onRightPicClickListener.rightPicClick(this);
}
} else {
//設置點擊EditText輸入?yún)^(qū)域关拒,EditText請求焦點佃蚜,軟鍵盤彈出,EditText可編輯
//setFocusableInTouchMode(true);
//setFocusable(true);
//設置點擊EditText輸入?yún)^(qū)域着绊,EditText不請求焦點谐算,軟鍵盤不彈出,EditText不可編輯
setFocusableInTouchMode(false);
setFocusable(false);
}
}
}
return super.onTouchEvent(event);
}
外部應用就簡單了归露,示例代碼如下:
<cn.jackro.rightpicclickedittext.RightPicClickEditText
android:id="@+id/right_click_et"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableRight="@android:drawable/ic_menu_search"
android:hint="@string/click_hint"
android:inputType="text"
android:maxLines="1"
tools:ignore="RtlHardcoded"/>
public class MainActivity extends AppCompatActivity implements RightPicClickEditText.OnRightPicClickListener {
@BindView(R.id.right_click_et)
RightPicClickEditText mRightClickEt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mRightClickEt.setOnRightPicClickListener(this);
}
@Override
public void rightPicClick(EditText editText) {
Toast.makeText(this, "點擊了搜索按鈕", Toast.LENGTH_SHORT).show();
}
}
實現(xiàn)這樣一個功能洲脂,我們除了像上面這樣干之外,還可以直接使用布局包裹一個EditText和一個ImageView剧包,然后給ImageView設置點擊事件即可恐锦,這種方法稍微簡單點往果。