Android Studio EditText點擊表徵圖清除常值內容的執行個體解析_Android

來源:互聯網
上載者:User

 這篇文章是繼自訂EditText樣式之後的功能強化,對於實際應用項目有很大的參考意見,感興趣的朋友可以移步上一篇,”Android Studion自訂EditText樣式”.具體清除EditText常值內容功能代碼如下:

package com.liheng;import android.content.Context;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v4.content.ContextCompat;import android.text.Editable;import android.text.TextWatcher;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.EditText;import myself.myapplication.R;/*** 第一步:* 建立一個類,並繼承EditText這個類,實現父類的三個建構函式* 我們只用實現帶一個參數,兩個參數,三個參數的建構函式,帶四個參數的暫且不管*/public class MyEditText extends EditText {/*** 第二步:* 聲明3個變數: 兩個圖片對象(變數的值是通過執行個體化對象得到的,* 在JAVA世界裡,除了基礎資料型別 (Elementary Data Type)和靜態成員不是對象外,* 其他一切都是對象.類也是一個對象,類是Class類的對象,圖片是drawable類的對象)* 1.當EditText常值內容為空白的時候,右側清空表徵圖應為灰色,此時點擊是沒有任何效果的* 2.當EditText常值內容不為空白的時候,右側清空表徵圖應為藍色,此時點擊,清空EditText常值內容* 3.內容物件*/private Drawable imageBlue;private Drawable imageGray;private Context myContext;/*** 實現EditText父類的三個構造方法* 這三個方法必須調用自訂的初始化函數 init()方法*/public MyEditText(Context context) {super(context);init(context);}public MyEditText(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}/*** 初始化方法:用於初始化聲明的三個全域變數 :imageBlue,imageGray,myContext* 並負責監聽EditText常值內容的更改*/private void init(Context context){this.myContext = context;/*** 得到圖片資源:* 第一種方式:(已淘汰,不推薦使用,* 還應注意R檔案匯入的包應為自己項目下的包,* 因為圖片資源在自己項目目錄下):* imageBlue = myContext.getResources().getDrawable(R.drawable.delete);** 第二種方式:(網友推薦,項目會報錯?)* 調用getDrawable()帶兩個參數的方法.第二參數置為null* imageBlue = myContext.getResources().getDrawable(R.drawable.delete, null);** 第三種方式:(Google官方推薦使用) ,myContext為自己聲明的內容物件* imageBlue = ContextCompat.getDrawable(myContext, R.drawable.delete);*/imageBlue = ContextCompat.getDrawable(myContext, R.drawable.delete);imageGray = ContextCompat.getDrawable(myContext, R.drawable.delete_gray);/*** 設定文字監聽器(EditText常值內容改變時,會觸發對應的回呼函數)* onTextChanged() EditText常值內容更改時觸發* beforeTextChanged() EditText常值內容更改前觸發* afterTextChanged() EditText常值內容更改後觸發** 對於此項目,清空EditText應在EditText常值內容更改後觸發**/addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {//文字改變後設定清空圖片的位置setImage();}});//初始的時候也應設定清空圖片的位置setImage();}/*** 設定圖片位置方法* 當length()大於0,即 EditText裡面有常值內容的時候,圖片為藍色* 當 length()小於0,即 EditText裡面沒有常值內容的時候,圖片為灰色* setCompoundDrawablesWithIntrinsicBounds() 四個參數代表左上右下*/private void setImage(){if (length()>0) {setCompoundDrawablesWithIntrinsicBounds(null,null,imageBlue,null);}else{setCompoundDrawablesWithIntrinsicBounds(null, null, imageGray, null);}}public boolean onTouchEvent(MotionEvent event){switch (event.getAction()){//匹配手指離開EditTextcase MotionEvent.ACTION_UP://得到手指離開EditText時的X Y座標int x = (int) event.getRawX();int y = (int) event.getRawY();//建立一個長方形Rect rect = new Rect();//讓長方形的寬等於edittext的寬,讓長方形的高等於edittext的高getGlobalVisibleRect(rect);//把長方形縮短至右邊50個寬度內rect.left = rect.right - 50;//如果x和y座標在長方形當中,說明你點擊了右邊的xx圖片,清空輸入框if(rect.contains(x,y)){setText("");}break;default:break;}return super.onTouchEvent(event);}}

自訂的MyEditText這個類實際跟我們在layout布局檔案裡面拖的EditText控制項是一樣的,因為MyEditText繼承自父類EditText.只不過我們在layout布局檔案裡面調用的時候應包括完整包名,如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"android:layout_width="match_parent" android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="myself.myapplication.MainActivity"><com.liheng.MyEditTextandroid:layout_width="500dp"android:layout_height="50dp"android:inputType="textPersonName"android:text="Name"android:ems="10"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_marginLeft="45dp"android:layout_marginStart="45dp"android:layout_marginTop="49dp"android:id="@+id/editText"android:paddingLeft="10dp"android:paddingRight="10dp"android:background="@drawable/select_edittext"/><com.liheng.MyEditTextandroid:layout_width="500dp"android:layout_height="50dp"android:inputType="textPersonName"android:text="Name"android:ems="10"android:layout_below="@+id/editText"android:layout_alignLeft="@+id/editText"android:layout_alignStart="@+id/editText"android:layout_marginTop="89dp"android:id="@+id/editText2"android:paddingLeft="10dp"android:background="@drawable/select_edittext"/></RelativeLayout>

附上實際效果圖:

仔細觀察可以發現,第一個輸入框的清空表徵圖往左靠了一點,這是因為我在第一個輸入框的xml布局檔案裡面加了 android:paddingRight=”10dp” 這一行代碼.如此一來,對於清空表徵圖的位置,我們可以根據手機解析度大小做具體調整.

表徵圖素材:


以上所述是小編給大家介紹的Android Studio EditText點擊表徵圖清除常值內容,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.