Мягкая клавиатура закрывает EditText в PopupWindow - программирование
Подтвердить что ты не робот

Мягкая клавиатура закрывает EditText в PopupWindow

Я собрал простой тестовый проект, который отображает PopupWindow, содержащий EditText (на Android 2.2). Когда я нажимаю EditText, отображается мягкая клавиатура, как и следовало ожидать. Тем не менее, мягкая клавиатура закрывает EditText, и я не могу заставить экран панорамироваться, чтобы держать EditText в представлении так, как я мог бы подумать. Мой код:

TestAdjustPanActivity.java:

package com.example;

import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.PopupWindow;

public class TestAdjustPanActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final PopupWindow pw = new PopupWindow(this);
        pw.setContentView(getLayoutInflater().inflate(R.layout.popup, null, false));
        pw.setWidth(400);
        pw.setHeight(600);
        pw.setFocusable(true);

        pw.setOutsideTouchable(true);
        pw.setTouchable(true);
        pw.setBackgroundDrawable(new BitmapDrawable());

        // This is the line referred to in the edit:
        pw.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

        findViewById(R.id.main).post(new Runnable() {
            public void run() {
            pw.showAtLocation(findViewById(R.id.main), Gravity.NO_GRAVITY, 0, 0);
            }
        });
    }
}

main.xml:

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

    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

popup.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#666666"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/current_password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="40dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="300dp" />
    </LinearLayout>

</ScrollView>

... и мой AndroidManifest.xml содержит строку android:windowSoftInputMode="stateUnspecified|adjustPan" в теге для одной и только активности в приложении.

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

EDIT: я попробовал добавить строку в TestAdjustPanActivity, как указано, что заставило экран полностью панорамироваться на устройстве Android 3.2, которое у меня есть. Тем не менее, он по-прежнему не работает на моем устройстве Android 2.2, что делает его еще более запутанным.

4b9b3361

Ответ 1

Для тех, кто наткнулся на это в будущем, я закончил тем, что использовал только диалоговое окно вместо PopupWindow, и панорамирование, чтобы сохранить EditText в представлении, отлично работает на 2.2 с помощью диалога.

Ответ 2

Существует более простой способ. Просто предоставите альтернативный макет для активной клавиатуры.

  • Щелкните левой кнопкой мыши по выбору проекта: "Инструменты Android/Новый файл ресурсов...".
  • Выберите макет, укажите имя файла "main" (не беспокойтесь о конфликтах).
  • Нажмите "Далее". Затем в списке слева выберите "клавиатура" и переместите его вправо (нажмите "- > " ).
  • С правой стороны выберите состояние клавиатуры.
  • Нажмите "Готово".
  • Теперь скопируйте содержимое вашего main.xml, расположенного в "res/layout", в новый файл в res/layout-keyssoft ".
  • Исправить новый макет таким образом, чтобы клавиатура не была таким образом. Не забудьте сохранить те же "id" s для соответствующих компонентов в этих двух макетах (вот почему нужна копия).
  • Наслаждайтесь тем, как это работает.

Прочитайте о изменениях конфигурации, чтобы понять, как это работает. Обратите внимание, что КАЖДОЕ изменение конфигурации (изменение ориентации, изменение языка и т.д.) Приведет к восстановлению активности (в этом случае аргумент onCreate не является нулевым), поэтому вы можете предоставить различные макеты для разных случаев.

Ответ 3

Я сомневаюсь, что проблема связана с использованием ScrollView в XML,

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

Ответ 4

измените это значение

android:windowSoftInputMode="stateUnspecified|adjustPan"

to

android:windowSoftInputMode="adjustPan"

только в файле манифеста

Ответ 5

Вы должны изменить

android:windowSoftInputMode="stateUnspecified|adjustPan 

to

android:windowSoftInputMode="stateHidden|adjustPan"

Ответ 6

Потребовалось пару часов, чтобы выяснить это, и в итоге я использовал scrollview.

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