Android自定义键盘布局在侧面留下白色边缘

use*_*043 11 xml keyboard android ime

我正在研究Android的自定义键盘,我遇到了一个问题,键盘似乎在右边留下一个白线/空格,而不是填充父视图...(不要介意图标,它现在只是占位符图形)

模拟器的屏幕截图

下面你可以看到我的布局......

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="14%p"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    android:keyHeight="60dp"
    >
    <Row>
        <Key android:codes="49" android:keyIcon="@drawable/rsz_emoji" android:horizontalGap="1%p" android:keyEdgeFlags="left"/>
        <Key android:codes="50" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="51" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="52" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="53" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="54" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="48" android:keyIcon="@drawable/rsz_emoji" android:keyEdgeFlags="right"/>
    </Row>
    <Row>
        <Key android:codes="113" android:keyIcon="@drawable/rsz_emoji" android:horizontalGap="8%p" android:keyEdgeFlags="left"/>
        <Key android:codes="114" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="116" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="121" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="111" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="112" android:keyIcon="@drawable/rsz_emoji" android:keyEdgeFlags="right"/>
    </Row>
    <Row>
        <Key android:codes="1" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p" android:horizontalGap="8%p" android:keyEdgeFlags="left"/>
        <Key android:codes="46" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p"/>
        <Key android:codes="58" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p" android:keyEdgeFlags="right"/>
    </Row>
    <Row android:rowEdgeFlags="bottom">
        <Key android:codes="44" android:keyIcon="@drawable/globe" android:horizontalGap="8%p" android:keyEdgeFlags="left"/>
        <Key android:codes="47" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="32" android:keyIcon="@drawable/rsz_emoji" android:keyWidth="28%p"/>
        <Key android:codes="1" android:keyIcon="@drawable/rsz_emoji"/>
        <Key android:codes="-5" android:keyIcon="@drawable/backspace" android:keyEdgeFlags="right"/>
    </Row>
</Keyboard>
Run Code Online (Sandbox Code Playgroud)

据我所知,这是一个问题1%p...但我有点不确定如何填补它而不会弄乱我的路线......例如将第一行的间隙改为2会修复它,但是搞砸了对齐.

根据要求为您添加了额外的代码......

我的班级延伸InputMethodService:

    private KeyboardView kv;
    private Keyboard keyboard;

    @Override
    public View onCreateInputView() {
        kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
        keyboard = new Keyboard(this, R.xml.custom_keyboard);
        kv.setPreviewEnabled(false);
        kv.setKeyboard(keyboard);
        kv.setOnKeyboardActionListener(this);
        return kv;
    }

    @Override
    public void onPress(int primaryCode) {

    }

    @Override
    public void onRelease(int primaryCode) {

    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
        InputConnection ic = getCurrentInputConnection();

        if (primaryCode == Keyboard.KEYCODE_DELETE) {
            ic.deleteSurroundingText(1, 0);
        } else {
            Drawable mDrawable = ResourcesCompat.getDrawable(getResources(), R.drawable.rsz_emoji, null);
            Bitmap mBitmap = ((BitmapDrawable)mDrawable).getBitmap();
            String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "Emoticon", null);
            Uri fileUri = Uri.parse(path);

            Intent picMessageIntent = new Intent(Intent.ACTION_SEND);
            picMessageIntent.setPackage("com.android.mms");
            picMessageIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
            picMessageIntent.setType("image/png");
            picMessageIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(picMessageIntent);
        }
    }

    @Override
    public void onText(CharSequence text) {

    }

    @Override
    public void swipeLeft() {

    }

    @Override
    public void swipeRight() {

    }

    @Override
    public void swipeDown() {

    }

    @Override
    public void swipeUp() {

    }
Run Code Online (Sandbox Code Playgroud)

我的Keyboard.xml

<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    />
Run Code Online (Sandbox Code Playgroud)

Styles.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

表现:

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

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- Declares the input method service -->
        <service android:name=".CENSORED"
            android:label="@string/keyboard_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>

    <uses-permission android:name="android.permission.INTERNET" />
</manifest>
Run Code Online (Sandbox Code Playgroud)

Yve*_*omb 7

我无法重现错误,我提供了截图,带有浅色背景应用程序和所有相关代码.如果没有看到整个项目和目录,我不确定你到底出了什么问题,所以我发布了相关的xml.还有一个服务类,我没有包括(因为你显然有它工作).

<Keyboard>代码是在一个名为qwerty.xml在资源/ XML文件夹与文件名为method.xml:

我在qwerty.xml中使用了所有键盘尺寸,除了我替换了图像.

method.xml

<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android">
<subtype
    android:label="@string/subtype_en_US"
    android:imeSubtypeLocale="en_US"
    android:imeSubtypeMode="keyboard" />
</input-method>
Run Code Online (Sandbox Code Playgroud)

两个布局文件:

keyboard.xml

<?xml version="1.0" encoding="UTF-8"?>
<android.inputmethodservice.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:keyPreviewLayout ="@layout/preview"
/>
Run Code Online (Sandbox Code Playgroud)

preview.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:background="#ffff00"
    android:gravity="center"
    android:textSize="30sp
    android:textStyle="bold">
</TextView>
Run Code Online (Sandbox Code Playgroud)

样式:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

在清单中,在应用程序中:

<service
    android:name=".SimpleIME"
    android:label="@string/simple_ime"
    android:permission="android.permission.BIND_INPUT_METHOD"
    >
    <meta-data
        android:name="android.view.im"
        android:resource="@xml/method"/>
    <intent-filter>
        <action android:name="android.view.InputMethod"/>
    </intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)

我把图像留得太大,所以你可以清楚地看到没有间隙. 在此输入图像描述

此链接还会逐步执行此代码:

http://code.tutsplus.com/tutorials/create-a-custom-keyboard-on-android--cms-22615

编辑1

在评论中讨论后,我建议检查您的背景样式,因为键盘窗口可能会显示默认背景颜色的问题/更改.本回答/sf/answers/2313685391/中详细讨论了这个问题.我不会重申细节,因为这个链接不太可能腐烂,是一个受欢迎的SO帖子.

编辑2

确定在输入法服务中添加差异:

@Override
public void onKey(int primaryCode, int[] keyCodes) {
    InputConnection ic = getCurrentInputConnection();

    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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑3

创建一个空白项目,没有键盘活动,测试并将其作为单独的应用程序运行.您正在使用android:theme="@style/AppTheme.NoActionBar"在启动器活动中,可能存在背景不透明度和窗口/视图的问题.


Chr*_*ian 3

在您的情况下:7(键)x 14% = 98% + 1% 间隙 (firstkey\xc5\x9b horizontalGap) = 99%。

\n\n

将“%1”放入horizontalGap最后一个键中,就像在第一个键中所做的那样。

\n\n
<Row>\n        <Key android:codes="49" \n             android:keyIcon="@drawable/rsz_emoji" \n             android:horizontalGap="1%p" \n             android:keyEdgeFlags="left"/>\n        <Key android:codes="50" android:keyIcon="@drawable/rsz_emoji"/>\n        <Key android:codes="51" android:keyIcon="@drawable/rsz_emoji"/>\n        <Key android:codes="52" android:keyIcon="@drawable/rsz_emoji"/>\n        <Key android:codes="53" android:keyIcon="@drawable/rsz_emoji"/>\n        <Key android:codes="54" android:keyIcon="@drawable/rsz_emoji"/>\n        <Key android:codes="48" \n             android:keyIcon="@drawable/rsz_emoji" \n             android:horizontalGap="1%p"\n             android:keyEdgeFlags="right"/>\n</Row>\n
Run Code Online (Sandbox Code Playgroud)\n