关闭

【android开发】自定义数字软键盘的设计与实现(2)

标签: android studioandroid开发AndroidJavaxml
315人阅读 评论(0) 收藏 举报
分类:

上一篇我们说了关于自定义软键盘实现的相关原理,把两个主要的类介绍了一下,并看了一下源码的内容,那么今天实现起来就不会有什么疑惑了,每一步都会清晰了。


       好了,下面我们就把实现的具体步骤给大家介绍一下:首先在res下新建xml文件夹,在xml文件夹中新建symbols.xml文件,这个布局文件重要是实现软键盘的布局,每一个按键都有一个codes值,在类中就是通过codes值来监听每一个按钮,上一面已经说了,一些codes是固定,一些是自定义设置的,内如如下:

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:keywidth="33%p" android:horizontalgap="0px" android:verticalgap="0px" android:keyheight="10%p">    
  3.         <row>    
  4.             <key android:codes="49" android:keylabel="1">    
  5.             <key android:codes="50" android:keylabel="2">    
  6.             <key android:codes="51" android:keylabel="3">    
  7.         </key></key></key></row>    
  8.         <row>    
  9.             <key android:codes="52" android:keylabel="4">    
  10.             <key android:codes="53" android:keylabel="5">    
  11.             <key android:codes="54" android:keylabel="6">    
  12.         </key></key></key></row>    
  13.         <row>    
  14.             <key android:codes="55" android:keylabel="7">    
  15.             <key android:codes="56" android:keylabel="8">    
  16.             <key android:codes="57" android:keylabel="9">       
  17.         </key></key></key></row>    
  18.         <row>    
  19.             <key android:codes="4896" android:keylabel="清空">    
  20.             <key android:codes="48" android:keylabel="0">    
  21.             <key android:codes="-5" android:keyicon="@drawable/sym_keyboard_delete">    
  22.         </key></key></key></row>    
  23. </keyboard>    


然后创建一个类,用于处理软键盘事件,文件名为KeyboardUtil.java,内容如下:

[java] view plain copy
  1. package com.xinhui.ui;  
  2.   
  3. import com.xinhui.appsystem.R;  
  4.   
  5. import android.app.Activity;    
  6. import android.content.Context;    
  7. import android.inputmethodservice.Keyboard;    
  8. import android.inputmethodservice.KeyboardView;    
  9. import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;    
  10. import android.text.Editable;    
  11. import android.view.View;    
  12. import android.widget.EditText;    
  13.      
  14. public class KeyboardUtil {    
  15.         private KeyboardView keyboardView;    
  16.         private Keyboard k;// 数字键盘    
  17.         private EditText ed;  
  18.         public KeyboardUtil(Activity act, Context ctx, EditText edit) {    
  19.                 this.ed = edit;  
  20.                 k = new Keyboard(ctx, R.xml.symbols);    
  21.                 keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view);    
  22.                 keyboardView.setKeyboard(k);    
  23.                 keyboardView.setEnabled(true);    
  24.                 keyboardView.setPreviewEnabled(true);  
  25.                 keyboardView.setVisibility(View.VISIBLE);  
  26.                 keyboardView.setOnKeyboardActionListener(listener);    
  27.         }    
  28.         private OnKeyboardActionListener listener = new OnKeyboardActionListener() {    
  29.                 @Override    
  30.                 public void swipeUp() {    
  31.                 }    
  32.      
  33.                 @Override    
  34.                 public void swipeRight() {    
  35.                 }    
  36.      
  37.                 @Override    
  38.                 public void swipeLeft() {    
  39.                 }    
  40.      
  41.                 @Override    
  42.                 public void swipeDown() {    
  43.                 }    
  44.      
  45.                 @Override    
  46.                 public void onText(CharSequence text) {    
  47.                 }    
  48.      
  49.                 @Override    
  50.                 public void onRelease(int primaryCode) {    
  51.                 }    
  52.      
  53.                 @Override    
  54.                 public void onPress(int primaryCode) {    
  55.                 }    
  56.                 //一些特殊操作按键的codes是固定的比如完成、回退等  
  57.                 @Override    
  58.                 public void onKey(int primaryCode, int[] keyCodes) {    
  59.                         Editable editable = ed.getText();    
  60.                         int start = ed.getSelectionStart();    
  61.                         if (primaryCode == Keyboard.KEYCODE_DELETE) {// 回退    
  62.                                 if (editable != null && editable.length() > 0) {    
  63.                                         if (start > 0) {    
  64.                                                 editable.delete(start - 1, start);    
  65.                                         }    
  66.                                 }    
  67.                         }else if (primaryCode == 4896) {// 清空   
  68.                             editable.clear();  
  69.                         } else { //将要输入的数字现在编辑框中   
  70.                                 editable.insert(start, Character.toString((char) primaryCode));    
  71.                         }    
  72.                 }    
  73.         };    
  74.          
  75.     public void showKeyboard() {    
  76.         int visibility = keyboardView.getVisibility();    
  77.         if (visibility == View.GONE || visibility == View.INVISIBLE) {    
  78.             keyboardView.setVisibility(View.VISIBLE);    
  79.         }    
  80.     }    
  81. }   

接下来就是实现activity的视图布局文件了,文件名为input_pwd.xml,内容如下:

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     android:background="@drawable/viewbackground" >  
  7.       
  8.     <LinearLayout    
  9.         android:layout_width="match_parent"    
  10.         android:layout_height="40dip"     
  11.         android:gravity="center_vertical|center_horizontal"    
  12.         android:orientation="horizontal" >    
  13.         <TextView    
  14.             android:layout_width="wrap_content"    
  15.             android:layout_height="wrap_content"    
  16.             android:textColor="@android:color/white"    
  17.             android:textSize="22sp"   
  18.             android:text="安全验证"/>    
  19.     </LinearLayout>    
  20.       <View   
  21.           android:layout_width="fill_parent"  
  22.           android:layout_height="1dip"  
  23.           android:background="#ff00ff66"  
  24.           />  
  25.     <LinearLayout     
  26.         android:layout_width="match_parent"    
  27.         android:layout_height="wrap_content"    
  28.         android:layout_marginTop="20dip"    
  29.         android:gravity="center_vertical|center_horizontal"    
  30.         android:orientation="horizontal">    
  31.             
  32.         <ImageView     
  33.             android:id="@+id/iv_lock_app_icon"    
  34.             android:layout_width="48dip"    
  35.             android:layout_height="48dip"     
  36.             android:contentDescription="@string/hello_world"/>    
  37.         <TextView    
  38.             android:id="@+id/tv_lock_app_name"    
  39.             android:layout_width="wrap_content"    
  40.             android:layout_height="wrap_content"    
  41.             android:layout_marginLeft="15dip"    
  42.             android:textColor="#ffbc04e5"    
  43.             android:text="@string/hello_world"/>   
  44.                
  45.     </LinearLayout>  
  46.   
  47.     <LinearLayout  
  48.         android:layout_width="match_parent"  
  49.         android:layout_height="wrap_content"  
  50.         android:layout_marginTop="20dip"  
  51.           
  52.         android:orientation="horizontal" >  
  53.   
  54.         <EditText  
  55.             android:id="@+id/et_lock_pwd"  
  56.             android:layout_width="wrap_content"  
  57.             android:layout_height="wrap_content"  
  58.             android:layout_marginLeft="5dip"  
  59.             android:layout_marginRight="5dip"  
  60.             android:layout_marginTop="20dip"  
  61.             android:layout_weight="0.36"  
  62.             android:background="#cccccc"  
  63.             android:hint="输入密码"  
  64.             android:inputType="textPassword"  
  65.             android:textSize="40dp" />  
  66.   
  67.         <Button  
  68.             android:id="@+id/btn_confirm"  
  69.             android:layout_width="78dp"  
  70.             android:layout_height="wrap_content"  
  71.             android:layout_marginTop="20dip"  
  72.             android:text="确定"  
  73.             android:textSize="20dp"  />  
  74.     </LinearLayout>  
  75.       
  76.      <android.inputmethodservice.KeyboardView    
  77.             android:id="@+id/keyboard_view"    
  78.             android:layout_width="fill_parent"    
  79.             android:layout_height="fill_parent"    
  80.             android:layout_marginTop="10dip"  
  81.             android:focusable="true"    
  82.             android:focusableInTouchMode="true"   
  83.             android:visibility="visible"  
  84.              />    
  85. </LinearLayout>  
最后就在你要执行activity,添加一些代码就行了,剩下的就和其他控件使用方式一样了,类名为LockAppActivity.java,内容如下:

[java] view plain copy
  1. package com.xinhui.ui;  
  2.   
  3. import com.xinhui.appsystem.R;  
  4. import com.xinhui.service.WatchAppService;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.SharedPreferences;  
  8. import android.content.pm.ApplicationInfo;  
  9. import android.content.pm.PackageManager.NameNotFoundException;  
  10. import android.graphics.drawable.Drawable;  
  11. import android.os.Bundle;  
  12. import android.text.InputType;  
  13. import android.text.TextUtils;  
  14. import android.util.Log;  
  15. import android.view.KeyEvent;  
  16. import android.view.MotionEvent;  
  17. import android.view.View;  
  18. import android.view.View.OnClickListener;  
  19. import android.view.View.OnTouchListener;  
  20. import android.view.Window;  
  21. import android.widget.Button;  
  22. import android.widget.EditText;  
  23. import android.widget.ImageView;  
  24. import android.widget.TextView;  
  25. import android.widget.Toast;  
  26. /** 
  27.  * 类名称:LockAppActivity  
  28.  * 类描述:系统锁页面 
  29.  * 创建人:LXH  
  30.  * 创建时间:2013-10-21 上午10:30:00  
  31.  */  
  32. public class LockAppActivity extends Activity implements OnClickListener,OnTouchListener{  
  33.       
  34.     private ImageView ivLockAppIcon;  
  35.     private TextView tvLockAppName;  
  36.     private EditText etInputPwd;  
  37.     private Button btnConfirm;  
  38.     private String packageName;  
  39.     private String passWord;  
  40.     private SharedPreferences preferences;  
  41.     //public static boolean isLock;  
  42.     @Override  
  43.     protected void onCreate(Bundle savedInstanceState) {  
  44.         // TODO Auto-generated method stub  
  45.         super.onCreate(savedInstanceState);  
  46.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  47.         setContentView(R.layout.input_pwd);  
  48.         //WatchAppService.isLock = false;  
  49.         Log.e("test""onCreate--->");  
  50.         ivLockAppIcon = (ImageView) findViewById(R.id.iv_lock_app_icon);    
  51.         tvLockAppName = (TextView) findViewById(R.id.tv_lock_app_name);    
  52.         etInputPwd = (EditText) findViewById(R.id.et_lock_pwd);  
  53.         etInputPwd.setOnTouchListener(this);  
  54.         btnConfirm = (Button) findViewById(R.id.btn_confirm);  
  55.         btnConfirm.setOnClickListener(this);  
  56.         packageName = getIntent().getStringExtra("packageName");  
  57.           
  58.         try {  
  59.             //通过包名拿到applicationInfo  
  60.             ApplicationInfo appInfo = getPackageManager().getPackageInfo(packageName, 0).applicationInfo;  
  61.             //应用图标    
  62.             Drawable app_icon = appInfo.loadIcon(getPackageManager());    
  63.             //应用的名字    
  64.             String app_name = appInfo.loadLabel(getPackageManager()).toString();  
  65.             ivLockAppIcon.setImageDrawable(app_icon);    
  66.             tvLockAppName.setText(app_name);    
  67.         } catch (NameNotFoundException e) {  
  68.             // TODO Auto-generated catch block  
  69.              e.printStackTrace();  
  70.         }  
  71.           
  72.     }  
  73.     //不让用户按后退键    
  74.     @Override  
  75.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  76.         // TODO Auto-generated method stub  
  77.         //屏蔽后退键    
  78.         if(KeyEvent.KEYCODE_BACK == event.getKeyCode())    
  79.         {    
  80.             return true;//阻止事件继续向下分发    
  81.         }    
  82.         return super.onKeyDown(keyCode, event);   
  83.     }  
  84.   
  85.     @Override  
  86.     public void onClick(View v) {  
  87.         // TODO Auto-generated method stub  
  88.         String input = etInputPwd.getText().toString().trim();  
  89.         preferences = getSharedPreferences("passWord", MODE_PRIVATE);  
  90.         passWord = preferences.getString("pwd""");  
  91.         if(TextUtils.isEmpty(input))    
  92.         {    
  93.             Toast.makeText(this"密码不能为空", Toast.LENGTH_SHORT).show();    
  94.         }    
  95.         else if(passWord.equals(input))    
  96.         {   
  97.             WatchAppService.lastRunningApp = WatchAppService.runningApp;//这里赋值,终于解决了反复弹出验证页面的BUG  
  98.             finish();    
  99.         }    
  100.         else    
  101.         {    
  102.             Toast.makeText(this"密码错误", Toast.LENGTH_SHORT).show();  
  103.             etInputPwd.setText("");//置空  
  104.         }    
  105.     }  
  106.     @Override  
  107.     public boolean onTouch(View v, MotionEvent event) {  
  108.         // TODO Auto-generated method stub  
  109.         //这样是在触摸到控件时,软键盘才会显示出来  
  110.         int inputback = etInputPwd.getInputType();    
  111.         etInputPwd.setInputType(InputType.TYPE_NULL);    
  112.         new KeyboardUtil(thisthis, etInputPwd).showKeyboard();    
  113.         etInputPwd.setInputType(inputback);   
  114.         return false;  
  115.     }  
  116.       
  117. }  

由于我的这个activity是其他activity调用的,并不是主界面的activity。上面就把实现的整个过程写完了,一个自定义的数字软键盘就实现了。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:110423次
    • 积分:1976
    • 等级:
    • 排名:第19918名
    • 原创:80篇
    • 转载:70篇
    • 译文:5篇
    • 评论:38条
    最新评论