Android: Spinner выпадающий в полноэкранном режиме
Я пытаюсь открыть выпадающий спиннер в полноэкранном режиме (режим погружения), но проблема в том, что при открытии выпадающего меню появляется полупрозрачная панель навигации внизу. Панели навигации скрываются при выборе параметра, но остаются видимыми, пока отображается выпадающий список. Я смог удалить это поведение во фрагменте диалога, так как у меня есть show(FragmentManager manager, String tag)
метод переопределить и добавить это
getDialog().getWindow().getDecorView().setSystemUiVisibility(getActivity()
.getWindow().getDecorView().getSystemUiVisibility());
// Make the dialogs window focusable
again.getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
но никакой метод, подобный этому, не доступен в счетчике. Я пытался поставить этот метод в performClick()
используя реализацию слушателя в родителе, но все равно не повезло.
Любое решение этой проблемы.
1 ответ
Для пользователей Java создать этот статический класс
import android.widget.ListPopupWindow;
import android.widget.PopupWindow;
import android.widget.Spinner;
public static void avoidSpinnerDropdownFocus(Spinner spinner) {
try {
Field listPopupField = Spinner.class.getDeclaredField("mPopup");
listPopupField.setAccessible(true);
Object listPopup = listPopupField.get(spinner);
if (listPopup instanceof ListPopupWindow) {
Field popupField = ListPopupWindow.class.getDeclaredField("mPopup");
popupField.setAccessible(true);
Object popup = popupField.get((ListPopupWindow) listPopup);
if (popup instanceof PopupWindow) {
((PopupWindow) popup).setFocusable(false);
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
Для пользователя Kotlin используйте эту функцию расширения
import android.widget.ListPopupWindow
import android.widget.PopupWindow
import android.widget.Spinner
fun Spinner.avoidDropdownFocus() {
try {
val listPopup = Spinner::class.java
.getDeclaredField("mPopup")
.apply { isAccessible = true }
.get(this)
if (listPopup is ListPopupWindow) {
val popup = ListPopupWindow::class.java
.getDeclaredField("mPopup")
.apply { isAccessible = true }
.get(listPopup)
if (popup is PopupWindow) {
popup.isFocusable = false
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
Вам нужно вызвать этот метод из вашего spinner
в вашем OnCreate
метод или когда ваш Spinner
надувается или в любое время перед его использованием.
spinner.avoidSpinnerDropdownFocus()
Кредиты для пользователя kakajika GitHub kakajika https://gist.github.com/kakajika/a236ba721a5c0ad3c1446e16a7423a63
Попробуйте этот код:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);