android - 在android中创建自定义键盘

标签 android android-softkeyboard android-keypad android-input-method

我想在我的 Android 应用程序中创建一个自定义键盘,如下所示:

https://www.dropbox.com/s/vwiz4o3pd8q4o81/2015-06-14%2014.53.02.jpg?dl=0

我尝试使用键盘 View ,但无法获得我想要的。我还查看了有关自定义键盘的在线教程,但似乎没有人给出有关如何制作我想要的键盘的提示。我试过将 png 图像作为键盘的背景,但这没有帮助。到目前为止,我已经做到了:

https://www.dropbox.com/s/xrm4v941ofecmut/2015-06-14%2014.54.10.jpg?dl=0

我能否获得有助于解决我的问题的帮助或指向教程和代码的链接。

这是我当前的代码:

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="14.25%p"
    android:hapticFeedbackEnabled="true"
    android:keyHeight="8.5%p">
<!--
    android:horizontalGap="0.50%p"
    android:verticalGap="0.50%p"
    NOTE When we add a horizontalGap in pixels, this interferes with keyWidth in percentages adding up to 100%
    NOTE When we have a horizontalGap (on Keyboard level) of 0, this make the horizontalGap (on Key level) to move from after the key to before the key... (I consider this a bug) 
 -->
    <Row>
            <Key android:codes="-1"     android:keyLabel="EVALUATE" android:keyWidth="42.75%p"  android:keyEdgeFlags="left"   />
            <Key android:codes="-100"     android:keyLabel="RESET" android:keyWidth="28.50%p"     />
            <Key android:codes="-1000"     android:keyLabel="\u24D8" android:keyWidth="28.50%p"    android:keyEdgeFlags="right"  />
    </Row> 

    <Row>
        <Key android:codes="1"      android:keyLabel="sin"     android:keyEdgeFlags="left" />
        <Key android:codes="2"      android:keyLabel="cos"  />
        <Key android:codes="3"      android:keyLabel="tan"  />
        <Key android:codes="36"     android:keyLabel="sinh"        />
        <Key android:codes="37"     android:keyLabel="cosh"     />
        <Key android:codes="38"     android:keyLabel="tanh"   />
        <Key android:codes="-2"     android:keyIcon="@drawable/delete_symbol"        android:isRepeatable="true"     android:keyEdgeFlags="right"/>
    </Row>   

    <Row>
        <Key android:codes="4"      android:keyLabel="asin"      android:keyEdgeFlags="left" />
        <Key android:codes="5"      android:keyLabel="acos"    />
        <Key android:codes="6"      android:keyLabel="atan"  />
        <Key android:codes="42"     android:keyLabel="asinh"        />
        <Key android:codes="43"     android:keyLabel="acosh"     />
        <Key android:codes="44"     android:keyLabel="atanh"   />
        <Key android:codes="21"     android:keyLabel="\u00F7"   android:keyEdgeFlags="right" />   
    </Row>
    <Row>
        <Key android:codes="7"      android:keyLabel="cosec"       android:keyEdgeFlags="left" />
        <Key android:codes="8"      android:keyLabel="sec"      />
        <Key android:codes="9"      android:keyLabel="cot"      />
        <Key android:codes="33"     android:keyLabel="7"        />
        <Key android:codes="34"     android:keyLabel="8"       />
        <Key android:codes="35"     android:keyLabel="9"      />
        <Key android:codes="20"     android:keyLabel="\u00D7"    android:keyEdgeFlags="right" />   
    </Row>
    <Row>
        <Key android:codes="11"     android:keyLabel="e^("    />
        <Key android:codes="12"     android:keyLabel="ln("   />
        <Key android:codes="22"     android:keyLabel="x\u207F" />
        <Key android:codes="30"     android:keyLabel="4"       />
        <Key android:codes="31"     android:keyLabel="5"        />
        <Key android:codes="32"     android:keyLabel="6"     />
        <Key android:codes="19"     android:keyLabel="\u2212"   android:keyEdgeFlags="right" />
    </Row>
    <Row>
        <Key android:codes="14"     android:keyLabel="k"        android:keyEdgeFlags="left" />
        <Key android:codes="15"     android:keyLabel="\u03C0"  />
        <Key android:codes="13"     android:keyIcon="@drawable/italic_x"  />
        <Key android:codes="27"     android:keyLabel="1"         />
        <Key android:codes="28"     android:keyLabel="2"        />
        <Key android:codes="29"     android:keyLabel="3"      />
        <Key android:codes="18"     android:keyLabel="+"     android:keyEdgeFlags="right" />
    </Row>
    <Row>
        <Key android:codes="-3"     android:keyIcon="@drawable/keyboard_done"  android:keyWidth="28.5%p" android:keyEdgeFlags="left"   />   
        <Key android:codes="10"     android:keyLabel="\u221a"  />
        <Key android:codes="16"     android:keyLabel="("         />
        <Key android:codes="26"     android:keyLabel="0"      />
        <Key android:codes="17"     android:keyLabel=")"   />  
        <Key android:codes="23"     android:keyLabel="." android:keyEdgeFlags="right" />
    </Row>

</Keyboard>

xml 文件的 java 处理程序代码是:

class CustomKeyboard {

private Activity  mHostActivity;

private Button doneButton = null;
private Button clearButton = null;
private Button infoButton = null;

/** The key (code) handler. */
private OnKeyboardActionListener mOnKeyboardActionListener = new OnKeyboardActionListener() {

public final static int CodeEvaluate  = -1;
public final static int CodeClear  = -100;
public final static int CodeInfo  = -1000;
public final static int CodeDelete    = -2; // Keyboard.KEYCODE_DELETE
public final static int CodeHide      = -3; // Keyboard.KEYCODE_CANCEL

public final static int CodeMINIMUM   = 0;
public final static int CodeSin       = 1;
public final static int CodeCos       = 2;
public final static int CodeTan       = 3;
public final static int CodeAsin      = 4;
public final static int CodeAcos      = 5;
public final static int CodeAtan      = 6;
public final static int CodeCosec     = 7;
public final static int CodeSec       = 8;
public final static int CodeCot       = 9;
public final static int CodeSqrt      = 10;
public final static int CodeExp       = 11;
public final static int CodeLn        = 12;
public final static int CodeX         = 13;
public final static int CodeK         = 14;
public final static int CodePI        = 15;
public final static int CodeOpenB     = 16;
public final static int CodeCloseB    = 17;
public final static int CodePlus      = 18;
public final static int CodeMinus     = 19;
public final static int CodeMultiply  = 20;
public final static int CodeDivide    = 21;
public final static int CodePower     = 22;
public final static int CodePoint     = 23;
public final static int CodeABC       = 24;
public final static int CodeSpace     = 25;

public final static int CodeMAXIMUM   = 50;   // maximum number of Keys

public String[] keyCodeToText = null;

public void keysInitialise()
{
if(keyCodeToText==null) keyCodeToText = new String[CodeMAXIMUM];
keyCodeToText[CodeSin]      = "sin(";
keyCodeToText[CodeCos]      = "cos(";
keyCodeToText[CodeTan]      = "tan(";
keyCodeToText[CodeAsin]     = "asin(";
keyCodeToText[CodeAcos]     = "acos(";
keyCodeToText[CodeAtan]     = "atan(";
keyCodeToText[CodeCosec]    = "cosec(";
keyCodeToText[CodeSec]      = "sec(";
keyCodeToText[CodeCot]      = "cot(";
keyCodeToText[CodeSqrt]     = "sqrt(";
keyCodeToText[CodeExp]      = "e^(";
keyCodeToText[CodeLn]       = "ln(";
keyCodeToText[CodeX]        = "x";
keyCodeToText[CodeK]        = "k";
keyCodeToText[CodePI]       = "pi";
keyCodeToText[CodeOpenB]    = "(";
keyCodeToText[CodeCloseB]   = ")";
keyCodeToText[CodePlus]     = "+";
keyCodeToText[CodeMinus]    = "-";
keyCodeToText[CodeMultiply] = "*";
keyCodeToText[CodeDivide]   = "/";
keyCodeToText[CodePower]    = "^";
keyCodeToText[CodePoint]    = ".";
keyCodeToText[CodeABC  ]    = "";
}


@Override 
public void onKey(int primaryCode, int[] keyCodes) {

// Get the EditText and its Editable
View focusCurrent = mHostActivity.getWindow().getCurrentFocus();
if( focusCurrent==null || focusCurrent.getClass()!=EditText.class )    return;

EditText edittext = (EditText) focusCurrent;
Editable editable = edittext.getText();
int start = edittext.getSelectionStart();

keysInitialise();

// Apply the key to the edittext
if(primaryCode == CodeEvaluate) {
if(doneButton != null) doneButton.performClick();
}
else if (primaryCode == CodeClear){
if(clearButton != null) clearButton.performClick();
}
else if (primaryCode == CodeInfo){
if(infoButton != null) infoButton.performClick();
}
else if(primaryCode ==CodeDelete) {
if( editable!=null && start>0 ) editable.delete(start - 1, start);
}
else if(primaryCode == CodeHide) {
hideCustomKeyboard();
}
else if(primaryCode > CodeMINIMUM && primaryCode < CodeMAXIMUM) {
editable.insert(start, keyCodeToText[primaryCode]);
}
else editable.insert(start, Integer.toString(primaryCode));
}

@Override public void onPress(int arg0) {
}

@Override public void onRelease(int primaryCode) {
}

@Override public void onText(CharSequence text) {
}

public CustomKeyboard(Activity host, int viewid, int layoutid) {
mHostActivity= host;
mKeyboardView= (KeyboardView)mHostActivity.findViewById(viewid);
mKeyboardView.setKeyboard(new Keyboard(mHostActivity, layoutid));
mKeyboardView.setPreviewEnabled(false); // NOTE Do not show the preview balloons
mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener);
}

/** Returns whether the CustomKeyboard is visible. */
public boolean isCustomKeyboardVisible() {
    return mKeyboardView.getVisibility() == View.VISIBLE;
}

/** Make the CustomKeyboard visible, and hide the system keyboard for the given view. */
public void showCustomKeyboard(View v) {
mKeyboardView.setVisibility(View.VISIBLE);
mKeyboardView.setEnabled(true);
}

/** Make the CustomKeyboard invisible. */
public void hideCustomKeyboard() {
mKeyboardView.setVisibility(View.GONE);
mKeyboardView.setEnabled(false);
}

/** Hide standard keyboard */
private void hideStandardKeyboard(View v) {
    if(v != null) ((InputMethodManager)mHostActivity.getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
}

/** Register the doneButton for which doneButton.performClick()
 *  will be called when the "Done" keypad-button is clicked.
 */
public void registerDoneButton (Button doneButton) {
this.doneButton = doneButton;
}
public void registerClearButton (Button clearButton) {
this.clearButton = clearButton;
}
public void registerInfoButton (Button infoButton) {
this.infoButton = infoButton;
}
/**
* Register <var>EditText<var> for using this custom keyboard.
*
* @param The EditText that registers to the custom keyboard.
*/
public void registerEditText(EditText edittext) {

// Make the custom keyboard appear or disappear
edittext.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) showCustomKeyboard(v);
else hideCustomKeyboard();
}
});

edittext.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
showCustomKeyboard(v);
}
});

edittext.setOnTouchListener(new OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
((EditText) v).onTouchEvent(event);
hideStandardKeyboard(v);
return true; // Consume touch event
}
});
}

最佳答案

由于您拥有键盘的布局 xml,因此要使您的键盘与第一张图片中显示的键盘相同。您应该有键 View 的背景并将其添加到每个键。

关于android - 在android中创建自定义键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30830182/

相关文章:

android - 强制 Android 软键盘处于 NumberPassword 模式而不使用 EditText

android - 如何在webview中显示键盘隐藏的内容

java - Android Socket Connection Refused ETIMEDOUT(连接超时)

android - 如何以编程方式从辅助服务中添加和删除布局?

android - 如何在 Android 中使用 Room 存储对象数组?

event-handling - 为什么某些字符没有调用 onKeyUp 或 onKeyDown?

android - 如何在输入类型设置为空的情况下使光标可见?

android - imageView 的 setVisibility(View.VISIBLE) 不起作用

android - 在我的项目中,键盘应该固定在我的 Activity 本身中

java - Android 以编程方式在按钮单击上打开“选择输入方法”选项卡