1. 程式人生 > >EditText不消失的提示文字,在提示文字後進行輸入

EditText不消失的提示文字,在提示文字後進行輸入

先給個效果圖來說明本文要實現的目的:

輸入前效果:

輸入後的效果:

        一般來講,輸入框的提示文字都是用類似android:hint="手機號/郵箱"”的hint屬性來進行設定的,但hint只是在輸入框為空的時候才顯示提示文字,因此,如果想實現提示文字一直存在,並且使用者輸入時從提示文字之後開始輸入內容,那麼就需要對EditText動動“手腳”了。

(android:drawableLeft和圖片相結合的實現方法在此就不討論了,因為一旦修改文字就必須更換圖片,筆者不推薦。)

首先我們編寫一個繼承自EditText的類,覆蓋它的onDraww方法,關鍵程式碼如下:

public class ABC extends EditText {

	public ABC(Context context) {
		super(context);
	}  
	
	@Override
	public void onDraw(Canvas canvas){
		Paint paint = new Paint();
		paint.setTextSize(28);
		paint.setColor(Color.RED);
		canvas.drawText("請輸入您的名字:", 15, 55, paint);
		super.onDraw(canvas);
	}
}
這裡的類名可以隨便取,筆者以ABC代替。當然,EditText的字號、顏色等都可以自己設定,“15,55”是提示文字的xy位置,可以根據需要設定。

其實以上程式碼是會出現錯誤的,先暫時放著,下文會有交待。

在佈局檔案xml中建立一個EditText,關鍵程式碼如下:

<com.yourname.ABC
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="120dp"
        android:ems="10" />
設定的paddingLeft是為了給提示文字預留120dp的顯示位置。com.yourname.ABC則是你的ABC.java檔案所在的包名。

到了這裡,大家會看到如下的情景:

這是因為我們建立的EditText是用XML佈局檔案中的這些引數,我們的構造器要載入這些引數,並把它們傳遞給父類的構造器。

那就是構造器沒寫完整,其實很簡單,新增幾行程式碼即可,完整的關鍵程式碼如下:

public class ABC extends EditText {

	public ABC(Context context) {
		super(context);
	}  
	      
	    public ABC(Context context, AttributeSet attrs, int defStyle) {  
	        super(context, attrs, defStyle);  
	    }  
	  
	    public ABC(Context context, AttributeSet attrs) {  
	        super(context, attrs);  
	    }
	
	@Override
	public void onDraw(Canvas canvas){
		Paint paint = new Paint();
		paint.setTextSize(28);
		paint.setColor(Color.RED);
		canvas.drawText("請輸入您的名字:", 15, 55, paint);
		super.onDraw(canvas);
	}
}
這下就不會有問題了。執行後的效果便如本文開頭所示。