Android Как настроить макет в полноэкранном режиме, когда программная клавиша видна - PullRequest
163 голосов
/ 14 сентября 2011

Я много исследовал, чтобы настроить макет, когда софт-клавиатура активна, и я успешно его реализовал, но проблема возникает, когда я использую android:theme="@android:style/Theme.NoTitleBar.Fullscreen" в теге активности в файле манифеста.

Для этого я использовал android:windowSoftInputMode="adjustPan|adjustResize|stateHidden" с разными вариантами, но не повезло.

После этого я программно внедрил FullScreen и попробовал различные макеты для работы с FullScreen, но все тщетно.

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

http://android -developers.blogspot.com / 2009/04 / ОБНОВЛЕНИЕ-приложения-для-на-screen.html

http://davidwparker.com/2011/08/30/android-how-to-float-a-row-above-keyboard/

Вот код XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/masterContainerView"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#ffffff">

    <ScrollView android:id="@+id/parentScrollView"
        android:layout_width="fill_parent" android:layout_height="wrap_content">

        <LinearLayout android:layout_width="fill_parent"
            android:layout_height="fill_parent" android:orientation="vertical">

            <TextView android:id="@+id/setup_txt" android:layout_width="wrap_content"
                android:layout_height="wrap_content" android:text="Setup - Step 1 of 3"
                android:textColor="@color/top_header_txt_color" android:textSize="20dp"
                android:padding="8dp" android:gravity="center_horizontal" />

            <TextView android:id="@+id/txt_header" android:layout_width="fill_parent"
                android:layout_height="40dp" android:text="AutoReply:"
                android:textColor="@color/top_header_txt_color" android:textSize="14dp"
                android:textStyle="bold" android:padding="10dp"
                android:layout_below="@+id/setup_txt" />

            <EditText android:id="@+id/edit_message"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:text="Some text here." android:textSize="16dp"
                android:textColor="@color/setting_editmsg_color" android:padding="10dp"
                android:minLines="5" android:maxLines="6" android:layout_below="@+id/txt_header"
                android:gravity="top" android:scrollbars="vertical"
                android:maxLength="132" />

            <ImageView android:id="@+id/image_bottom"
                android:layout_width="fill_parent" android:layout_height="wrap_content"
                android:layout_below="@+id/edit_message" />

        </LinearLayout>
    </ScrollView>

    <RelativeLayout android:id="@+id/scoringContainerView"
        android:layout_width="fill_parent" android:layout_height="50px"
        android:orientation="vertical" android:layout_alignParentBottom="true"
        android:background="#535254">

        <Button android:id="@+id/btn_save" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_alignParentRight="true"
            android:layout_marginTop="7dp" android:layout_marginRight="15dp"
            android:layout_below="@+id/edit_message"
            android:text = "Save" />

        <Button android:id="@+id/btn_cancel" android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:layout_marginTop="7dp"
            android:layout_marginRight="10dp" android:layout_below="@+id/edit_message"
            android:layout_toLeftOf="@+id/btn_save" android:text = "Cancel" />

    </RelativeLayout>
</RelativeLayout>

enter image description here

Я хочу, чтобы нижние 2 кнопки были направлены вверх, когда на экранной клавиатуре появляется картинка.

enter image description here

Ответы [ 26 ]

0 голосов
/ 06 декабря 2017

Я испробовал множество решений, в том числе Джозефа Джонсона и Йохана Стейтса. Но в результате я получил пробел между контентом и клавиатурой на некоторых устройствах (например, Lenovo s820) во всех случаях. Поэтому я внес некоторые изменения в их коды и, наконец, получил рабочее решение.

Моя идея основана на добавлении полей в верхнюю часть контента при отображении клавиатуры.

contentContainer.getWindowVisibleDisplayFrame(contentAreaOfWindowBounds);
    int usableHeightNow = contentAreaOfWindowBounds.height();

    if (usableHeightNow != usableHeightPrevious) {

        int difference = usableHeightNow - usableHeightPrevious;

        if (difference < 0 && difference < -150) {
            keyboardShowed = true;
            rootViewLayout.topMargin -= difference + 30;
            rootViewLayout.bottomMargin += 30;
        }
        else if (difference < 0 && difference > -150){
            rootViewLayout.topMargin -= difference + 30;
        }
        else if (difference > 0 && difference > 150) {
            keyboardShowed = false;
            rootViewLayout.topMargin = 0;
            rootViewLayout.bottomMargin = 0;
        }

        rootView.requestLayout();

        Log.e("Bug Workaround", "Difference: " + difference);

        usableHeightPrevious = usableHeightNow;
}

Как видите, я добавляю 30 px к разнице, потому что между верхней частью экрана и областью содержимого с полем есть небольшое белое пространство. И я не знаю, откуда он появляется, поэтому я решил просто уменьшить поля, и теперь он работает именно так, как мне нужно.

0 голосов
/ 20 сентября 2011

Вы хотите, чтобы нижняя полоска прилипала к нижней части вида, но когда отображается клавиатура, они должны двигаться вверх, чтобы располагаться над клавиатурой, верно?

Вы можете попробовать этот фрагмент кода:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    ...>

    <RelativeLayout
        android:id="@+id/RelativeLayoutTopBar"
    ...>
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/LinearLayoutBottomBar"
        android:layout_alignParentBottom = true
        ...>
    </LinearLayout>

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="390dp"
    android:orientation="vertical" 
    android:layout_above="@+id/LinearLayoutBottomBar"
    android:layout_below="@+id/RelativeLayoutTopBar"> 

    <ScrollView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:id="@+id/ScrollViewBackground">

            ...

        </ScrollView>
     </LinearLayout>
  </RelativeLayout>

BottomBar будет придерживаться нижней части представления, а LinearLayout, содержащий ScrollView, займет то, что осталось от представления после отображения верхней / нижней панели и клавиатуры.Дайте мне знать, если это работает и для вас.

0 голосов
/ 27 января 2016

Спасибо, Джозеф, за ваш ответ. Тем не менее, в методе возможно ResizeChildOfContent (), часть

else {
            // keyboard probably just became hidden
            frameLayoutParams.height = usableHeightSansKeyboard;
        }

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

restoreHeight = frameLayoutParams.height;

и затем я заменил ранее упомянутую часть на

else {
            // keyboard probably just became hidden
            frameLayoutParams.height = restoreHeight;
        }

Но я понятия не имею, почему ваш код не работает для меня. Было бы очень полезно, если бы кто-то мог пролить свет на это.

0 голосов
/ 25 марта 2016

Я использовал только полноэкранный режим, чтобы скрыть строку состояния.Тем не менее, я хочу, чтобы приложение изменило размеры при отображении клавиатуры.Все остальные решения (вероятно, из-за возраста должности) были сложными или невозможными для моего использования (хочу избежать изменения кода Java для мешка PhoneGap Build).

Вместо использования полноэкранного режима я изменил конфигурацию для Android на не полноэкранный:

            <preference name="fullscreen" value="false" />

И добавил cordova-plugin-statusbar через командную строку:

cordova plugin add cordova-plugin-statusbar

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

    if (window.cordova && window.cordova.platformId == 'android' && window.StatusBar)
        window.StatusBar.hide();

Это работает как шарм.Единственным недостатком является то, что строка состояния четко видна во время загрузки приложения.Для моих нужд это не было проблемой.

0 голосов
/ 07 июля 2016

В моем случае эта проблема начала возникать после того, как я добавил Crosswalk в свое приложение Cordova.Мое приложение не используется в полноэкранном режиме и Android: windowSoftInputMode = "AdjustPan".

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

// Listen for events to when the keyboard is opened and closed
window.addEventListener("native.keyboardshow", keyboardUp, false);
window.addEventListener('native.keyboardhide', keyboardDown, false);

function keyboardUp()
{
    $('html').addClass('keyboardUp');
}

function keyboardDown()
{
    $('html').removeClass('keyboardUp');
}

Я перепробовал все вышеперечисленные исправления, но простой строкой, которая в итоге сделала это для меня, был бит css:

&.keyboardUp {
        overflow-y: scroll;
}

Надеюсь, это спасет вас от нескольких дней, которые я потратил наэтот.:)

0 голосов
/ 26 июня 2016

Я перепробовал все возможные ответы от stackOverflow, наконец, я решил после недельного долгого поиска.Я использовал расположение координат, и я изменил это с помощью linearLayout, и моя проблема исправлена.Я не знаю, возможно, в компоновке координат есть ошибки или что-то в этом роде.

...