1. 程式人生 > >Android 自定義軟鍵盤

Android 自定義軟鍵盤

package com.huyu.test;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

import android.app.Activity;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.Keyboard.Key;
import android.inputmethodservice.KeyboardView;
import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;
import android.text.Editable;
import android.text.InputType;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

public class KeyboardUtil {
	private KeyboardView keyboardView;
	private Keyboard k1;// 字母鍵盤
	private Keyboard k2;// 數字鍵盤
	public boolean isnun = false;// 是否資料鍵盤
	public boolean isupper = false;// 是否大寫
	public boolean isShow = false;// 是否顯示
	

	private EditText ed;

	public KeyboardUtil(EditText edit) {
		this.ed = edit;
		Activity act = (Activity) this.ed.getContext();
		k1 = new Keyboard(act, R.xml.letter);
		k2 = new Keyboard(act, R.xml.symbol);
		
		keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view);
		keyboardView.setKeyboard(k2);
		keyboardView.setEnabled(true);
		keyboardView.setPreviewEnabled(true);//設定鍵盤提示的view  
		keyboardView.setOnKeyboardActionListener(listener);
		
		setSoftKeyboradHide(act, edit);
	}

	/**
	 * 這是在處理光標出現的問題
	 * @param ctx
	 * @param edit
	 */
	private void setSoftKeyboradHide(Activity ctx,EditText edit){
//		if (android.os.Build.VERSION.SDK_INT <= 10) { 
//			edit.setInputType(InputType.TYPE_NULL); 
//		} else {
			ctx.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
			try { 
				Class cls = EditText.class; 
				Method setShowSoftInputOnFocus = null; 
				String  method_setSoftInputOnFocus = "setShowSoftInputOnFocus";
				//4.0的是setShowSoftInputOnFocus,4.2的是setSoftInputOnFocus	
				if(android.os.Build.VERSION.SDK_INT>16) {
					method_setSoftInputOnFocus = "setSoftInputOnFocus";
				}
				setShowSoftInputOnFocus = cls.getMethod(method_setSoftInputOnFocus, boolean.class); 
				setShowSoftInputOnFocus.setAccessible(false); 
				setShowSoftInputOnFocus.invoke(edit, false); 
			} catch (Exception e) { 
				e.printStackTrace(); 
			}
//		}
	}

	private OnKeyboardActionListener listener = new OnKeyboardActionListener() {
		@Override
		public void swipeUp() {
		}

		@Override
		public void swipeRight() {
		}

		@Override
		public void swipeLeft() {
		}

		@Override
		public void swipeDown() {
		}

		@Override
		public void onText(CharSequence text) {
		}

		@Override
		public void onRelease(int primaryCode) {
		}

		@Override
		public void onPress(int primaryCode) {
			checkIShowPrewiew(primaryCode);
		}

		@Override
		public void onKey(int primaryCode, int[] keyCodes) {
			checkIShowPrewiew(primaryCode);
			
			Editable editable = ed.getText();
			int start = ed.getSelectionStart();
			if (primaryCode == Keyboard.KEYCODE_CANCEL) {// 完成
				hideKeyboard();
			} else if (primaryCode == Keyboard.KEYCODE_DELETE) {// 刪除
				if (editable != null && editable.length() > 0) {
					if (start > 0) {
						editable.delete(start - 1, start);
					}
				}
			} else if (primaryCode == Keyboard.KEYCODE_SHIFT) {// 大小寫切換
				changeKey();
				keyboardView.setKeyboard(k2);

			} else if (primaryCode == Keyboard.KEYCODE_MODE_CHANGE) {// 數字鍵盤切換
				if (isnun) {
					isnun = false;
					keyboardView.setKeyboard(k1);
				} else {
					isnun = true;
					keyboardView.setKeyboard(k2);
				}
			} else if (primaryCode == 57419) { // 左移
				if (start > 0) {
					ed.setSelection(start - 1);
				}
			} else if (primaryCode == 57421) { // 右移
				if (start < ed.length()) {
					ed.setSelection(start + 1);
				}
			} else {
				editable.insert(start, Character.toString((char) primaryCode));
			}
		}
	};
	
	/**
	 * 除了 刪除,完成,大小寫切換,. 空格 ,等(可自己定義) 這些符號不用開啟預覽,其他需要預覽
	 */
	private void checkIShowPrewiew(int primaryCode) {
		List list = Arrays.asList(Keyboard.KEYCODE_CANCEL,
				Keyboard.KEYCODE_DELETE,
				Keyboard.KEYCODE_SHIFT,
				46, 32, 44, -2);
		if(list.contains(primaryCode)){
			keyboardView.setPreviewEnabled(false);
		}else{
			keyboardView.setPreviewEnabled(true);
		}
	}
	
	/**
	 * 鍵盤大小寫切換
	 */
	private void changeKey() {
		List keylist = k1.getKeys();
		if (isupper) {//大寫切換小寫
			isupper = false;
			for(Key key:keylist){
				if (key.label!=null && isword(key.label.toString())) {
					key.label = key.label.toString().toLowerCase();
					key.codes[0] = key.codes[0]+32;
				}
			}
		} else {//小寫切換大寫
			isupper = true;
			for(Key key:keylist){
				if (key.label!=null && isword(key.label.toString())) {
					key.label = key.label.toString().toUpperCase();
					key.codes[0] = key.codes[0]-32;
				}
			}
		}
	}

    public void showKeyboard() {
        int visibility = keyboardView.getVisibility();
        if (visibility == View.GONE || visibility == View.INVISIBLE) {
            keyboardView.setVisibility(View.VISIBLE);
            isShow = true;
        }
    }
    
    public void hideKeyboard() {
        int visibility = keyboardView.getVisibility();
        if (visibility == View.VISIBLE) {
            keyboardView.setVisibility(View.INVISIBLE);
            isShow = false;
        }
    }
    
    private boolean isword(String str){
    	String wordstr = "abcdefghijklmnopqrstuvwxyz";
    	if (wordstr.indexOf(str.toLowerCase())>-1) {
			return true;
		}
    	return false;
    }

}
public class MainActivity extends  Activity {

	private KeyboardUtil keyboardUtil;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.keyboard_layout);
		
		final EditText et = (EditText) findViewById(R.id.edit1);
		et.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				int inputType = et.getInputType();
				et.setInputType(InputType.TYPE_NULL);
				if(null == keyboardUtil)
					keyboardUtil = new KeyboardUtil(et);
				
				if(!keyboardUtil.isShow)
					keyboardUtil.showKeyboard();
				et.setInputType(inputType);
				return false;
			}
		});
	}
	
	@Override
	public void onBackPressed() {
		if(keyboardUtil.isShow)
			keyboardUtil.hideKeyboard();
		super.onBackPressed();
		
	}

}

相關推薦

Android定義鍵盤樣式:字母、數字、標點三種切換

第一次寫,直接上程式碼吧: 先看效果圖: 1.在需要的呼叫軟鍵盤的activity_mian.xml中加入鍵盤控制元件 <!--自定義鍵盤控制元件--> <RelativeLayout android:layout_width="fill

Android 定義鍵盤

package com.huyu.test; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import android.app.Activity; import android.input

Android定義鍵盤輸入法,隱藏系統輸入法顯示游標的實現

android實現自定義軟鍵盤,先上圖看效果,效果基本上是仿ios輸入法實現的 這裡是實現隱藏系統輸入法,同時讓EditText能獲取游標的程式碼部分(通過反射呼叫): <span style="font-size:18px;">keyBoardLabe

Android定義鍵盤KeyboardView 使用例項

在有些應用中會有定製軟鍵盤的需求,往往實現起來會有些難度,或者說實現出來的效果不盡如人意。 最近在專案中有這種需求 博主也是不辱使命地完成了這個需求,效果圖如下 說一下思路的和詳細實現 主要是利用android自帶的android.inputme

Android 定義鍵盤遇到的問題

首先來分析一下軟鍵盤的基本屬性 - 軟鍵盤的實現 - 點選輸入框從底部彈出軟鍵盤 - 彈出軟鍵盤後焦點在輸入框 - 彈出軟鍵盤不遮擋輸入框 軟鍵盤的實現 可以使用KeyboardView也可以自己寫佈局寫點選事件(除特殊情況不推薦)

Android使用xml定義鍵盤效果(附原始碼)

Android使用xml自定義軟鍵盤效果原理: 1,軟鍵盤其實是個控制元件,使用android.inputmethodserver.KeyboardView類定義。 2,主佈局中使用幀佈局,當我們需要顯示軟鍵盤時設定為可見,不需要時設定為不可見。 3,編寫

仿美團簡訊驗證碼輸入框 + 定義鍵盤

KeyboardDemo 自定義簡訊驗證碼輸入框  + 自定義數字字母軟鍵盤 前段時間做了一個需求,類似驗證碼輸入框,但輸入的優惠碼有數字和大小寫字母,所以就需要用到自定義軟鍵盤,不然總是切換數字與字母太麻煩,使用者體驗不佳。 剛開始想著到網上找一些demo得了,可i

IOS 定義鍵盤功能,修改換行鍵為傳送鍵

IOS專案是使用混合模式開發,在開發聊天功能時;發現軟鍵盤不能像QQ、微信那樣,換行鍵不能變為傳送;網上說是因為輸入框類別導致;嘗試過以後,還是不行;然後想到用IOS native解決; 先說一下,原生APP 設定軟鍵盤換行鍵為傳送鍵: textField.returnKeyType = U

andriod 定義鍵盤及解決遮擋文字框問題

       首先建立鍵盤框架檔案:numskeys.xml對應的按鍵數字對應相應的ASII碼,按鍵寬度和按鍵高度按照百分比設定。對應按鍵的功能寫在XMLKeysUtils工具類中,對應按鍵功能寫在onKey方法裡,遍歷陣列或者if…else…語句完成。   drawabl

定義鍵盤,隨機數字位置鍵盤

簡介 今天在掘金上看了一篇文章,實現自定義軟鍵盤,發現其實實現方式比較簡單,不需要改動系統api,只是單純的載入自己的鍵盤佈局,隱藏系統彈出的鍵盤,實現數字錯位,安全輸入軟鍵盤,記錄一下實現過程用於總結 實現 <?xml version=

android定義密碼鍵盤

先看介面佈局檔案 <?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="f

定義鍵盤 EditText游標問題

自定義軟鍵盤 游標問題 使用自定義鍵盤的時候 為了隱藏系統的軟鍵盤 使用了editText.setInputType editText .setInputType(InputType.TYPE_NULL); 但會導致EditText游標不顯示 不閃爍

Android 定義數字鍵盤(三)定義輸入框

Android 自定義數字鍵盤(一) Android 自定義數字鍵盤(二)隨機數字 Demo地址:https://github.com/danfengfirst/KeyDemo 這篇部落格是在上面兩篇部落格的基礎上修改的一個相對比較完整的demo,

Android 定義輸入鍵盤

前言 在日常開發中,有的時候我們需要使用者輸入指定範圍的內容,除了給與充分的文字提示,更加人性化的就是定製一個自定義鍵盤。 Android的自定義鍵盤常用於密碼輸入時的安全鍵盤,比如支付寶支付時。 如上圖,在輸入體溫時,彈出一個自定義的體溫鍵盤,這樣既能人性化服務,也能規避

Android定義支付寶輸入鍵盤

不多說,先來截圖: 大致的介面就是這樣了,因為沒有切圖,所以圖片的地方用文字進行表示了。如果有需要,大家可以自己選擇圖片。 大致分為這幾個工具類: 1.PayAdapter 主要是對數字進行賦值: public class PayAdapter exte

Android定義鍵盤問題記錄

公司為了保障密碼安全,研發了一套自定義鍵盤取代系統鍵盤,原理很簡單,一個PopupWindow,在EditText獲得焦點時show,失去焦點dismiss。 但用在專案組上的時候出現問題。        專案的輸入框   &nbs

Android仿支付寶密碼輸入框(定義數字鍵盤)

1.概述          Android自定義密碼輸入框,通過自定義輸入顯示框和自定義輸入鍵盤,實現仿支付寶數字鍵盤等。程式碼已託管到github,有需要的話可以去我的github下載。 可以自定義關閉圖示、文字內容、顏色、大小,彈框樣

十一月專案小結(實現定義底部以及適應鍵盤Dialog)

自定義Dialog 自定義CustomDialog繼承父類Dialog //style:自定義Dialog樣式 public CustomDialog(Activity activity , int style) { super(activity,sty

Android 定義鍵盤輸入內容監聽

 文章內容結構按照STAR法則展開的:   situation:                   為何要監聽輸入內容? 一般正常的監聽鍵盤輸入內容,都是用Editext控制元件來實現使用者的輸入

Android--›EditText不顯示系統鍵盤,可用來顯示定義鍵盤

系統鍵盤 包含普通鍵盤和現在很多ROM定製的密碼安全鍵盤 但是,此方法是API 21Android 5.0加入的, 所以為了相容低版本, 建議使用已下方法: public static final