Почему мой макет недостаточно перемещается с помощью AdjustPan?

У меня были некоторые проблемы с использованием adjustPan в моем приложении, так как оно не работает должным образом. Некоторые другие пользователи также столкнулись с этой проблемой, поэтому я считаю важным поделиться этой проблемой (Макет не перемещается достаточно вверх при нажатии на EditText).

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

Когда я использую adjustPan в своем макете, моя активность не поднимается достаточно высоко до точки, где EditText появляется над программной клавиатурой (подробности см. на изображении). Тот же результат по-прежнему отображается независимо от того, используете ли вы его в файле манифеста или в файле Java.

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

Скриншот проблемы

Я пытался сделать несколько попыток решить эту проблему, например, используя adjustResize и setOnTouchListener, но оба этих ответа, которые я получил, не решили эту проблему.

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

Вот часть моего кода:

Файл манифеста:

<activity
        android:name=".Input_Activity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustPan" />

Java-файл:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.WindowManager;

public class Input_Activity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_input__activity);

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
   }
}

XML-файл:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"

android:layout_height="match_parent"
tools:context=".Input_Activity">

<EditText
    android:layout_width="214dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:inputType="number|numberDecimal"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.585"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.725" />

All feedback would be appreciated.


person Devealte    schedule 06.02.2019    source источник


Ответы (4)


создайте объект типа InputMethodManager methodManager на уровне класса.
добавьте эти строки в свой метод onCreate(),

methodManager = (InputMethodManager) this.getSystemService(this.INPUT_METHOD_SERVICE);
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

и в вашем методе onClick() покажите клавиатуру, например,

methodManager.toggleSoftInputFromWindow(
    your_view_name.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);  

Если это слово getApplicationWindowToken вызывает ошибку, замените его на getWindowToken
, надеюсь, это поможет.

person Viraj S    schedule 09.02.2019
comment
Я немного новичок в Android Studio, что должно происходить: your_view_name - person Devealte; 09.02.2019
comment
Несмотря на то, что это не adjustPan, в целом он все еще работает. Было бы здорово, если бы вы могли исправить это с помощью adjustPan - person Devealte; 09.02.2019

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

 editText.setTransformationMethod(WordBreakUtil.getInstance());
 editText.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
            return false;
        }
    });
person Farid Haq    schedule 06.02.2019
comment
Android Studio (My IDE) заявляет, что: он не может решить символ WordBreakUtil - person Devealte; 06.02.2019

Я не уверен в ответе. но попробуй заменить

<activity
    android:name=".Input_Activity"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="adjustPan" />

с

<activity
    android:name=".Input_Activity"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="adjustResize" />

в вашем манифесте Android. Читать здесь

Надеюсь это поможет!

person Lakshan Dissanayake    schedule 09.02.2019

android:windowSoftInputMode

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

Изображение ниже может еще больше развеять ваши сомнения введите здесь описание изображения

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

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

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

person Zumbarlal Saindane    schedule 15.02.2019