Android KeyboardView не учитывает ширину клавиш - PullRequest
0 голосов
/ 11 марта 2019

У меня другой результат отображения макета KeyboardView между Galaxy Tab S4 под управлением Android 8.1.0 и моим телефоном Galaxy S8 под управлением Android 8.0.0. Разница заключается в ширине ключа и горизонтальном расстоянии.

Вот правильная клавиатура на моем телефоне:

enter image description here

На планшете клавиатура выглядит так:

enter image description here

Мы видим, что клавиши в 1, 2 и 3 ряду имеют разную ширину. Но они должны быть одинакового размера. На планшете кажется, что он изменен, чтобы взять 100% родительского контейнера. В то же время, HorizontalGap выталкивает ключи из родительского контейнера.

Вот код XML, который определяет раскладку клавиатуры:

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

    <Row>
        <Key android:keyLabel="Q" android:keyEdgeFlags="left" />
        <Key android:keyLabel="W" />
        <Key android:keyLabel="E" />
        <Key android:keyLabel="R" />
        <Key android:keyLabel="T" />
        <Key android:keyLabel="Z" />
        <Key android:keyLabel="U" />
        <Key android:keyLabel="I" />
        <Key android:keyLabel="O" />
        <Key android:keyLabel="P" />
        <Key android:codes="55000"  android:keyIcon="@drawable/del_keyboard" android:isRepeatable="true" android:keyWidth="15%p" android:keyEdgeFlags="right" />
    </Row>
    <Row>
        <Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px" android:keyEdgeFlags="left" android:horizontalGap="11.75%p"/>
        <Key android:keyLabel="A"  />
        <Key android:keyLabel="S" />
        <Key android:keyLabel="D" />
        <Key android:keyLabel="F" />
        <Key android:keyLabel="G" />
        <Key android:keyLabel="H" />
        <Key android:keyLabel="J" />
        <Key android:keyLabel="K" />
        <Key android:keyLabel="L" android:keyEdgeFlags="right" />
    </Row>
    <Row>
        <Key android:keyLabel=" " android:keyHeight="0px" android:keyEdgeFlags="left"  android:keyWidth="0px" android:horizontalGap="20%p"/>
        <Key android:keyLabel="Y" />
        <Key android:keyLabel="X" />
        <Key android:keyLabel="C" />
        <Key android:keyLabel="V" />
        <Key android:keyLabel="B" />
        <Key android:keyLabel="N" />
        <Key android:keyLabel="M" android:keyEdgeFlags="right" />
    </Row>
    <Row>
        <Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px" android:horizontalGap="25%p"/>
        <Key android:codes="55001"  android:keyEdgeFlags="left"  android:keyIcon="@drawable/white_space_keyboard" android:keyWidth="50%p" />
    </Row>
</Keyboard>

Для получения дополнительной информации клавиатурное представление находится во фрагменте, включенном в slipPaneLayout. Есть идеи, что здесь происходит? Заранее спасибо!

1 Ответ

0 голосов
/ 13 марта 2019

Я нашел решение. Получить ширину контейнера фрагмента, как только станет доступным. Установите новую ширину для всех ключей. Недействительные клавиши для перерисовки клавиатуры. Для отступа слева в строках 2,3 и 4 я просто добавил количество клавиш с высотой = 0 перед первым ключом каждой строки.

//Here we wait for the fragment width to be available
currentView.post(new Runnable() {
        @Override
        public void run() {
            //Set the new width to the keys of the keyboard
            fixKeyboard(mKeyboard, currentView.getWidth());
            //Force redraw the keyboard
            mKeyboardView.invalidateAllKeys();
        }
    });
//...

private void fixKeyboard(Keyboard k, int dw)
{
    List<Keyboard.Key> keys = k.getKeys();

    int key_width = (dw / 11) - 2; //-2 for margin-right
    int row_number = 0;
    int pos_y = 0;
    int key_index_in_row = 0;
    for (Keyboard.Key key : keys)
    {
        if (key.y != pos_y)
        {
            pos_y = key.y;
            row_number++;
            key_index_in_row = 0;
        }

        //Space key
        if(row_number == 3 && key_index_in_row == 3)
        {
            key.width = 5 * key_width;
        }

        //Delete key
        else if(row_number == 0 && key_index_in_row == 10)
        {
            key.width = key_width + 4; //Slightly larger
        }
        else
        {
            key.width = key_width;
        }

        key.gap = 0;

        key.x = key_width * key_index_in_row;
        key_index_in_row++;
    }
}

С этим XML

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

<Row>
    <Key android:keyLabel="Q" android:keyEdgeFlags="left" />
    <Key android:keyLabel="W" />
    <Key android:keyLabel="E" />
    <Key android:keyLabel="R" />
    <Key android:keyLabel="T" />
    <Key android:keyLabel="Z" />
    <Key android:keyLabel="U" />
    <Key android:keyLabel="I" />
    <Key android:keyLabel="O" />
    <Key android:keyLabel="P" />
    <Key android:codes="55000"  android:keyIcon="@drawable/del_keyboard" android:isRepeatable="true" android:keyWidth="15%p" android:keyEdgeFlags="right" />
</Row>
<Row>
    <Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px" android:keyEdgeFlags="left"/>
    <Key android:keyLabel="A" />
    <Key android:keyLabel="S" />
    <Key android:keyLabel="D" />
    <Key android:keyLabel="F" />
    <Key android:keyLabel="G" />
    <Key android:keyLabel="H" />
    <Key android:keyLabel="J" />
    <Key android:keyLabel="K" />
    <Key android:keyLabel="L" android:keyEdgeFlags="right" />
</Row>
<Row>
    <Key android:keyLabel=" " android:keyHeight="0px" android:keyEdgeFlags="left"  android:keyWidth="0px"/>
    <Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px"/>
    <Key android:keyLabel="Y" />
    <Key android:keyLabel="X" />
    <Key android:keyLabel="C" />
    <Key android:keyLabel="V" />
    <Key android:keyLabel="B" />
    <Key android:keyLabel="N" />
    <Key android:keyLabel="M" android:keyEdgeFlags="right" />
</Row>
<Row>
    <Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px" android:keyEdgeFlags="left"/>
    <Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px"/>
    <Key android:keyLabel=" " android:keyHeight="0px" android:keyWidth="0px"/>
    <Key android:codes="55001"  android:keyEdgeFlags="left"  android:keyIcon="@drawable/white_space_keyboard" android:keyWidth="50%p" />
</Row>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...