android 自定义输入法布局,Android编程实现自定义输入法功能示例【输入密码时防止第三方窃取】...

本文实例讲述了Android编程实现自定义输入法功能。分享给大家供大家参考,具体如下:

对于Android用户而言,一般都会使用第三方的输入法。可是,在输入密码时(尤其是支付相关的密码),使用第三方输入法有极大的安全隐患。目前很多网银类的APP和支付宝等软件在用户输入密码时,都会弹出自定义的输入法而不是直接使用系统输入法。

这里介绍的就是如何实现一个简单的自定义输入法。当然,也可以自己写一个Dialog加上几十个按钮让用户输入,只不过这样显得不够专业。

(一)首先上效果图:

1.前面两个输入框使用了自定义的输入法:

9b81283557e9cc9191708a472367d592.png

2.第三个输入框没有进行任何设置,因此将使用默认的输入法:

51304f438d680dc41f680a478e27d429.png

(二)代码简介:

1.主页面布局,由3个输入框加上一个android.inputmethodservice.KeyboardView组成。android.inputmethodservice.KeyboardView是一个系统自带的继承自View的组件,但是它不在android.view这个包下面,因此这里需要写上完整的包名。

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/input_password"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_margin="8dp"

android:hint="one password"

android:layout_alignParentTop="true"

android:inputType="textPassword" />

android:id="@+id/input_password2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@+id/input_password"

android:layout_margin="8dp"

android:hint="another password"

android:inputType="textPassword" />

android:id="@+id/input_normal_text"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@+id/input_password2"

android:layout_margin="8dp"

android:hint="normal text" />

android:id="@+id/keyboardview"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:focusable="true"

android:focusableInTouchMode="true"

android:visibility="gone" />

2.KeyboardView是一个显示输入法的容器控件,使用时需要设置具体的输入法面板内容。

(1)首先在res下新建xml目录,然后创建文件keys_layout.xml,即输入法面板的内容。每个row表示一行,Keyboad的属性keyWidth和keyHeight表示每个按键的大小,25%p表示占父组件的25%. Key的属性codes表示该按键的编号(点击时系统回调方法中会返回这个值,用以区分不同的按键),keyLabel表示按键上面显示的文字。还有很多其它的属性,不再陈述。

android:keyWidth="25%p"

android:keyHeight="10%p">

android:codes="55"

android:keyLabel="7"

android:keyEdgeFlags="left" />

android:codes="56"

android:keyLabel="8" />

android:codes="57"

android:keyLabel="9" />

android:codes="60001"

android:keyLabel="DEL"

android:isRepeatable="true" />

android:codes="52"

android:keyLabel="4"

android:keyEdgeFlags="left" />

android:codes="53"

android:keyLabel="5" />

android:codes="54"

android:keyLabel="6" />

android:codes="48"

android:keyLabel="0" />

android:codes="49"

android:keyLabel="1"

android:keyEdgeFlags="left" />

android:codes="50"

android:keyLabel="2" />

android:codes="51"

android:keyLabel="3" />

android:codes="60002"

android:keyLabel="Cancel" />

(2)为了使用方便,新建一个类:KeyboardBuilder.java,用于初始化自定义输入法和绑定EditText,代码如下:

public class KeyboardBuilder {

private static final String TAG = "KeyboardBuilder";

private Activity mActivity;

private KeyboardView mKeyboardView;

public KeyboardBuilder(Activity ac, KeyboardView keyboardView, int keyBoardXmlResId) {

mActivity = ac;

mKeyboardView = keyboardView;

Keyboard mKeyboard = new Keyboard(mActivity, keyBoardXmlResId);

// Attach the keyboard to the view

mKeyboardView.setKeyboard(mKeyboard);

// Do not show the preview balloons

mKeyboardView.setPreviewEnabled(false);

KeyboardView.OnKeyboardActionListener keyboardListener = new KeyboardView.OnKeyboardActionListener() {

@Override

public void onKey(int primaryCode, int[] keyCodes) {

// Get the EditText and its Editable

View focusCurrent = mActivity.getWindow().getCurrentFocus();

if (focusCurrent == null || !(focusCurrent instanceof EditText)) {

return;

}

EditText edittext = (EditText) focusCurrent;

Editable editable = edittext.getText();

int start = edittext.getSelectionStart();

// Handle key

if (primaryCode == Constant.CodeCancel) {

hideCustomKeyboard();

} else if (primaryCode == Constant.CodeDelete) {

if (editable != null && start > 0) {

editable.delete(start - 1, start);

}

} else {

// Insert character

editable.insert(start, Character.toString((char) primaryCode));

}

}

@Override

public void onPress(int arg0) {

}

@Override

public void onRelease(int primaryCode) {

}

@Override

public void onText(CharSequence text) {

}

@Override

public void swipeDown() {

}

@Override

public void swipeLeft() {

}

@Override

public void swipeRight() {

}

@Override

public void swipeUp() {

}

};

mKeyboardView.setOnKeyboardActionListener(keyboardListener);

}

//绑定一个EditText

public void registerEditText(EditText editText) {

// Make the custom keyboard appear

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {

@Override

public void onFocusChange(View v, boolean hasFocus) {

if (hasFocus) {

showCustomKeyboard(v);

} else {

hideCustomKeyboard();

}

}

});

editText.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Log.d(TAG, "onClick");

showCustomKeyboard(v);

}

});

editText.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

Log.d(TAG, "onTouch");

EditText edittext = (EditText) v;

int inType = edittext.getInputType(); // Backup the input type

edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard

edittext.onTouchEvent(event); // Call native handler

edittext.setInputType(inType); // Restore input type

edittext.setSelection(edittext.getText().length());

return true;

}

});

}

public void hideCustomKeyboard() {

mKeyboardView.setVisibility(View.GONE);

mKeyboardView.setEnabled(false);

}

public void showCustomKeyboard(View v) {

mKeyboardView.setVisibility(View.VISIBLE);

mKeyboardView.setEnabled(true);

if (v != null) {

((InputMethodManager) mActivity.getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);

}

}

public boolean isCustomKeyboardVisible() {

return mKeyboardView.getVisibility() == View.VISIBLE;

}

}

3.最后是主Activity的代码,这里就很简单了。

/**

* 自定义安全输入法

*/

public class MainActivity extends ActionBarActivity {

private KeyboardBuilder builder;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

KeyboardView keyboardView = (KeyboardView) findViewById(R.id.keyboardview);

builder = new KeyboardBuilder(this, keyboardView, R.xml.keys_layout);

EditText editText = (EditText) findViewById(R.id.input_password);

builder.registerEditText(editText);

EditText editText2 = (EditText) findViewById(R.id.input_password2);

builder.registerEditText(editText2);

}

@Override

public void onBackPressed() {

if (builder != null && builder.isCustomKeyboardVisible()) {

builder.hideCustomKeyboard();

} else {

this.finish();

}

}

}

希望本文所述对大家Android程序设计有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值