У меня есть ложный диалог, в котором используется этот макет:
Я помещаю фрагмент внутри
в зависимости от открывающегося диалогового окна - Действие, управляющее диалоговым окном, выглядит следующим образом:
К сожалению, когда вы щелкаете текст редактирования внутри диалогового окна, изменение размера не происходит. windowSoftInputMode
буквально не имеет значения, поскольку его функциональность такая же, как и в режиме панорамирования.
В документации говорится: «Это, конечно, работает только для приложений, у которых есть изменяемая область, которая может быть уменьшена, чтобы освободить достаточно места», но не говорит вам, что означает «область изменяемого размера», и заставляет меня думать, что каким-то образом у меня нет области с изменяемым размером?
Если кто знает, что случилось, они могут мне помочь?
РЕДАКТИРОВАТЬ
Окружение диалогового окна таким образом ничего не меняет:
РЕДАКТИРОВАТЬ2
Просмотр прокрутки в качестве родителя тоже не помогает:
Некоторое время назад у меня была такая же проблема в созданной мной библиотеке. ( MaterialDrawer )
Насколько я вижу, все предоставленные ответы не решают основную проблему, они просто указывают на удаление полноэкранного флага (android:windowFullscreen
), который не решение для многих там.
Вышеупомянутая «проблема» появляется только в версиях Android, начиная с API Level 19 (KITKAT), потому что они изменили поведение. Чтобы быть правильным, это не проблема, это работает как задумано. См. Комментарий сотрудника Android ( Android-Issue ).
Итак, я начал копаться в источнике Android и пришел к следующему решению, используя ViewTreeObserver.OnGlobalLayoutListener
и реагируя, если клавиатура отображается / скрыта. Если клавиатура отображается, я добавляю отступ в нижнюю часть представления контейнера, который затем будет эмулировать то же, что и adjustResize
.
Чтобы упростить использование, я обернул все это в простой вспомогательный класс KeyboardUtil.
/**
* Created by mikepenz on 14.03.15.
* This class implements a hack to change the layout padding on bottom if the keyboard is shown
* to allow long lists with editTextViews
* Basic idea for this solution found here: http://stackoverflow.com/a/9108219/325479
*/
public class KeyboardUtil {
private View decorView;
private View contentView;
public KeyboardUtil(Activity act, View contentView) {
this.decorView = act.getWindow().getDecorView();
this.contentView = contentView;
//only required on newer android versions. it was working on API level 19 (Build.VERSION_CODES.KITKAT)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
}
}
public void enable() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
}
}
public void disable() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);
}
}
//a small helper to allow showing the editText focus
ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
decorView.getWindowVisibleDisplayFrame(r);
//get screen height and calculate the difference with the useable area from the r
int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
int diff = height - r.bottom;
//if it could be a keyboard add the padding to the view
if (diff != 0) {
// if the use-able screen height differs from the total screen height we assume that it shows a keyboard now
//check if the padding is 0 (if yes set the padding for the keyboard)
if (contentView.getPaddingBottom() != diff) {
//set the padding of the contentView for the keyboard
contentView.setPadding(0, 0, 0, diff);
}
} else {
//check if the padding is != 0 (if yes reset the padding)
if (contentView.getPaddingBottom() != 0) {
//reset the padding of the contentView
contentView.setPadding(0, 0, 0, 0);
}
}
}
};
/**
* Helper to hide the keyboard
*
* @param act
*/
public static void hideKeyboard(Activity act) {
if (act != null && act.getCurrentFocus() != null) {
InputMethodManager inputMethodManager = (InputMethodManager) act.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(act.getCurrentFocus().getWindowToken(), 0);
}
}
}
Затем вы можете использовать его в своей деятельности или фрагменте, выполнив следующее:
//initialize the KeyboardUtil (you can do this global)
KeyboardUtil keyboardUtil = new KeyboardUtil(activity, getContent().getChildAt(0));
//enable it
keyboardUtil.enable();
//disable it
keyboardUtil.disable();
Весь класс util используется в вышеупомянутой библиотеке MaterialDrawer и можно найти здесь KeyboardUtil . Это всегда будет содержать последнюю версию. (если есть улучшения)
Я не знаю почему, но если у вас есть <item name="android:windowTranslucentNavigation">true</item>
в вашей теме, измените его на false
. И это начнет работать. Действительно странно.
Я должен был установить
<item name="android:windowFullscreen">false</item>
Несмотря на то, что я никогда не устанавливал его в true, и приложение фактически не было полноэкранным.
Убедитесь, что вы установили windowTranslucentStatus
на false
в своих стилях.
Как оригинальный плакат, обнаруженный, когда полноэкранный флаг назначен действию, атрибут android: windowFullscreen не будет работать, и поэтому размер вашего окна не изменится, когда будет видна программная клавиатура, и он не будет прокручиваться.
Простое снятие флажка «Полноэкранный режим» и отсутствие темы «Полноэкранный режим» позволяет прокручивать экран, когда отображается программная клавиатура.