it-swarm.com.ru

Могу ли я одновременно иметь поведение программной клавиатуры "AdjustResize" и панель инструментов за строкой состояния?

В моем приложении для Android жизненно важно использовать поведение adjustResize для программной клавиатуры. Таким образом, пользователи могут прокручивать вниз до других элементов пользовательского интерфейса, таких как кнопка «продолжить».

Я заметил, что adjustResize работает только тогда, когда у меня есть оба параметра Manifest и Android:fitsSystemWindows="true" в корневом элементе макета. (Пожалуйста, поправьте меня, если я ошибаюсь!)

Но с Android:fitsSystemWindows="true" панель инструментов больше не находится за строкой состояния. Что имеет смысл, но не то, что я хочу.

Когда панель инструментов находится позади нее, строка состояния имеет соответствующий более темный оттенок цвета моей панели инструментов. То, что я имею с Android:fitsSystemWindows="true", это бесцветная строка состояния и панель инструментов, которая на 24 дп ниже, чем я хочу. 

Я оставлю соответствующую цветную строку состояния для поведения клавиатуры adjustResize. Но мой вопрос, возможно ли иметь оба? Смею ли я мечтать о красоте и доступности? 

Кто-нибудь более опытный знает волшебную комбинацию настроек? Или, как обходной путь, способ явно раскрасить строку состояния?

к вашему сведению:

Это операции с корневыми элементами RelativeLayout, и в некоторых из них есть ListViews и EditTexts.

Панель инструментов Android.support.v7.widget.Toolbar

Потенциально релевантные элементы стиля:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="Android:windowContentOverlay">@null</item>

PS - Я прочитал десятки похожих вопросов о поведении программной клавиатуры, но не смог найти ничего полезного о непреднамеренных эффектах на Панели инструментов. Также, наоборот, много вопросов о стиле о поведении панели инструментов/строки состояния, но, казалось бы, ничего не значащего. Тем не менее, извините, если я что-то пропустил!

Спасибо заранее!

Правка

Я играл с удалением Android:fitsSystemWindows="true" и добавлением дополнительных ScrollViews или пытался поместить все в тот же ScrollView. Это ничего не делает.

Если я удаляю Android:fitsSystemWindows="true", то нижняя часть пользовательского интерфейса «приклеивается» к нижней части экрана - он не «меняет размер», чтобы вместо этого приклеить верхнюю часть экранной клавиатуры, как я ожидаю, что это будет происходить с adjustResize, установленным в Manifest. 

Установка Android:fitsSystemWindows="true" в корневом представлении приводит к изменению размера пользовательского интерфейса, как я и ожидал, но также не позволяет панели инструментов больше рисовать за строкой состояния. 

Так что я до сих пор именно там, где я начал :(

Добавление примера кода XML макета:

<Android.support.design.widget.CoordinatorLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/root"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
 <!-- CoordinatorLayout because this view uses SnackBars -->

    <!-- Relative Layout to lock "continue" button bar to bottom -->
    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <!-- Main content, that scrolls with or without keyboard -->
        <!-- Correctly sits behind transparent Status Bar -->
        <Android.support.v4.widget.NestedScrollView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:paddingBottom="@dimen/footer_persistent_height">
            <RelativeLayout
                Android:layout_width="match_parent"
                Android:layout_height="match_parent">
                <!-- ACTUAL VIEWS DELETED FOR BREVITY / CLARITY -->
            </RelativeLayout>
        </Android.support.v4.widget.NestedScrollView>


        <!-- Bottom nav bar -->
        <!-- Correctly sits at bottom of UI when keyboard is not visible -->
        <!-- PROBLEM: Not accessible when soft keyboard is visible -->
        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_alignParentBottom="true"
            style="?android:attr/buttonBarStyle">

            <Button
                Android:id="@+id/skip_button"
                Android:theme="@style/ButtonContinueGrey"
                Android:onClick="skipClickHandler"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight=".5"
                style="?android:attr/buttonBarButtonStyle"/>

            <Button
                Android:id="@+id/button_progress"
                Android:theme="@style/ButtonContinueColored"
                Android:onClick="continueClickHandler"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_weight=".5"
                style="?android:attr/buttonBarButtonStyle"/>
        </LinearLayout>

    </RelativeLayout>
</Android.support.design.widget.CoordinatorLayout>
13
Kaitlyn Hanrahan

(Отвечая на мой вопрос)

Это похоже на ошибку в Android: https://code.google.com/p/Android/issues/detail?id=63777

Сообщения в приведенном выше отчете об ошибке содержат ссылки на несколько предлагаемых способов обхода, например, создание пользовательского класса Layout или пользовательской Soft Keyboard. 

Я чувствую, что уже потратил достаточно времени на это. Поэтому мое решение - просто раскрасить строку состояния вручную.

Решение:

  1. Установите Android:fitsSystemWindows="true" в корневом представлении макета или глобально в style.xml. Это (наряду с AdjustResize в манифесте) заставляет пользовательский интерфейс сжиматься над Soft Keyboard, поэтому пользовательский интерфейс не блокируется - самое главное.

  2. Цвет строки состояния. Это возможно только в Lollypop и новее. В любом случае, это то же самое, что прозрачный StatusBar.

    private void updateStatusBarColor(){
        // Check Version
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
            // OPTIONAL: Calculate a darker version of the toolbar color
            int color = calculateDarkerColor(toolBarColor);
    
            // Get the statusBar
            Window window = getWindow();
            // You can't color a transparent statusbar
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            // Set the color
            window.setStatusBarColor(color);
        }
    }
    
    // Calculate a darker version of a given color
    // Note I do this because the color always changes, if it's always the same I would save the darker version as a Resource in colors.xml
    private int calculateDarkerColor(int color){
        float[] hsv = new float[3];
        Color.colorToHSV(color, hsv);
        hsv[2] *= 0.8f; // smaller = darker
        return Color.HSVToColor(hsv);
    }
    
0
Kaitlyn Hanrahan

Я нашел решение, которое, кажется, хорошо работает с ОС. Сначала установите fitSystemWindows = true для представления, которое вы хотите реагировать на окно, а затем скажите, чтобы оно игнорировало верхний отступ:

  ViewCompat.setOnApplyWindowInsetsListener(yourView, (view, insets) ->
      ViewCompat.onApplyWindowInsets(yourView,
          insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), 0,
              insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()))
  );

Подробнее читайте здесь: https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec

6
FRR

Попробуйте сохранить макет в режиме прокрутки и удалите Android: fitsSystemWindows = "true" и используйте только настройку изменения размера 

1
Varun Jain

Я думаю, что вы можете попробовать использовать «AdjustPan» вместо «AdjustResize», когда Android: fitsSystemWindows = «false». Меня устраивает.

1
Hexise

Я не правильно поняла ваш вопрос, но насколько я понимаю, чтобы решить проблему,

Для проблемы заполнения попробуйте добавить 

Android:fitsSystemWindows="true"
Android:clipToPadding=”false”

А для прозрачной строки состояния добавьте

<item name="Android:statusBarColor">@Android:color/transparent</item>

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

0
Manmeet Singh

Это работает для меня.

В файле manifest.xml поместите это в тег <activity>.

Android:windowSoftInputMode="adjustResize"

Поместите это в родительский тег вашего макета.

Android:fitsSystemWindows="true"
Android:clipToPadding="false"

Поместите это в styles.xml.

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="Android:windowTranslucentStatus">true</item>
<item name="Android:windowTranslucentNavigation">true</item>

Я сделал это с minSdkVersion 16 и targetSdkVersion 26

0
suhasini