Android настроить вид при появлении клавиатуры - PullRequest
0 голосов
/ 25 января 2019

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

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

В манифесте я установил свою основную активность на adjustResize при появлении клавиатуры. Когда появляется клавиатура, мой вид изменяется, но моя активность неожиданно не воссоздается. Когда экран поворачивается, действие воссоздается.

В документации говорится, что представление будет воссоздано при изменении доступности клавиатуры. Первый абзац от https://developer.android.com/guide/topics/resources/runtime-changes

Некоторые конфигурации устройств могут изменяться во время выполнения (например, ориентация экрана, доступность клавиатуры и когда пользователь включает многооконный режим). Когда такое изменение происходит, Android перезапускает запущенную активность (вызывается onDestroy (), а затем onCreate ()). Поведение при перезапуске разработано, чтобы помочь вашему приложению адаптироваться к новым конфигурациям, автоматически перезагружая ваше приложение альтернативными ресурсами, соответствующими новой конфигурации устройства.

Мои вопросы

Как лучше всего справиться с моей дизайнерской задачей?

Почему моя активность не воссоздается при появлении клавиатуры?

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

AndroidManifest.xml

<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        Log.d("MainActivity", "onCreate")
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/intro"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:text="Top"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:background="@color/colorAccent" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/intro"
        android:singleLine="true" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:text="Bottom"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@color/colorAccent" />

</android.support.constraint.ConstraintLayout>

Ответы [ 5 ]

0 голосов
/ 26 января 2019

Я искал ответ и наткнулся на это:

https://developer.android.com/training/keyboard-input/visibility#java

Там написано, что Android ДЕЛАЕТ то, что вы хотите.

Я только что попробовалэто, добавьте 1 строку, ONE LINE !, к вашему манифесту, и это работает.

Ой, подождите ... вы хотите, чтобы марка исчезла ... хммм хорошо, с этим бы не пришлось?

DOH!Вы уже знали об этом .....

0 голосов
/ 25 января 2019

Метод OnFocusChangeListener() будет обнаруживать всякий раз, когда View получает или теряет фокус.EditText заставляет клавиатуру появляться всякий раз, когда она получает фокус.Поэтому вам следует прикрепить OnFocusChangeListener() к тем EditText, которые вы хотите:

EditText myET = (EditText)findViewById(R.id.myET);

myET.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override          
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus) {
            //Hide image
        } else {
            //Reveal image
        }
    }
});

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

myImageView.setVisibility(View.VISIBLE); //This will show the Image
myImageView.setVisibility(View.INVISIBLE); //This will make the Image invisible
myImageView.setVisibility(View.GONE); //This will make the Image invisible, and also it will collapse the layout, occupying no space at all.

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

Единственная проблема с этим подходом состоит в том, что если у вас есть несколько EditText, вам придется установить много разтот же кодЧтобы решить эту проблему, перейдите по следующей ссылке: EditText setOnFocusChangeListener для всех EditTexts

0 голосов
/ 25 января 2019

«То, что вы хотите сделать, вы не можете» ... Я не знаю, как это сделать, но я не согласен, что это невозможно сделать.У меня есть приложение PayPal, и когда на клавиатуре появляется кнопка входа в систему, а остальная часть экрана входа изменяется, чтобы кнопка входа не закрывалась клавиатурой.Как они это делают, я не знаю, но, очевидно, приложение каким-то образом знает, что клавиатура появляется и настраивается соответствующим образом.

Я искал ответ и наткнулся на это:

https://developer.android.com/training/keyboard-input/visibility#java

Он говорит, что Android изменяет размер экрана, когда появляется / исчезает программная клавиатура.

Я только что попробовал, добавьте 1 строку, ОДНУ ЛИНИЮ !, к вашему манифесту иработает.

0 голосов
/ 25 января 2019

Я не профессионал, но у меня была такая же проблема.Вот как я справился с этим после нескольких часов просмотра веб-страниц.1. Установите слушатель появления софт-клавиатуры. 2. Установите для imageView значение View.VISIBLE и View.GONE в соответствующих предложениях if.

contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {

    Rect r = new Rect();
    contentView.getWindowVisibleDisplayFrame(r);
    int screenHeight = contentView.getRootView().getHeight();

    // r.bottom is the position above soft keypad or device button.
    // if keypad is shown, the r.bottom is smaller than that before.
    int keypadHeight = screenHeight - r.bottom;

    Log.d(TAG, "keypadHeight = " + keypadHeight);

    if (keypadHeight > screenHeight * 0.15) { // 0.15 ratio is perhaps enough to determine keypad height.
        // keyboard is opened
        //set image to View.GONE
    }
    else {
        // keyboard is closed
       //set image to View.VISIBLE
    }
}
});
0 голосов
/ 25 января 2019

Действие не воссоздается, когда появляется клавиатура, потому что это не так, как работает Android.Это не должно быть.(Хотя, если у вас старомодное устройство с выдвижной физической клавиатурой, оно будет воссоздано, когда вы выдвинете его, потому что оно рассматривается как изменение конфигурации оборудования).Отображение / скрытие клавиатуры выполняется без отдыха.И это хорошо, что многие воссозданные события будут дорогими, учитывая, что многие люди просто вкладывают тонну логики в onCreate.

Как делать то, что вы хотите - вы не можете.Нет API для определения, когда клавиатура открыта.Есть часто используемые хаки, которые пытаются обнаружить это, но все они несовершенны (у них могут быть проблемы с режимом разделения экрана, режимом изображения в изображении, несколькими экранами и слишком маленькими клавиатурами, потому что все они работают на основе догадокпо изменению высоты).

...