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自定义软键盘的主要内容,如果未能解决你的问题,请参考以下文章

攻克Android软键盘的疑难杂症

自定义数字软键盘--封装版

Android自定义支付宝输入软键盘

Android自定义支付宝输入软键盘

如何使用软键盘在输入编辑文本字段区域中键入自定义字体? [关闭]

自定义软键盘输入盖住edittext的问题怎么解决