Intereting Posts
Андроид в полноэкранном режиме (ICS), первое нажатие показывает навигационную панель Как предотвратить автоматическую блокировку экрана на андроиде по коду? Android – FileProvider – имя не должно быть пустым Как использовать аннотацию @Contract Получение ошибки при добавлении зависимостей для firebase-ui-auth Android NumberPicker: установите min, max, default из XML Вкладка «Карты» в панели действий Воспроизведение Android MediaPlayer заикается по проводным наушникам, а не по Bluetooth Дешифрование ошибки в java Как протестировать приложение bluetooth на эмуляторах в Android ADB бросает SecurityException при запуске службы после обновления системы до Nexus 7: «Caller uid = 2000 не имеет права связываться с пользователем = -2» Параметры Volley – POST / GET Spinner onItemSelected называется ошибочно (без действий пользователя) Производительность Android HttpClient Как обеспечить пользовательское разрешение на активность в Android?

Как очистить фокус от всех выбираемых элементов в представлении?

Моя проблема проста. Как очистить фокус всех элементов в представлении, которые могут иметь фокус ( например, EditText textIsSelectable="true" TextView , textIsSelectable="true" и текст, выбранный в нем при возникновении события clearFocus ).

Почему я спрашиваю (если я не получаю общий ответ выше):

У меня есть несколько фрагментов , доступ к которым можно получить через Navigation View . Моя главная цельпотерять фокус элементов в фрагменте на Ящике, открытом в режиме навигации. Я знаю, что его можно получить методом onDrawerSlide для NavigationDrawer и установить его в моей MainActivity, чтобы открывать ящик, если мой EditText в одном из фрагментов открыт, я вызываю код hideSoftKeyboard, чтобы он закрывал SoftKeyboard.

Мой код, чтобы получить событие при открытии ящика : (в методе onCreate () MainActivity)

 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { //Hide SoftKeyboard on Navigation Drawer Open @Override public void onDrawerSlide(View drawerView, float slideOffset) { //Hide SoftKeyboard if it is open hideSoftKeyboard(); //And Make any view having focus loose focus //... //ClearFocus for the whole view is done from here (for whichever Fragment is visible right now) super.onDrawerSlide(drawerView, slideOffset); } }; public void hideSoftKeyboard() //Declared outside onCreate { InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } 

Здесь мой код hideSoftKeyboard () является общим и может закрывать SoftKeyboard независимо от того, какой фрагмент отображается в данный момент из самой MainActivity . Аналогичным образом я хочу очистить все мои EditTexts и TextView (поскольку опция Copy / Paste появляется в середине ящика, когда она открыта).

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

(Если это возможно, может быть много последствий этого и может помочь во многих случаях)

Solutions Collecting From Web of "Как очистить фокус от всех выбираемых элементов в представлении?"

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

Так проходил официальный сайт разработчиков Android для любого понимания, когда это мелькнуло для меня. Почему бы не использовать getCurrentFocus для получения моего текущего представления, а затем clearFocus() ! И voilla, это работает. Я настолько сосредоточился на сложной ситуации, что забыл проверить простые детали.

Итак, вот ответ на мой собственный вопрос: (in onCreate for MainActivity)

 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { //Hide SoftKeyboard on Navigation Drawer Open @Override public void onDrawerSlide(View drawerView, float slideOffset) { //Hide SoftKeyboard if it is open hideSoftKeyboard(); getCurrentFocus().clearFocus(); //Make any view having focus - clear focus super.onDrawerSlide(drawerView, slideOffset); } 

Спасибо @keivan Esbati за то, что он указал на лазейку, которую я не заметил из-за моего использования фиктивного представления (используется в макете xml, так что, как только макет загружается, первый EditText не получает фокуса). На форуме разработчиков Android:

ClearFocus (): Когда View очищает фокус, структура пытается сфокусироваться на первом фокусируемом представлении сверху. Следовательно, если этот вид является первым сверху, который может сфокусироваться, тогда будут вызваны все обратные вызовы, связанные с очищающим фокусом, после чего структура будет сфокусирована на этом представлении.

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

Примечание: я приложил для этого щедрость, так как никто не смог ответить, и я сам получил ответ, задаюсь вопросом, что будет с Баунти: D

Обновление: Bounty истек, и ничего не произошло. Полагаю, это имеет смысл, если вы пойдете по теории рекламы. Но все равно.

getCurrentFocus().clearFocus() Но помните, что это просто перемещает фокус из текущего представления в первый элемент вашего представления, а не полностью удаляет фокус из представлений; Поэтому, если первым элементом в вашем макете является EditText он снова получит фокус.

Способ убедиться, что ваше представление не получает фокус снова, заключается в том, чтобы добавить эти атрибуты в корневое представление в вашем xml, позволяя корневому представлению захватить фокус:

 android:focusableInTouchMode="true" android:descendantFocusability="beforeDescendants" 

Поэтому, если вы объявите свой корневой элемент, как показано ниже, он автоматически поймает фокус, прежде чем он достигнет представлений:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:focusableInTouchMode="true" android:descendantFocusability="beforeDescendants"> <!-- Rest of Layout --> <.../> </LinearLayout> 

Если у вас есть несколько действий, и в этих действиях только одно действие имеет вид навигации. В этом случае, если вы хотите очистить фокус на navView, используйте этот код,

 @Override protected void onResume() { super.onResume(); int size = navigationView.getMenu().size(); for (int i = 0; i < size; i++) { navigationView.getMenu().getItem(i).setChecked(false); } }