最近做支付相關軟件,老闆不想用系統的鍵盤,要自己寫一個固定的按鈕做鍵盤,感覺一個一個按鈕加上去 挺麻煩的,而且有好幾個頁面都要使用這個鍵盤,做爲程序員,我來封裝一下。話不多說,直接上核心代碼,主要是一個fragment和一個layout
1:MyKeyBoardFragment:原理就是點擊按鈕後模擬鍵盤點擊事件,封裝在performKeyDown方法中。
package com.dingmore.terminal.ui.more;
import android.app.Activity;
import android.app.Instrumentation;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import com.dingmore.terminal.R;
public class MyKeyBoardFragment extends Fragment implements OnClickListener{
Activity mActivity;
View rootView;
private Button button_1,button_2,button_3,button_4,button_5,button_6,button_7,button_8,button_9,button_0,button_del,button_point;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
mActivity=getActivity();
rootView=inflater.inflate(R.layout.keyboard_layout, container, false);
initView();
return rootView;
}
private void initView() {
button_0=(Button)rootView.findViewById(R.id.button_0);
button_1=(Button)rootView.findViewById(R.id.button_1);
button_2=(Button)rootView.findViewById(R.id.button_2);
button_3=(Button)rootView.findViewById(R.id.button_3);
button_4=(Button)rootView.findViewById(R.id.button_4);
button_5=(Button)rootView.findViewById(R.id.button_5);
button_6=(Button)rootView.findViewById(R.id.button_6);
button_7=(Button)rootView.findViewById(R.id.button_7);
button_8=(Button)rootView.findViewById(R.id.button_8);
button_9=(Button)rootView.findViewById(R.id.button_9);
button_point=(Button)rootView.findViewById(R.id.button_point);
button_del=(Button)rootView.findViewById(R.id.button_del);
button_0.setOnClickListener(this);
button_1.setOnClickListener(this);
button_2.setOnClickListener(this);
button_3.setOnClickListener(this);
button_4.setOnClickListener(this);
button_5.setOnClickListener(this);
button_6.setOnClickListener(this);
button_7.setOnClickListener(this);
button_8.setOnClickListener(this);
button_9.setOnClickListener(this);
button_point.setOnClickListener(this);
button_del.setOnClickListener(this);
button_del.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
// TODO Auto-generated method stub
performKeyDown(KeyEvent.KEYCODE_CLEAR);
return false;
}
});
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.button_0:
performKeyDown(KeyEvent.KEYCODE_0);
break;
case R.id.button_1:
performKeyDown(KeyEvent.KEYCODE_1);
break;
case R.id.button_2:
performKeyDown(KeyEvent.KEYCODE_2);
break;
case R.id.button_3:
performKeyDown(KeyEvent.KEYCODE_3);
break;
case R.id.button_4:
performKeyDown(KeyEvent.KEYCODE_4);
break;
case R.id.button_5:
performKeyDown(KeyEvent.KEYCODE_5);
break;
case R.id.button_6:
performKeyDown(KeyEvent.KEYCODE_6);
break;
case R.id.button_7:
performKeyDown(KeyEvent.KEYCODE_7);
break;
case R.id.button_8:
performKeyDown(KeyEvent.KEYCODE_8);
break;
case R.id.button_9:
performKeyDown(KeyEvent.KEYCODE_9);
break;
case R.id.button_point:
performKeyDown(KeyEvent.KEYCODE_NUMPAD_DOT);
break;
case R.id.button_del:
performKeyDown(KeyEvent.KEYCODE_DEL);
break;
default:
break;
}
}
//模擬鍵盤輸入
public void performKeyDown(final int keyCode) {
new Thread() {
public void run() {
try {
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(keyCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
2:佈局代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#F0F1EE"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/input_buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="10dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<Button
android:id="@+id/button_1"
style="@style/input_button_style"
android:text="1" />
<Button
android:id="@+id/button_2"
style="@style/input_button_style"
android:text="2" />
<Button
android:id="@+id/button_3"
style="@style/input_button_style"
android:text="3" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<Button
android:id="@+id/button_4"
style="@style/input_button_style"
android:text="4" />
<Button
android:id="@+id/button_5"
style="@style/input_button_style"
android:text="5" />
<Button
android:id="@+id/button_6"
style="@style/input_button_style"
android:text="6" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<Button
android:id="@+id/button_7"
style="@style/input_button_style"
android:text="7" />
<Button
android:id="@+id/button_8"
style="@style/input_button_style"
android:text="8" />
<Button
android:id="@+id/button_9"
style="@style/input_button_style"
android:text="9" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<Button
android:id="@+id/button_point"
style="@style/input_button_style"
android:text="." />
<Button
android:id="@+id/button_0"
style="@style/input_button_style"
android:text="0" />
<Button
android:id="@+id/button_del"
style="@style/input_button_style"
android:text="刪除" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
3:使用方法:在你的FragmentActivity的佈局中加入
<fragment
android:id="@+id/keyboard_fragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.ui.more.MyKeyBoardFragment" />//注意這裏的class要根據自己的包名改一下
4:可能會遇到的問題和解決方案
error inflating class fragment--
Fragment引用的包是:
import android.support.v4.app.Fragment;
而不是:
import android.app.Fragment;
然後Activity必須是繼承FragmentActivity
import android.support.v4.app.FragmentActivity;
注意:如果在同一個FragmentActivity中多次使用此鍵盤,記住要設置成不同id,否則系統會只顯示其中一個。