Lubię, gdy moje interfejsy użytkownika są intuicyjne; każdy ekran powinien w naturalny i dyskretny sposób prowadzić użytkownika do następnego kroku w aplikacji. Poza tym staram się, aby rzeczy były jak najbardziej zagmatwane i zagmatwane.
Żartuję :-)
Mam trzy TableRow
s, z których każdy zawiera tylko do odczytu i nie można fokusować kontrolkę EditText, a następnie przycisk po jej prawej stronie. Każdy przycisk uruchamia to samo działanie, ale z innym argumentem. Użytkownik dokonuje w tym miejscu wyboru, a działanie podrzędne kończy, wypełniając odpowiednie EditText
zaznaczeniem użytkownika.
To klasyczny mechanizm kaskadowych wartości; każde zaznaczenie zawęża dostępne opcje dla następnego zaznaczenia, itp. Dlatego wyłączam obie kontrolki w każdym z następnych wierszy, dopóki EditText w bieżącym wierszu nie będzie zawierała wartości.
Muszę zrobić jedną z dwóch rzeczy, w następującej kolejności:
- Po kliknięciu przycisku natychmiast usuń fokus bez ustawiania fokusu na inny przycisk
- Po rozpoczęciu działania ustaw fokus na pierwszy przycisk
Problem objawia się po powrocie poddziałania; kliknięty przycisk zachowuje fokus.
Re: # 1 powyżej - Wygląda na to removeFocus()
, że nie ma metody ani czegoś podobnego
Re: # 2 powyżej - mogę użyć, requestFocus()
aby ustawić fokus na przycisk w następnym wierszu, który działa po powrocie działania podrzędnego, ale z jakiegoś powodu nie działa w działaniu nadrzędnym onCreate()
.
Potrzebuję spójności interfejsu użytkownika w dowolnym kierunku - albo żaden przycisk nie jest aktywny po zakończeniu działania podrzędnego, albo każdy przycisk otrzymuje fokus w zależności od jego miejsca w przepływie logiki, w tym pierwszego (i jedynego) aktywnego przycisku przed jakimkolwiek wyborem.
źródło
Stare pytanie, ale natknąłem się na nie, gdy miałem podobny problem i pomyślałem, że podzielę się tym, co ostatecznie zrobiłem.
Widok, który przykuwał uwagę, był za każdym razem inny, więc użyłem bardzo ogólnego:
View current = getCurrentFocus(); if (current != null) current.clearFocus();
źródło
getCurrentFocus()?.clearFocus();
, takie ładne i eleganckie: - /Możesz użyć
View.clearFocus()
.Użyj
View.requestFocus()
wywoływanego zonResume()
.źródło
android:descendantFocusability="beforeDescendants"
użycie następujących elementów w ćwiczeniu z niektórymi opcjami układu poniżej wydawało się działać zgodnie z oczekiwaniami.
getWindow().getDecorView().findViewById(android.R.id.content).clearFocus();
w połączeniu z następującymi parametrami w widoku głównym.
<?xml android:focusable="true" android:focusableInTouchMode="true" android:descendantFocusability="beforeDescendants" />
https://developer.android.com/reference/android/view/ViewGroup#attr_android:descendantFocusability
Odpowiedz dzięki: https://forums.xamarin.com/discussion/1856/how-to-disable-auto-focus-on-edit-text
Informacje o windowSoftInputMode
źródło
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/ll_root_view" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> LinearLayout llRootView = findViewBindId(R.id.ll_root_view); llRootView.clearFocus();
Używam tego, gdy już skończyłem aktualizować informacje o profilu i usuwam cały fokus z EditText w moim układzie
====> Aktualizacja: W treści układu nadrzędnego moja linia dodawania EditText:
android:focusableInTouchMode="true"
źródło
A co powiesz na dodanie
android:windowSoftInputMode="stateHidden"
swojej aktywności w manifeście?Zaczerpnięte od mądrego człowieka komentującego to: https://stackoverflow.com/a/2059394/956975
źródło
Próbowałem wyłączyć i włączyć możliwość ustawiania ostrości dla widoku i to działało dla mnie (ostrość została zresetowana):
focusedView.setFocusable(false); focusedView.setFocusableInTouchMode(false); focusedView.setFocusable(true); focusedView.setFocusableInTouchMode(true);
źródło
Przede wszystkim sprawdzi się w 100% ........
onResume()
metodę.onResume()
znajdź widok, który ciągle się skupiafindViewById()
.onResume()
zestawurequestFocus()
do tego widoku.onResume()
zestawuclearFocus
do tego widoku.focusable
prawdziwy ifocusableInTuch
prawdziwy.onResume()
znajdź powyższy widok z góry wgfindViewById
onResume()
zestawurequestFocus()
do tego widoku w końcu.źródło
android:focusableInTouchMode="true" android:focusable="true" android:clickable="true"
Dodaj je do swojej ViewGroup, która zawiera EditTextView. Działa poprawnie z moim układem ograniczeń. Mam nadzieję, że to pomoże
źródło
Możesz spróbować wyłączyć zdolność głównego działania do zapisywania jego stanu (w ten sposób zapominając, która kontrolka miała tekst, a na czym była fokus). Będziesz musiał mieć inny sposób zapamiętania tego, co ma twój EditText i ponownego zapełnienia ich wResume (). Uruchom swoje poddziałania za pomocą startActivityForResult () i utwórz procedurę obsługi onActivityResult () w głównym działaniu, które poprawnie zaktualizuje EditText. W ten sposób możesz ustawić odpowiedni przycisk, na którym chcesz skupić się naResume (), w tym samym czasie, gdy ponownie zapełniasz EditText używając myButton.post (new Runnable () {run () {myButton.requestFocus ();}});
Metoda View.post () jest przydatna do początkowego ustawiania fokusu, ponieważ ten element uruchamiający zostanie wykonany po utworzeniu okna i ustabilizowaniu się, umożliwiając mechanizmowi fokusu prawidłowe działanie do tego czasu. Próbowałem ustawić fokus podczas onCreate / Start / Resume (), co zwykle powoduje problemy.
Pamiętaj, że jest to pseudokod i nie został przetestowany, ale jest to możliwy kierunek, w którym możesz spróbować.
źródło
Wypróbuj następujące (dzwonienie
clearAllEditTextFocuses();
)private final boolean clearAllEditTextFocuses() { View v = getCurrentFocus(); if(v instanceof EditText) { final FocusedEditTextItems list = new FocusedEditTextItems(); list.addAndClearFocus((EditText) v); //Focus von allen EditTexten entfernen boolean repeat = true; do { v = getCurrentFocus(); if(v instanceof EditText) { if(list.containsView(v)) repeat = false; else list.addAndClearFocus((EditText) v); } else repeat = false; } while(repeat); final boolean result = !(v instanceof EditText); //Focus wieder setzen list.reset(); return result; } else return false; } private final static class FocusedEditTextItem { private final boolean focusable; private final boolean focusableInTouchMode; @NonNull private final EditText editText; private FocusedEditTextItem(final @NonNull EditText v) { editText = v; focusable = v.isFocusable(); focusableInTouchMode = v.isFocusableInTouchMode(); } private final void clearFocus() { if(focusable) editText.setFocusable(false); if(focusableInTouchMode) editText.setFocusableInTouchMode(false); editText.clearFocus(); } private final void reset() { if(focusable) editText.setFocusable(true); if(focusableInTouchMode) editText.setFocusableInTouchMode(true); } } private final static class FocusedEditTextItems extends ArrayList<FocusedEditTextItem> { private final void addAndClearFocus(final @NonNull EditText v) { final FocusedEditTextItem item = new FocusedEditTextItem(v); add(item); item.clearFocus(); } private final boolean containsView(final @NonNull View v) { boolean result = false; for(FocusedEditTextItem item: this) { if(item.editText == v) { result = true; break; } } return result; } private final void reset() { for(FocusedEditTextItem item: this) item.reset(); } }
źródło