Специальная раскладка клавиатуры на Android, оставляющая край белого цвета сбоку
Я работаю над пользовательской клавиатурой для 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>
Насколько я вижу, это вопрос 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() {
}
My 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"
/>
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>
манифеста:
<?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>
Ответы
Ответ 1
Я не могу воспроизвести ошибку, я предоставил скриншот, с легким фоном и всем моим соответствующим кодом. Я не уверен, где именно вы ошибетесь, не увидев весь проект и каталоги, поэтому я разместил соответствующий xml. Существует также класс обслуживания, который я не включил (так как вы, очевидно, его работаете).
Код <Keyboard>
находится в файле с именем qwerty.xml
в папке resources/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>
Два файла макета:
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"
/>
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>
Стили:
<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>
В манифесте, в приложении:
<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>
Я оставил изображение настолько большим, чтобы вы могли ясно видеть, что нет пробела.
![введите описание изображения здесь]()
Эта ссылка здесь также проходит через этот код:
http://code.tutsplus.com/tutorials/create-a-custom-keyboard-on-android--cms-22615
изменить 1
После обсуждения в комментариях я бы предложил проверить ваш фоновый стиль, поскольку есть проблемы/изменения с цветом фона по умолчанию, который может отображаться для окна клавиатуры. Это подробно рассматривается в этом ответе fooobar.com/questions/416782/.... Я не буду повторять детали, так как ссылка вряд ли будет гнить, являясь продолжением сообщения SO.
изменить 2
Ok Добавляем разницу в службе метода ввода:
@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);
}
}
изменить 3
Создайте пустой проект, никаких действий для вашей клавиатуры, чтобы проверить и запустить его как отдельное приложение. Вы используете android:theme="@style/AppTheme.NoActionBar"
В своей активности запуска, и может возникнуть проблема с непрозрачностью фона и вашими окнами/представлениями.
Ответ 2
В вашем случае: 7 (ключи) x 14% = 98% + 1% зазор (firstkeyś horizontalGap
) = 99%.
Поместите '% 1' в horizontalGap
в последний ключ, как и в первом ключе.
<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:horizontalGap="1%p"
android:keyEdgeFlags="right"/>
</Row>
Ответ 3
Вы пытались добавить это к тегу клавиатуры в свой XML файл?
android:layout_height="fill_parent"
android:layout_width="fill_parent"
Ответ 4
добавить строку со 100-процентной шириной и нулевым значением перед первой строкой.
как это. добавьте этот код перед первой строкой
<Row android:horizontalGap="0%p" android:keyHeight="0.01%p">
<Key android:codes="32" android:keyLabel=""
android:keyWidth="100%p"
/>
</Row>
Ответ 5
У меня тоже была эта проблема. Я не нашел хорошего решения.
Интерфейс API клавиатуры Android отстой. Если бы я делал это снова, я бы не использовал его и вместо этого создал свой собственный интерфейс с нуля с помощью InputMethod
напрямую.
В любом случае, моим решением было добавить дополнительный ключ в нижней части макета со 100% шириной и только высотой 1 дп.
Кнопка ничего не делает, и высота настолько мала, что пользователь ее не видит. Но ширина ключа устраняет проблему с пробелом.
Ответ 6
Если раскладка клавиатуры находится в макете, убедитесь, что параметры прокладки установлены на 0dp.