Android自定义软键盘
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android自定义软键盘相关的知识,希望对你有一定的参考价值。
参考技术A android自定义键盘的使用1、新建一个xml文件夹放在res目录下面,然后新建xml文件:money_keyboard.xml
2、然后在XML文件中添加按钮布局,这个布局就是键盘的样子了
3 属性介绍:
Keyboard:
存储键盘以及按键相关信息。
android:horizontalGap
按键之间默认的水平间距。
android:verticalGap
按键之间默认的垂直间距。
android:keyHeight
按键的默认高度,以像素或显示高度的百分比表示。
android:keyWidth:
按键的默认宽度,以像素或显示宽度的百分比表示。
Row:
为包含按键的容器。
Key:
用于描述键盘中单个键的位置和特性。
android:codes
该键输出的unicode值。
android:codes 官网介绍是说这个是该键的unicode 值或者逗号分隔值,当然我们也可以设置成我们想要的值,在源码中提供了几个特定的值
对照表:
android:isRepeatable
这个属性如果设置为true,那么当长按该键时就会重复接受到该键上的动作,在 删除键键 和 空格键 上通常设为true。
android:keyLabel
显示在按键上的文字。
android:keyIcon 与 keyLabel
是二选一关系,它会代替文字以图标的形式显示在键上。
android:keyWidth="33.33333%p"
每一个按钮的宽度,可以设置百分比
android:keyHeight="10%p"
每一个按钮高度,可以设置百分比
KeyboardView是一个渲染虚拟键盘的View。 它处理键的渲染和检测按键和触摸动作。
显然我们需要KeyboardView来对Keyboard里的数据进行渲染并呈现给我们以及相关的点击事件做处理。 1)//设置keyboard与KeyboardView相关联的方法。
public void setKeyboard(Keyboard keyboard)
2)//设置虚拟键盘事件的监听,此方法必须设置,不然会报错。
public void setOnKeyboardActionListener(OnKeyboardActionListener listener) 步骤上呢,做完第一步的关联,并设置第二步的事件,调用KeyboardView.setVisible(true);键盘就可以显示出来了, 是不是很简单。不过到这里还没有结束哦,接下来我们为了使用上的便利要进行相应的封装。 封装 这里我们通过继承EditText来对Keyboard与KeyboardView进行封装。
attr.xml文件,这里我们需要通过一个xml类型的自定义属性引入我们的键盘描述文件。
1、新建一个类,我取名叫KeyUtils然后在里面新建三个属性。KeyBoard用处可大了,他才是本体,可以通过设置他来切换键盘。
2、构造函数,初始下三个参数。
3、先说下预览图吧,就是效果图上的预览图,需要预览图的话的将setPreviewEnabled设置为true,不过还得在布局文件中的android.inputmethodservice.KeyboardView标签对立面设置预览布局。否则,不会有字。至于设置的布局,一个TextView就好了~
onPress: 按下触发。
onRelease:松开触发。
onKey : 松开触发,在OnRelease之前触发。
swipeLeft : 左滑动,其他同理。哈哈~就这么懒。
onText :需要在 键盘xml,也就是我此时的number.xml里面中key标签对里添加一个
用于更改 android 运行时间的自定义软键盘
【中文标题】用于更改 android 运行时间的自定义软键盘【英文标题】:Custom soft keyboard for android run time changing 【发布时间】:2015-05-11 14:25:54 【问题描述】:我已经制作了一个软键盘应用程序,如下所示:custom soft keyboard
现在我需要一个选项来从我的 MainActivity 更改该键盘的背景。我该怎么做? 代码如下:
public class SimpleIME extends InputMethodService implements KeyboardView.OnKeyboardActionListener
private KeyboardView kv;
private Keyboard keyboard;
private boolean caps = false;
@Override
public View onCreateInputView()
kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
keyboard = new Keyboard(this, R.xml.qwerty);
kv.setKeyboard(keyboard);
kv.setOnKeyboardActionListener(this);
return kv;
private void playClick(int keyCode)
AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
switch(keyCode)
case 32:
am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
break;
case Keyboard.KEYCODE_DONE:
case 10:
am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
break;
case Keyboard.KEYCODE_DELETE:
am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
break;
default: am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
@Override
public void onKey(int primaryCode, int[] keyCodes)
InputConnection ic = getCurrentInputConnection();
playClick(primaryCode);
switch(primaryCode)
case Keyboard.KEYCODE_DELETE :
ic.deleteSurroundingText(1, 0);
break;
case Keyboard.KEYCODE_SHIFT:
caps = !caps;
keyboard.setShifted(caps);
kv.invalidateAllKeys();
break;
case Keyboard.KEYCODE_DONE:
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
break;
default:
char code = (char)primaryCode;
if(Character.isLetter(code) && caps)
code = Character.toUpperCase(code);
ic.commitText(String.valueOf(code),1);
这是带有应该改变背景的按钮的 MainActivity:
public class MainActivity extends Activity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.test_button);
button.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
//Change keyboard background
);
【问题讨论】:
【参考方案1】:您想在背景布局上添加图像还是更改为主题?
对于仅更改背景颜色,您需要在布局文件中添加背景颜色,对于主题,您需要首先创建主题,而不是在 java 代码上实现。喜欢以主题为样本;
// 示例默认主题
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
android:id="@+id/mainview">
<RelativeLayout
android:layout_
android:layout_
android:background="@color/colorBack">
<ImageView
android:layout_
android:layout_
android:padding="10dp"
android:id="@+id/menu_item"
android:layout_alignParentRight="true"
android:src="@drawable/ic_more_vert_white_24dp"/>
</RelativeLayout>
<android.inputmethodservice.KeyboardView
android:id="@+id/keyboard"
android:layout_
android:layout_
android:layout_alignParentBottom="true"
android:keyTextColor="@color/colorAccent"
android:padding="4px"
android:background="@drawable/images"
android:keyTextSize="18sp"
android:keyBackground="@color/colorTransparent"
android:keyPreviewLayout ="@layout/preview"/>
</LinearLayout>
对于新创建的 java 中的默认主题实现将如下:
@Override
public View onCreateInputView()
View view = null;
if (themes != null && themes.equals("default"))
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.default_theme, null);
imageView = (ImageView) view.findViewById(R.id.menu_item);
imageView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
openOptionsMenu(v);
);
kv = (KeyboardView) view.findViewById(keyboard);
//kv.setBackgroundResource(R.drawable.images);
qwertyKeyboard = new Keyboard(this, R.xml.qwerty);
kv.setKeyboard(qwertyKeyboard);
kv.setOnKeyboardActionListener(this);
kv.setOnTouchListener(new HapticListen(7));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
kv.setBackground(drawable);
return view;
else
return null;
希望我能帮助你理解。
【讨论】:
以上是关于Android自定义软键盘的主要内容,如果未能解决你的问题,请参考以下文章