如何制作Android自定义键盘?

问题描述 投票:76回答:8

我想制作一个自定义键盘。我不知道如何在xml和activity中做到这一点。这张照片是我的键盘型号。它只需要数字。

android keyboard
8个回答
70
投票

首先,您将需要一个keyboard.xml文件,该文件将放在res/xml文件夹中(如果该文件夹不存在,则创建它)。

<?xml version="1.0" encoding="utf-8"?> 
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="15%p"
    android:keyHeight="15%p" >

    <Row>
        <Key android:codes="1"    android:keyLabel="1" android:horizontalGap="4%p"/>
        <Key android:codes="2"    android:keyLabel="2" android:horizontalGap="4%p"/>
        <Key android:codes="3"    android:keyLabel="3" android:horizontalGap="4%p" />
        <Key android:codes="4"    android:keyLabel="4" android:horizontalGap="4%p" />
        <Key android:codes="5"    android:keyLabel="5" android:horizontalGap="4%p" />
    </Row>
    <Row>
        <Key android:codes="6"    android:keyLabel="6" android:horizontalGap="4%p"/>
        <Key android:codes="7"    android:keyLabel="7" android:horizontalGap="4%p"/>
        <Key android:codes="8"    android:keyLabel="8" android:horizontalGap="4%p" />
        <Key android:codes="9"    android:keyLabel="9" android:horizontalGap="4%p" />
        <Key android:codes="0"    android:keyLabel="0" android:horizontalGap="4%p" />
    </Row>

    <Row>
        <Key android:codes="-1"    android:keyIcon="@drawable/backspace" android:keyWidth="34%p" android:horizontalGap="4%p"/>
        <Key android:codes="100"    android:keyLabel="Enter" android:keyWidth="53%p" android:horizontalGap="4%p"/>
    </Row>
 </Keyboard>

**请注意,您必须创建backspace drawable并将其放在res / drawable-ldpi文件夹中,其尺寸非常小(如18x18像素)

然后在您希望它使用的xml文件中(TextView所在的位置),您应该添加以下代码:

<RelativeLayout
 ...
>

        .....


        <android.inputmethodservice.KeyboardView
             android:id="@+id/keyboardview"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
             android:focusable="true"
             android:focusableInTouchMode="true"
             android:visibility="gone" 
         />

        ......


</RelativeLayout>

**请注意,您将放置android.inputmethodservice.KeyboardView的xml文件必须是RelativeLayout才能设置alignParentBottom="true"(通常键盘显示在屏幕底部)

然后你需要在onCreateActivity函数中添加以下代码,该函数处理你想要将键盘连接到的TextView

    // Create the Keyboard
    mKeyboard= new Keyboard(this,R.xml.keyboard);

    // Lookup the KeyboardView
    mKeyboardView= (KeyboardView)findViewById(R.id.keyboardview);
    // Attach the keyboard to the view
    mKeyboardView.setKeyboard( mKeyboard );

    // Do not show the preview balloons
    //mKeyboardView.setPreviewEnabled(false);

    // Install the key handler
    mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener);

**请注意,mKeyboardmKeyboardView是您必须创建的私有类变量。

然后你需要以下函数来打开键盘(你必须通过onClick xml属性将它与TextView相关联)

    public void openKeyboard(View v)
    {
       mKeyboardView.setVisibility(View.VISIBLE);
       mKeyboardView.setEnabled(true);
       if( v!=null)((InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
    }

最后你需要能够处理你事件的OnKeyboardActionListener

private OnKeyboardActionListener mOnKeyboardActionListener = new OnKeyboardActionListener() {
    @Override public void onKey(int primaryCode, int[] keyCodes) 
    {
         //Here check the primaryCode to see which key is pressed 
         //based on the android:codes property
         if(primaryCode==1)
         {
            Log.i("Key","You just pressed 1 button");
         }
    }

    @Override public void onPress(int arg0) {
    }

    @Override public void onRelease(int primaryCode) {
    }

    @Override public void onText(CharSequence text) {
    }

    @Override public void swipeDown() {
    }

    @Override public void swipeLeft() {
    }

    @Override public void swipeRight() {
    }

    @Override public void swipeUp() {
    }
};

希望有所帮助!

大部分代码都找到了here


47
投票

System keyboard

这个答案告诉我们如何制作一个可以在用户手机上安装的任何应用程序中使用的自定义系统键盘。如果你想制作一个只能在你自己的应用程序中使用的键盘,那么see my other answer

以下示例如下所示。您可以为任何键盘布局修改它。

enter image description here

以下步骤说明如何创建可用的自定义系统键盘。我尽可能地尝试删除任何不必要的代码。如果您还需要其他功能,我最后会提供更多帮助的链接。

1. Start a new Android project

我将我的项目命名为“自定义键盘”。随便打电话给你。这里没有什么特别的。我将离开MainActivity和“Hello World!”布局原样。

2. Add the layout files

将以下两个文件添加到应用程序的res/layout文件夹中:

  • keyboard_view.xml
  • key_preview.xml

keyboard_view.xml

这个视图就像一个容纳我们键盘的容器。在这个例子中只有一个键盘,但你可以添加其他键盘并将它们交换进这个KeyboardView

<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyPreviewLayout="@layout/key_preview"
    android:layout_alignParentBottom="true">

</android.inputmethodservice.KeyboardView>

key_preview.xml

键预览是按键盘键时弹出的布局。它只显示你正在按下的键(如果你的大指,胖指覆盖它)。这不是一个多选弹出窗口。为此你应该看看Candidates view

<?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:gravity="center"
    android:background="@android:color/white"
    android:textColor="@android:color/black"
    android:textSize="30sp">
</TextView>

3. Add supporting xml files

xml文件夹中创建一个res文件夹。 (右键单击res并选择New> Directory。)

然后将以下两个xml文件添加到其中。 (右键单击xml文件夹,然后选择“新建”>“XML资源文件”。)

  • number_pad.xml
  • method.xml

number_pad.xml

这是它开始变得更有趣的地方。这个Keyboard定义了keys的布局。

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="20%p"
    android:horizontalGap="5dp"
    android:verticalGap="5dp"
    android:keyHeight="60dp">

    <Row>
        <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
        <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" android:keyEdgeFlags="right"/>
    </Row>

    <Row>
        <Key android:codes="54" android:keyLabel="6" android:keyEdgeFlags="left"/>
        <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:keyLabel="0" android:keyEdgeFlags="right"/>
    </Row>

    <Row>
        <Key android:codes="-5"
             android:keyLabel="DELETE"
             android:keyWidth="40%p"
             android:keyEdgeFlags="left"
             android:isRepeatable="true"/>
        <Key android:codes="10"
             android:keyLabel="ENTER"
             android:keyWidth="60%p"
             android:keyEdgeFlags="right"/>
    </Row>

</Keyboard>

以下是一些需要注意的事项:

  • keyWidth:这是每个键的默认宽度。 20%p意味着每个键应占据父级宽度的20%。但是,它可以被单个键覆盖,正如您可以看到的那样,第三行中的Delete和Enter键发生了。
  • keyHeight:这里硬编码,但你可以使用类似@dimen/key_height的东西来动态设置不同的屏幕尺寸。
  • Gap:水平和垂直间隙表示按键之间留出多少空间。即使你把它设置为0px,仍然存在一个小差距。
  • codes:这可以是Unicode或自定义代码值,用于确定按下键时发生的情况或输入的内容。如果要输入更长的Unicode字符串,请参阅keyOutputText
  • keyLabel:这是键上显示的文本。
  • keyEdgeFlags:这表示密钥应与哪个边对齐。
  • isRepeatable:如果按住键,它将继续重复输入。

method.xml

该文件告诉系统可用的输入方法子类型。我只是在这里包含一个最小版本。

<?xml version="1.0" encoding="utf-8"?>
<input-method
    xmlns:android="http://schemas.android.com/apk/res/android">

    <subtype
        android:imeSubtypeMode="keyboard"/>

</input-method>

4. Add the Java code to handle key input

创建一个新的Java文件。我们称之为MyInputMethodService。该文件将所有内容联系在一它处理从键盘接收的输入并将其发送到接收它的任何视图(例如,EditText)。

public class MyInputMethodService extends InputMethodService implements KeyboardView.OnKeyboardActionListener {

    @Override
    public View onCreateInputView() {
        // get the KeyboardView and add our Keyboard layout to it
        KeyboardView keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null);
        Keyboard keyboard = new Keyboard(this, R.xml.number_pad);
        keyboardView.setKeyboard(keyboard);
        keyboardView.setOnKeyboardActionListener(this);
        return keyboardView;
    }

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

        InputConnection ic = getCurrentInputConnection();
        if (ic == null) return;
        switch (primaryCode) {
            case Keyboard.KEYCODE_DELETE:
                CharSequence selectedText = ic.getSelectedText(0);
                if (TextUtils.isEmpty(selectedText)) {
                    // no selection, so delete previous character
                    ic.deleteSurroundingText(1, 0);
                } else {
                    // delete the selection
                    ic.commitText("", 1);
                }
                ic.deleteSurroundingText(1, 0);
                break;
            default:
                char code = (char) primaryCode;
                ic.commitText(String.valueOf(code), 1);
        }
    }

    @Override
    public void onPress(int primaryCode) { }

    @Override
    public void onRelease(int primaryCode) { }

    @Override
    public void onText(CharSequence text) { }

    @Override
    public void swipeLeft() { }

    @Override
    public void swipeRight() { }

    @Override
    public void swipeDown() { }

    @Override
    public void swipeUp() { }
}

笔记:

  • OnKeyboardActionListener听取键盘输入。在这个例子中,它还需要所有那些空方法。
  • InputConnection用于将输入发送到另一个视图,如EditText

5. Update the manifest

我把它放在最后而不是第一,因为它指的是我们上面已经添加的文件。要将自定义键盘注册为系统键盘,您需要在AndroidManifest.xml文件中添加service部分。把它放在application之后的activity部分。

<manifest ...>
    <application ... >
        <activity ... >
            ...
        </activity>

        <service
            android:name=".MyInputMethodService"
            android:label="Keyboard Display Name"
            android:permission="android.permission.BIND_INPUT_METHOD">
            <intent-filter>
                <action android:name="android.view.InputMethod"/>
            </intent-filter>
            <meta-data
                android:name="android.view.im"
                android:resource="@xml/method"/>
        </service>

    </application>
</manifest>

而已!您应该能够立即运行您的应用程序。但是,在设置中启用键盘之前,您不会看到太多内容。

6. Enable the keyboard in Settings

每个想要使用键盘的用户都必须在Android设置中启用它。有关如何执行此操作的详细说明,请参阅以下链接:

以下是摘要:

  • 转到Android设置>语言并输入>当前键盘>选择键盘。
  • 您应该在列表中看到自定义键盘。启用它。
  • 返回并再次选择当前键盘。您应该在列表中看到自定义键盘。选择它。

现在,您应该可以在任何可以在Android中输入的键盘使用键盘。

Further study

上面的键盘是可用的,但是要创建其他人想要使用的键盘,您可能需要添加更多功能。研究下面的链接,了解如何。

Going On

不喜欢标准KeyboardView的外观和行为?我当然不会。看起来自Android 2.0以来它还没有更新。 Play商店中的所有自定义键盘怎么样?它们看起来不像上面的丑陋键盘。

好消息是您可以完全自定义键盘的外观和行为。您需要执行以下操作:

  1. 创建自己的自定义键盘视图,该视图是ViewGroup的子类。您可以使用Buttons填充它,甚至可以创建自己的自定义键视图,这些视图是View的子类。如果你使用弹出视图,那么note this
  2. 在键盘中添加custom event listener界面。称它为onKeyClicked(String text)onBackspace()之类的方法。
  3. 您不需要添加上述说明中描述的keyboard_view.xmlkey_preview.xmlnumber_pad.xml,因为这些都是标准的KeyboardView。您将在自定义视图中处理所有这些UI方面。
  4. MyInputMethodService类中,实现您在键盘类中定义的自定义键盘侦听器。这取代了不再需要的KeyboardView.OnKeyboardActionListener
  5. 在你的qazxsw poi类qazxsw poi方法中,创建并返回自定义键盘的实例。不要忘记将键盘的自定义监听器设置为MyInputMethodService

30
投票

使用onCreateInputView()

this

现在你有KeyboardView这是一个普通的看法。

关于这一点的好处是KeyboardView kbd = new KeyboardView(context); kbd.setKeyboard(new Keyboard(this, R.xml.custom)); kbd.setOnKeyboardActionListener(new OnKeyboardActionListener() { .... } 指的是kbd,它在xml中定义了键盘的布局。有关此文件的更多信息,请查看:R.xml.custom/res/xml/custom.xmlKeyboard


21
投票

In-App Keyboard

这个答案告诉我们如何使自定义键盘在您的应用程序中独占使用。如果你想制作一个可以在任何应用程序中使用的系统键盘,那么Keyboard.Row

示例将如下所示。您可以为任何键盘布局修改它。

Keyboard.Key

1. Start a new Android project

我将我的项目命名为see my other answer。无论你想要什么,打电话给你。

2. Add the layout files

键盘布局

将布局文件添加到enter image description here文件夹。我打电话给我的InAppKeyboard。键盘将是一个自定义的res/layout,我们将从这个xml布局文件中膨胀。您可以使用您喜欢的任何布局来排列键,但我使用的是keyboard。请注意compound view标签。

RES /布局/ keyboard.xml

LinearLayout

活动布局

出于演示目的,我们的活动有一个merge,键盘位于底部。我打电话给我的自定义键盘视图<merge xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button_1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="1"/> <Button android:id="@+id/button_2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="2"/> <Button android:id="@+id/button_3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="3"/> <Button android:id="@+id/button_4" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="4"/> <Button android:id="@+id/button_5" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="5"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button_6" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="6"/> <Button android:id="@+id/button_7" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="7"/> <Button android:id="@+id/button_8" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="8"/> <Button android:id="@+id/button_9" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="9"/> <Button android:id="@+id/button_0" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="0"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/button_delete" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:text="Delete"/> <Button android:id="@+id/button_enter" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:text="Enter"/> </LinearLayout> </LinearLayout> </merge> 。 (我们将很快添加此代码,因此暂时忽略该错误。)将所有键盘代码放入单个视图的好处是,它可以轻松地在其他活动或应用程序中重用。

RES /布局/ activity_main.xml中

EditText

3. Add the Keyboard Java file

添加新的Java文件。我打电话给我的MyKeyboard

这里要注意的最重要的事情是,没有与任何<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.inappkeyboard.MainActivity"> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#c9c9f1" android:layout_margin="50dp" android:padding="5dp" android:layout_alignParentTop="true"/> <com.example.inappkeyboard.MyKeyboard android:id="@+id/keyboard" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_alignParentBottom="true"/> </RelativeLayout> MyKeyboard的硬链接。这样可以轻松地将其插入任何需要它的应用程序或活动中。此自定义键盘视图还使用EditText,它模仿系统键盘与Activity通信的方式。这就是我们如何避免硬链接。

InputConnection是一个复合视图,它膨胀了我们在上面定义的视图布局。

my keyboard.Java

EditText

4. Point the keyboard to the EditText

对于系统键盘,Android使用MyKeyboard将键盘指向聚焦的public class MyKeyboard extends LinearLayout implements View.OnClickListener { // constructors public MyKeyboard(Context context) { this(context, null, 0); } public MyKeyboard(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyKeyboard(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } // keyboard keys (buttons) private Button mButton1; private Button mButton2; private Button mButton3; private Button mButton4; private Button mButton5; private Button mButton6; private Button mButton7; private Button mButton8; private Button mButton9; private Button mButton0; private Button mButtonDelete; private Button mButtonEnter; // This will map the button resource id to the String value that we want to // input when that button is clicked. SparseArray<String> keyValues = new SparseArray<>(); // Our communication link to the EditText InputConnection inputConnection; private void init(Context context, AttributeSet attrs) { // initialize buttons LayoutInflater.from(context).inflate(R.layout.keyboard, this, true); mButton1 = (Button) findViewById(R.id.button_1); mButton2 = (Button) findViewById(R.id.button_2); mButton3 = (Button) findViewById(R.id.button_3); mButton4 = (Button) findViewById(R.id.button_4); mButton5 = (Button) findViewById(R.id.button_5); mButton6 = (Button) findViewById(R.id.button_6); mButton7 = (Button) findViewById(R.id.button_7); mButton8 = (Button) findViewById(R.id.button_8); mButton9 = (Button) findViewById(R.id.button_9); mButton0 = (Button) findViewById(R.id.button_0); mButtonDelete = (Button) findViewById(R.id.button_delete); mButtonEnter = (Button) findViewById(R.id.button_enter); // set button click listeners mButton1.setOnClickListener(this); mButton2.setOnClickListener(this); mButton3.setOnClickListener(this); mButton4.setOnClickListener(this); mButton5.setOnClickListener(this); mButton6.setOnClickListener(this); mButton7.setOnClickListener(this); mButton8.setOnClickListener(this); mButton9.setOnClickListener(this); mButton0.setOnClickListener(this); mButtonDelete.setOnClickListener(this); mButtonEnter.setOnClickListener(this); // map buttons IDs to input strings keyValues.put(R.id.button_1, "1"); keyValues.put(R.id.button_2, "2"); keyValues.put(R.id.button_3, "3"); keyValues.put(R.id.button_4, "4"); keyValues.put(R.id.button_5, "5"); keyValues.put(R.id.button_6, "6"); keyValues.put(R.id.button_7, "7"); keyValues.put(R.id.button_8, "8"); keyValues.put(R.id.button_9, "9"); keyValues.put(R.id.button_0, "0"); keyValues.put(R.id.button_enter, "\n"); } @Override public void onClick(View v) { // do nothing if the InputConnection has not been set yet if (inputConnection == null) return; // Delete text or input key value // All communication goes through the InputConnection if (v.getId() == R.id.button_delete) { CharSequence selectedText = inputConnection.getSelectedText(0); if (TextUtils.isEmpty(selectedText)) { // no selection, so delete previous character inputConnection.deleteSurroundingText(1, 0); } else { // delete the selection inputConnection.commitText("", 1); } } else { String value = keyValues.get(v.getId()); inputConnection.commitText(value, 1); } } // The activity (or some parent or controller) must give us // a reference to the current EditText's InputConnection public void setInputConnection(InputConnection ic) { this.inputConnection = ic; } } 。在此示例中,活动将通过提供从InputMethodManager到我们的自定义键盘的链接来取代它。

由于我们没有使用系统键盘,我们需要禁用它以防止它在我们触摸EditText时弹出。其次,我们需要从EditText获取EditText并将其交给我们的键盘。

main activity.Java

InputConnection

如果您的Activity有多个EditTexts,那么您需要编写代码以将正确的EditText的EditText传递给键盘。 (您可以通过在EditTexts中添加public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EditText editText = (EditText) findViewById(R.id.editText); MyKeyboard keyboard = (MyKeyboard) findViewById(R.id.keyboard); // prevent system keyboard from appearing when EditText is tapped editText.setRawInputType(InputType.TYPE_CLASS_TEXT); editText.setTextIsSelectable(true); // pass the InputConnection from the EditText to the keyboard InputConnection ic = editText.onCreateInputConnection(new EditorInfo()); keyboard.setInputConnection(ic); } } InputConnection来实现此目的。有关此问题的讨论,请参阅OnFocusChangeListener。)您可能还希望在适当的时间隐藏或显示键盘。

Finished

而已。您应该能够立即运行示例应用程序并根据需要输入或删除文本。您的下一步是修改所有内容以满足您自己的需求。例如,在我的一些键盘中,我使用了TextViews而不是Buttons,因为它更容易定制它们。

Notes

  • 在xml布局文件中,如果你想让键看起来更好,你也可以使用OnClickListener而不是this article。然后只需使背景成为可绘制的,可在按下时更改外观状态。
  • 高级自定义键盘:为了在键盘外观和键盘切换方面提供更大的灵活性,我现在正在制作自定义键视图,这些视图将TextView和自定义键盘子类化为Button的子类。键盘以编程方式显示所有键。密钥使用接口与键盘通信(类似于片段与活动的通信方式)。如果您只需要一个键盘布局,则不需要这样做,因为xml布局可以正常工作。但是,如果你想看一个我一直在努力的例子,请查看所有ViewViewGroupKey*。请注意,我还使用容器视图,其功能是将键盘交换进出。

14
投票

这是一个软键盘的示例项目。

Keyboard*

你的应该采用不同的布局。

编辑:如果您只需要在您的应用程序中使用键盘,它非常简单!创建具有垂直方向的线性布局,并在其内部以水平方向创建3个线性布局。然后将每行的按钮放在每个水平线性布局中,并将权重属性分配给按钮。对所有这些使用android:layout_weight = 1,所以它们间隔相等。

这将解决。如果您没有得到预期的结果,请在此处发布代码,我们随时为您提供帮助!


6
投票

我发现的最好的文档示例之一。

here

提供了https://developer.android.com/guide/topics/text/creating-input-method.html相关的XML文件和源代码。


1
投票

有同样的问题。我首先使用了表格布局,但按下按钮后布局不断变化。发现这个页面非常有用。 http://www.fampennings.nl/maarten/android/09keyboard/index.htm


1
投票

我最近在试图决定使用什么方法来创建我自己的自定义键盘时遇到过这篇文章。我发现Android系统API非常有限,所以我决定制作自己的应用内键盘。使用KeyboardView作为我研究的基础,我继续设计http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-creating-a-numeric-keypad-with-gridlayout/。它发布在GitHub上,带有MIT许可证。希望这将为其他人节省大量时间和头痛。

该架构非常灵活。您可以使用所需的任何键盘布局和控制器注入一个主视图(Custom KeyboardView)。

您只需在活动xml中声明CustomKeyboardView(您也可以以编程方式执行):

Suragch's answer

然后用它注册EditText并告诉它应该使用什么类型的键盘:

my own keyboard component

CustomKeyboardView处理剩下的事情!

我已经用Number,NumberDecimal和QWERTY键盘滚动了球。随意下载并创建自己的布局和控制器。它看起来像这样:

即使这不是你决定使用的架构,希望看到工作应用内键盘的源代码会很有帮助。

再次,这是项目的链接: <com.donbrody.customkeyboard.components.keyboard.CustomKeyboardView android:id="@+id/customKeyboardView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" />

© www.soinside.com 2019 - 2024. All rights reserved.