Android App内置键盘开发

参考:

http://blog.csdn.net/hfsu0419/article/details/7924673

布局文件activity_main.xml

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

    <EditText 
        android:id="@+id/edit1"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content" 
        android:inputType="none" />  
    <RelativeLayout  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content" >  
        <android.inputmethodservice.KeyboardView  
            android:id="@+id/keyboard_view"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:layout_alignParentBottom="true"  
            android:focusable="true"  
            android:focusableInTouchMode="true"  
            android:background="@android:color/darker_gray"  
            android:keyTextColor="#00ff00"  
            android:keyPreviewLayout="@layout/keyborad_preview_layout"
            android:keyPreviewHeight="40dip"
            android:visibility="gone" />  
    </RelativeLayout>  

</LinearLayout>

预览文件keyborad_preview_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textColor="#ffffff"
    android:background="@drawable/prewlayout_bg"
    android:gravity="center"
    android:minHeight="0dip"
    android:minWidth="0dip"
    android:textSize="20sp"
 />

样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="oval" >
	<solid android:color="#ff000000"/>
	<stroke android:color="#9900f010" android:width="2dip"/>
</shape>

键盘布局文件

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android" 
    android:horizontalGap="0.0px" 
    android:keyHeight="50dp" 
    android:keyWidth="10.000002%p" 
    android:verticalGap="0.0px" > 
    <Row> 
        <Key 
            android:codes="49" 
            android:keyEdgeFlags="left" 
            android:keyLabel="1" /> 
        <Key 
            android:codes="50" 
            android:keyLabel="2" /> 
        <Key 
            android:codes="51" 
            android:keyLabel="3" /> 
        <Key 
            android:codes="52" 
            android:keyLabel="4" /> 
        <Key 
            android:codes="53" 
            android:keyLabel="5" /> 
        <Key 
            android:codes="54" 
            android:keyLabel="6" /> 
        <Key 
            android:codes="55" 
            android:keyLabel="7" /> 
        <Key 
            android:codes="56" 
            android:keyLabel="8" /> 
        <Key 
            android:codes="57" 
            android:keyLabel="9" /> 
        <Key 
            android:codes="48" 
            android:keyEdgeFlags="right" 
            android:keyLabel="0" /> 
    </Row> 
    <Row> 
        <Key 
            android:codes="113" 
            android:keyEdgeFlags="left" 
            android:keyLabel="q" /> 
        <Key 
            android:codes="119" 
            android:keyLabel="w" /> 
        <Key 
            android:codes="101" 
            android:keyLabel="e" /> 
        <Key 
            android:codes="114" 
            android:keyLabel="r" /> 
        <Key 
            android:codes="116" 
            android:keyLabel="t" /> 
        <Key 
            android:codes="121" 
            android:keyLabel="y" /> 
        <Key 
            android:codes="117" 
            android:keyLabel="u" /> 
        <Key 
            android:codes="105" 
            android:keyLabel="i" /> 
        <Key 
            android:codes="111" 
            android:keyLabel="o" /> 
        <Key 
            android:codes="112" 
            android:keyEdgeFlags="right" 
            android:keyLabel="p" /> 
    </Row> 
    <Row> 
        <Key 
            android:codes="97" 
            android:keyEdgeFlags="left" 
            android:keyLabel="a" /> 
        <Key 
            android:codes="115" 
            android:keyLabel="s" /> 
        <Key 
            android:codes="100" 
            android:keyLabel="d" /> 
        <Key 
            android:codes="102" 
            android:keyLabel="f" /> 
        <Key 
            android:codes="103" 
            android:keyLabel="g" /> 
        <Key 
            android:codes="104" 
            android:keyLabel="h" /> 
        <Key 
            android:codes="106" 
            android:keyLabel="j" /> 
        <Key 
            android:codes="107" 
            android:keyLabel="k" /> 
        <Key 
            android:codes="108" 
            android:keyLabel="l" /> 
        <Key 
            android:codes="42" 
            android:keyEdgeFlags="right" 
            android:keyLabel="@string/at_flag" /> 
    </Row> 
    <Row> 
        <Key 
            android:codes="-1" 
            android:isModifier="true" 
            android:isSticky="true" 
            android:keyEdgeFlags="left" 
            android:keyLabel="大写" 
            android:keyWidth="14.999998%p" /> 
        <Key 
            android:codes="122" 
            android:keyLabel="z" /> 
        <Key 
            android:codes="120" 
            android:keyLabel="x" /> 
        <Key 
            android:codes="99" 
            android:keyLabel="c" /> 
        <Key 
            android:codes="118" 
            android:keyLabel="v" /> 
        <Key 
            android:codes="98" 
            android:keyLabel="b" /> 
        <Key 
            android:codes="110" 
            android:keyLabel="n" /> 
        <Key 
            android:codes="109" 
            android:keyLabel="m" /> 
        <Key 
            android:codes="-5" 
            android:isRepeatable="true" 
            android:keyEdgeFlags="right" 
            android:keyLabel="退格" 
            android:keyWidth="14.999998%p" /> 
    </Row> 
    <Row android:rowEdgeFlags="bottom" > 
        <Key 
            android:codes="44" 
            android:keyEdgeFlags="left" 
            android:keyLabel="," 
            android:keyWidth="25%p" /> 
        <Key 
            android:codes="32" 
            android:isRepeatable="true" 
            android:keyLabel="空格" 
            android:keyWidth="25%p" /> 
        <Key 
            android:codes="46" 
            android:keyLabel="." 
            android:keyWidth="25%p" /> 
        <Key 
            android:codes="45" 
            android:keyLabel="-" 
            android:keyWidth="25%p" /> 
        <Key 
            android:codes="95" 
            android:keyLabel="_" 
            android:keyWidth="25%p" /> 
        <Key 
            android:codes="-3" 
            android:keyEdgeFlags="right" 
            android:keyLabel="完成" 
            android:keyWidth="25%p" /> 
    </Row> 

</Keyboard>

KeyboardUtil.java

package com.app.mobile.keyboard;

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.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

public class KeyboardUtil {

	private KeyboardView keyboardView;
	private Keyboard k1;
	public boolean isupper = false;// 是否大写
	boolean isShow = false;

	private EditText inputEditText;

	public KeyboardUtil( EditText edit) {
		this.inputEditText = edit;

		Activity act = (Activity) this.inputEditText.getContext();

		k1 = new Keyboard(act, R.xml.custom_softkeyboard_v1);
		keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view);
		keyboardView.setKeyboard(k1);
		keyboardView.setEnabled(true);

		keyboardView.setOnKeyboardActionListener(listener);

		setSoftKeyboradHide(act, edit);
	}

	private void setSoftKeyboradHide(Activity ctx,EditText edit)
	{
		ctx.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
		try { 
			Class<EditText> cls = EditText.class; 
			Method setShowSoftInputOnFocus = null; 
			String  method_setSoftInputOnFocus = "setShowSoftInputOnFocus";
			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);
		}

		private void checkIShowPrewiew(int primaryCode)
		{
			List<Integer> list = Arrays.asList(Keyboard.KEYCODE_CANCEL,Keyboard.KEYCODE_DELETE,Keyboard.KEYCODE_SHIFT,46,32,44);
			if(list.contains(primaryCode))
			{
				keyboardView.setPreviewEnabled(false);
			}else{
				keyboardView.setPreviewEnabled(true);
			}
		}

		@Override
		public void onKey(int primaryCode, int[] keyCodes) 
		{
			checkIShowPrewiew(primaryCode);
			Log.i("KeyBoard", "primaryCode="+primaryCode);

			Editable editable = inputEditText.getText();
			int start = inputEditText.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(k1);
			} else if (primaryCode == 57419) { // go left
				if (start > 0) {
					inputEditText.setSelection(start - 1);
				}
			}
			else if (primaryCode == 57421) 
			{ // go right
				if (start < inputEditText.length()) {
					inputEditText.setSelection(start + 1);
				}
			}else{
				editable.insert(start, Character.toString((char) primaryCode));
			}
		}
	};

	/**
	 * 键盘大小写切换
	 */
	private void changeKey() 
	{
		List<Key> 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 if (key.label.toString().equals("小写")) {
					key.label = "大写";
				}

			}
		} 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;
				} else if (key.label.toString().equals("大写")) {
					key.label = "小写";
				}
			}
		}
	}

	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;
	}
}

Activity

package com.app.mobile.keyboard;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.InputType;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;

public class MainActivity extends ActionBarActivity {

	private Activity act;

	private EditText edit;

	private  KeyboardUtil util; 

	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 

		setContentView(R.layout.activity_main); 
		act = this; 
		edit = (EditText) this.findViewById(R.id.edit1); 

		edit.setOnTouchListener(new OnTouchListener() { 
			@Override 
			public boolean onTouch(View v, MotionEvent event) { 
				showKeyBoardView();
				return false; 
			} 
		}); 

	}

	private void showKeyBoardView()
	{
		int inputType = edit.getInputType();
		edit.setInputType(InputType.TYPE_NULL);
		if(util==null)
		{
			util=new KeyboardUtil(edit); 
		}
		if(!util.isShow)
		{
			util.showKeyboard(); 
		}
		edit.setInputType(inputType);

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	} 

	@Override 
	public boolean onKeyDown(int keyCode, KeyEvent event) { 

		if(keyCode==KeyEvent.KEYCODE_BACK){ 
			if(util!=null && util.isShow){ 
				util.hideKeyboard(); 
			}else{ 
				finish(); 
			} 
			return false; 
		} 

		return super.onKeyDown(keyCode, event); 
	} 

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	} 

}
时间: 2024-10-12 12:33:09

Android App内置键盘开发的相关文章

使用Karabiner为Mac内置键盘、HHKB进行映射

使用Karabiner为Mac内置键盘.HHKB进行映射 Table of Contents 1. 引言 2. 什么是Karabiner和配置方法的基本说明 3. 内置键盘设置 4. HHKB设置 5. 通用设置 6. 待完善内容 1 引言 自从使用了Mac后,经过一系列折腾: 买了个HHKB Pro 2 TypeS,感觉手感确实不错,比内置键盘好多了,就是稍微有些硬. 编辑软件从Vim转为了Emacs 使用iTerm2作为常用Terminal 一些常用软件等等 现在使用Mac办公已经毫无压力.

android获取内置和外置SD卡路径 - z

本文将介绍Android真机环境下如何获取内置和外置SD卡路径. 测试环境:三星Note3,其他手机待测试... 所需权限(AndroidManifest.xml文件里) [html] view plain copy <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 获取路径代码(MainActivity.java文件) [java] view plain copy pa

android 怎样内置/预置/预编译文件(运行程序,应用程序,apk, jar, lib 等随意文件)到系统中

方法一: 如果要内置的软件名称为iperf.exe 1. 将iperf.exe放到Codebase的随意一个文件夹下(该文件夹必须可以在搜索Android.mk时被搜索到),比方system/iperf/iperf.exe 2. 在system/iperf文件夹下加入一个Android.mk文件,内容例如以下: LOCAL_PATH:= $(call my-dir) PRODUCT_COPY_FILES += $(LOCAL_PATH)/iperf.exe:system/iperf/iperf.

Android App内检测更新新版本APK

Rayland主板虽然作为一块基于Android的工控板,但是很多设备厂商并不想让用户看到Android系统信息.所以APK默认设置为开机启动项.img去除了Android头部和底部菜单.但是随之带来了APK更新的问题,传统的插入u盘,sd卡手动安装新版本APK的方式已经不够用了.所以我们需要点自动的东西. App内检测更新新版本APK 检测新版本APK 我们使用 四大组件之一的BroadcastReceiver来检测 sd卡或是u盘设备的接入. public class StorageMoun

Android 使用内置的Camera应用程序捕获图像

本Demo的实现效果是调用手机上已安装的照相机来实现拍照的功能,拍好的照片以ImageView形式展示. 目的:学习手机调用安装的相机照相,对大的图片处理有所认识,这里主要用到BitmapFactory和BitmapFactory.Options两个类. 载入并显示一副图像对内存使用情况有显著的影响,Android提供了一个名为BitmapFactory 的有用程序类,该程序提供了一系列的静态方法,同意通过各种来源载入Bitmap图像. 针对我们的需求,将从文件载入图像.并在最初的活动中显示它.

Android app内语言环境切换

逻辑很简单: 1  app内所有activity继承自BaseActivity或BaseActivity派生出来的子类,BaseActivity中维护了一个静态的app Activity访问栈,在创建和销毁时会执行压栈和出栈操作,所以mLocalStack内维持的是app中正在运行的activity. 2  将app的语言环境存储在SharedPreferences中,避免app重启时修改状态不改变:在BaseActivity创建时取出语言环境字符串并初始化Activity语言环境(initLa

原生APP内置PayPal网页支付方式

不多言,直入正题  快速结账(IOS和android通用,支持paypal支付和信用卡直接支付) 快速结账(Express Checkout)是移动端和网页端通用的接口,可以使用手机浏览器(webview)跳转实现支付. 沙箱环境测试: https://developer.paypal.com/developer/accounts?event=createSuccess 用申请下来的企业帐号登录上面的网站里,申请沙箱测试帐号 <h1>沙箱帐号密码测试</h1>           

Android手机内置邮件客户端设置方法

1. 打开手机,点击进入Android系统的“邮件”: 2. 进入后,选择其他(POP3/IMAP): 注:此处示例域名以turbomail.org为例,用户在填写时,改成自己单位的域名 输入您的完整的邮箱用户名([email protected] )和邮箱密码,点击“下一步”: 3. 收件服务器设置如下图(默认为POP),设置完点击“下一步”: POP3收件服务器地址:turbomail.org 端口号:110 4. 发件服务器设置如下图,设置完点击“下一步”: SMTP发件服务器地址:tur

thinkphp5 内置接口开发与使用

最近的一个项目在用tp5,对于tp3都几乎没用过的我来说~~~ tp5最好的一点就是对接口的单独封装,只要严格按照要求一步一步来就可以成功了 开启命令行: 配置环境变量 安装tp5项目 cmd进入项目目录,运行php think,出现如下内容,则表示命令行开启成功 具体指令参考手册 https://www.kancloud.cn/manual/thinkphp5/122951 创建自定义命令行(接口) 配置command.php文件,目录在application/command.php <?ph