1. 程式人生 > >android-彈出鍵盤以及輸入框的設定

android-彈出鍵盤以及輸入框的設定

1、開啟Activity時先不彈出鍵盤

解決方案:

在AndroidManifest.xml中設定Activity與鍵盤的互動模式,即android:windowSoftInput屬性,它能影響兩個地方:

 1、產生焦點時,軟鍵盤是否隱藏;

 2、是否減少活動主視窗大小以便騰出空間放軟鍵盤

        
        <activity
            android:name=".MainActivity"
      	   android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

具體的一些屬性:

【A】stateUnspecified:軟鍵盤的狀態並沒有指定,系統將選擇一個合適的狀態或依賴於主題的設定
【B】stateUnchanged:當這個activity出現時,軟鍵盤將一直保持在上一個activity裡的狀態,無論是隱藏還是顯示
【C】stateHidden:使用者選擇activity時,軟鍵盤總是被隱藏
【D】stateAlwaysHidden:當該Activity主視窗獲取焦點時,軟鍵盤也總是被隱藏的
【E】stateVisible:軟鍵盤通常是可見的
【F】stateAlwaysVisible:使用者選擇activity時,軟鍵盤總是顯示的狀態
【G】adjustUnspecified:預設設定,通常由系統自行決定是隱藏還是顯示
【H】adjustResize:該Activity總是調整螢幕的大小以便留出軟鍵盤的空間
【I】adjustPan:當前視窗的內容將自動移動以便當前焦點從不被鍵盤覆蓋和使用者能總是看到輸入內容的部分

android:windowSoftInputMode="adjustPan"   鍵盤就會覆蓋螢幕 android:windowSoftInputMode="stateVisible|adjustResize"   螢幕整體上移

2、點選輸入框以外的地方隱藏軟體鍵盤

解決方案:參考:http://blog.csdn.net/mad1989/article/details/25069821

實現一個通用的BaseActivity,在裡面對點選事件進行處理,判斷是否點選到輸入框,如果是則顯示軟鍵盤,否則就隱藏

其中用到的一個知識點就是事件分發機制,原理流程如下:

(1)dispatchTouchEvent:
        此方法一般用於初步處理事件,因為動作是由此分發,所以通常會呼叫       
        super.dispatchTouchEvent。這樣就會繼續呼叫onInterceptTouchEvent,再由onInterceptTouchEvent決定事件流向。
(2)onInterceptTouchEvent:
        若返回值為True事件會傳遞到自己的onTouchEvent();
        若返回值為False傳遞到下一個view的dispatchTouchEvent();
(3)onTouchEvent():
        若返回值為True,事件由自己處理消耗,後續動作序列讓其處理;
        若返回值為False,自己不消耗事件了,向上返回讓其他的父view的onTouchEvent接受處理;

在此處,需要重寫dispatchTouchEvent裡面的方法。

實現:只有在MainActivity中寫一個EditText就能測試點選內部和外部鍵盤是否顯示了。

public class BaseActivity extends Activity {

	public boolean isShouldHideKeyBoard(View v, MotionEvent event) {
		// 如果獲取焦點的View存在並且是EditText
		if (v != null && (v instanceof EditText)) {
			int[] leftTop = { 0, 0 };
			// 獲取輸入框在螢幕中的位置
			v.getLocationInWindow(leftTop);
			int left = leftTop[0];
			int top = leftTop[1];
			int bottom = top + v.getHeight();
			int right = left + v.getWidth();

			// 判斷點選區域是否在EditText內部,是則保留EditText的事件
			if (event.getX() > left && event.getX() < right
					&& event.getY() > top && event.getY() < bottom) {
				return false;// 在EditText內部,不消耗該事件
			} else {
				return true;// 隱藏鍵盤
			}
		}
		return false;// 如果獲取焦點的View不是EditText,此處用就是原流程該怎麼分發事件就怎麼做
	}

	/**
	 * 事件分發,是否顯示鍵盤
	 */
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		// return super.dispatchTouchEvent(ev);
		// 如果是點選按下動作
		if (ev.getAction() == MotionEvent.ACTION_DOWN) {
			View v = getCurrentFocus();
			if (isShouldHideKeyBoard(v, ev)) {
				// 隱藏鍵盤
				InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				if (im != null) {
					im.hideSoftInputFromWindow(v.getWindowToken(), 0);
				}
			}
			return super.dispatchTouchEvent(ev);
		}
		if (getWindow().superDispatchTouchEvent(ev)) {
			return true;
		}
		return onTouchEvent(ev);

	}
}

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

3、輸入框輸入資料限制

情況一:只允許顯示數字、手機號等等

解決直接在XML佈局中設定inputType就行了

情況二:只允許一些事先設定好的數字或字母

解決直接在XML佈局中設定digist就行了

3、輸入框輸入後在鍵盤中點選實現搜尋

方案

解決直接在XML佈局中設定inputType就行了,然後在邏輯程式碼中實現,點選這些按鈕後的具體操作

佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/am_et_search"
        android:imeOptions="actionSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="只能輸入數字"
        android:inputType="number" />

    <EditText
        android:id="@+id/am_et_send"
        android:imeOptions="actionSend"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="只能輸入時間,鍵盤會多出/分割"
        android:inputType="datetime" />

    <EditText
        android:id="@+id/am_et_next"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="只能輸入密碼"
        android:inputType="textPassword" />

    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:digits="abcdefg123"
        android:hint="只允許輸入 abcdefg123,輸入其他是無效的。這個特點,可以用在密碼輸入框中,防止輸入中文密碼或者其他特殊字元" />

</LinearLayout>
邏輯程式碼
package com.hq.keyboarddemo;

import android.os.Bundle;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends BaseActivity {

	private EditText am_et_search, am_et_next, am_et_send;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		am_et_search = (EditText) findViewById(R.id.am_et_search);
		am_et_send = (EditText) findViewById(R.id.am_et_send);
		am_et_next = (EditText) findViewById(R.id.am_et_next);
		// 在程式碼中設定
		am_et_next.setImeOptions(EditorInfo.IME_ACTION_NEXT);

		am_et_search
				.setOnEditorActionListener(new TextView.OnEditorActionListener() {

					@Override
					public boolean onEditorAction(TextView v, int actionId,
							KeyEvent event) {
						if (actionId == EditorInfo.IME_ACTION_SEARCH
								|| (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
							Toast.makeText(getApplicationContext(),
									"點選了搜尋或者是回車鍵", Toast.LENGTH_LONG).show();
							return true;
						}
						return false;
					}
				});
		am_et_send
				.setOnEditorActionListener(new TextView.OnEditorActionListener() {

					@Override
					public boolean onEditorAction(TextView v, int actionId,
							KeyEvent event) {
						if (actionId == EditorInfo.IME_ACTION_SEND
								|| (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
							Toast.makeText(getApplicationContext(),
									"點選了傳送或回車	", Toast.LENGTH_LONG).show();
							return true;
						}
						return false;
					}
				});
		am_et_next
				.setOnEditorActionListener(new TextView.OnEditorActionListener() {

					@Override
					public boolean onEditorAction(TextView v, int actionId,
							KeyEvent event) {
						if (actionId == EditorInfo.IME_ACTION_NEXT
								|| (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
							Toast.makeText(getApplicationContext(),
									"點選了下一個或回車 ", Toast.LENGTH_LONG).show();
							return true;
						}
						return false;
					}
				});

	}
}






ddd