Как изменить цвет фона popup-клавиатуры для софт-клавиатуры Android? - PullRequest
0 голосов
/ 18 октября 2018

Мне потребовалось много времени, чтобы понять, как избавиться от уродливого черного цвета по умолчанию и покрасить свою пользовательскую клавиатуру.

Я работал над этим очень полезным ответом и теперь могу красиво раскрасить клавиатуру: Как изменить цвет фона клавиши для программной клавиатуры Android?

Просто всплывающие клавиатуры по-прежнему имеют цвета по умолчанию.

Я нашел другой полезный ответ, который взял меняпочти до решения.Но ответ сосредоточен на создании и предварительном просмотре всплывающих окон: Создание SoftKeyboard с несколькими / альтернативными символами на клавишу

@ Грэм упомянул

Есливы хотите изменить макет / стиль всплывающего окна (по умолчанию @android: layout / keyboard_popup_keyboard.xml) вы можете указать атрибут android: popupLayout, который указывает на файл макета

Итак, у меня естьсделал мою собственную версию keyboard_popup_keyboard.xml и поместил ее рядом с моим основным файлом макета input.xml в / res / layout и сделал ссылку на нее, как в приведенном примере.

<org.gasana.android.aniikeyboard.LatinKeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyBackground="@drawable/samplekeybackground"
    android:keyTextColor="#000000"
    android:popupLayout="@layout/popup"
/>

К сожалению, не было примера для файла popupLayout.Поэтому я полностью скопировал исходный файл с

C:\Users\martin\AppData\Local\Android\sdk\platforms\android-28\data\res\layout\keyboard_popup_keyboard.xml

и попытался настроить его как popup.xml, чтобы использовать тот же фон, что и на моей основной клавиатуре:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@drawable/samplekeybackground"
    >
<android.inputmethodservice.KeyboardView
    android:id="@android:id/keyboardView"
    android:background="@drawable/samplekeybackground"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:popupLayout="@layout/popup"
    android:keyTextSize="22sp"
    tools:ignore="ResourceCycle" />

<ImageButton android:id="@android:id/closeButton"
    android:background="@drawable/samplekeybackground"
    android:src="@drawable/btn_close" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginStart="8dp"
    android:clickable="true"
    />

Моя клавиатура все еще строит и создает рабочий APK.Просто цвет всплывающих окон по-прежнему ужасный по умолчанию.

Контекст: я лингвист, а не разработчик.Я сделал эту пользовательскую клавиатуру для языка меньшинства со специальным алфавитом и тональными маркерами, и у меня она есть в магазине Play.Оно работает.Но люди колеблются из-за ужасного цветового оформления.Как только я раскрасю всплывающие окна, я опубликую свежую версию.Спасибо.

1 Ответ

0 голосов
/ 29 декабря 2018

Поскольку в течение двух месяцев здесь не было никакого ответа, я потратил время на то, чтобы побольше поразмышлять.Теперь мне повезло сегодня, и я хочу быть добрым к следующему лингвисту, который также нуждается в настраиваемой клавиатуре и должен работать на примерах:

mykeyboard.java указывает на файл макета дляосновная клавиатура так (третья строка «ввод»).Я просто даю цитату из трех строк:

    @Override public View onCreateInputView() {
    mInputView = (LatinKeyboardView) getLayoutInflater().inflate(
            R.layout.input, null);

Итак, внутри моего \ res \ layout \ input.xml я добавил ссылку на свой всплывающий макет:

<org.my.project.here.LatinKeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyBackground="@drawable/samplekeybackground"
    android:keyTextColor="#000000"
    android:popupLayout="@layout/popup"  <!-- here it is -->
/>

А мой \ res \ layout \ popup.xml выглядит так;Я считаю, что скопировал его из предоставленного примера проекта.Сегодня я только что поменял две отмеченные линии на светло-синий цвет фона и черный цвет текста, и это, наконец, сработало.Похоже, я зацикливал ссылки ранее, но сообщений об ошибках не было, только уродливый черный макет по умолчанию.

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/samplekeybackground">
<android.inputmethodservice.KeyboardView
    android:id="@android:id/keyboardView"
    android:background="@color/colorPrimary"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyTextSize="22sp"
    android:keyBackground="@drawable/samplekeybackground"  <!-- here it is -->
    android:keyTextColor="#000000"                         <!-- and here -->
    tools:ignore="ResourceCycle"/>
<ImageButton android:id="@android:id/closeButton"
    android:background="@android:color/transparent"
    android:src="@drawable/btn_close" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginStart="8dp"
    android:clickable="true"/>

Упомянутый samplekeybackground.xml - это очень простое определение, указывающее на два фактических xml-colour-Definitions:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Non focused states -->
<item
    android:state_focused="false"
    android:state_selected="false"
    android:state_pressed="false"
    android:drawable="@drawable/normal" />
<!-- Pressed state -->
<item
    android:state_pressed="true"
    android:drawable="@drawable/pressed" /></selector>

И чтобы быть полным, потому что я ценю вещи, которые я могу просто скопировать и поиграть для тестирования, вот normal.xml ;pressed.xml такой же, только темно-синий:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke android:width="1dp" android:color="#A1B7F7" />
    <solid android:color="#C7D4FA"/>
</shape>

Все это от угадывания и построения многих версий, пока мне не повезло.Возможно, не может ответить ни на какие дополнительные вопросы, но это работает:

enter image description here

...