Mam więc coś, co wydaje się być częstym problemem, a mianowicie tym, że tekst edycji w moim oknie dialogowym nie pojawia się, gdy jest aktywny. Widziałem kilka obejść, takich jak w tym wątku , tym i tym (i wielu innych), ale nigdy nie widziałem satysfakcjonującego wyjaśnienia, dlaczego tak się dzieje.
Wolałbym, aby Android używał własnego domyślnego zachowania dla EditTexts, niż budował własne, ale wydaje się, że wszyscy (w tych wątkach) zaakceptowali, że domyślnym zachowaniem dla EditTexts w oknach dialogowych jest po prostu podanie kursora bez klawiatury. Dlaczego miałoby to być?
Tak na marginesie, żadne z tych obejść nie wydaje się działać dla mnie - najbliższe, jakie udało mi się osiągnąć, to wymuszenie pojawienia się klawiatury pod oknem dialogowym (za pomocą InputMethodManager.toggleSoftKeyboard (*)). Moja konkretna konfiguracja to API15, EditText pojawia się w stopce w ListView w ramach AlertDialog. EditText android: aktywowana = „true” jest ustawiona, a onFocusChangeListener jest odbieranie zdarzeń ostrości.
Edytować:
Zgodnie z prośbą, oto konkretny fragment kodu, z którym pracuję. Nie będę zawracał sobie głowy całym układem, ale w tej konkretnej aplikacji EditText pojawia się w odpowiedzi na naciśnięcie przycisku w oknie dialogowym (podobnie jak w widoku akcji ). Jest zawarty w RelativeLayout, który domyślnie ma widoczność „zniknęła”:
<RelativeLayout
android:id="@+id/relLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp">
<ImageButton
android:id="@+id/cancelBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@color/transparent"
android:src="@drawable/cancelButton"
android:layout_margin="5dp"/>
<ImageButton
android:id="@+id/okBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/cancelBut"
android:background="@color/transparent"
android:src="@drawable/okButton"
android:layout_margin="5dp" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:focusable="true"
android:layout_toLeftOf="@id/okBut"/>
</RelativeLayout>
Kod, który to tworzy, ustawia widoczność RelativeLayout na „Visible” (i ukrywa inne elementy UI). To powinno wystarczyć, aby podnieść klawiaturę, gdy EditText zostanie skupiony, na podstawie moich doświadczeń z EditText. Jednak z jakiegoś powodu tak nie jest. Mogę ustawić następującą wartość onFocusChangeListener:
edit_text.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// For whatever reason we need to request a soft keyboard.
InputMethodManager imm = (InputMethodManager)dlg.getWindow().getContext().getSystemService(_Context.INPUT_METHOD_SERVICE);
if(hasFocus)
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Log.v("DialogProblem", "Focus requested, " + (hasFocus?"has focus.":"doesn't have focus."));
}
}
});
Korzystając z tej konfiguracji, kiedy po raz pierwszy wprowadzam EditText, onFocusChangedListener wyzwala i generuje dziennik, który niezmiennie wygląda następująco:
Focus requested, has focus.
Focus requested, doesn't have focus.
Focus requested, has focus.
Klawiatura pojawia się, a następnie znika, prawdopodobnie dlatego, że przełączam ją dwa razy, ale nawet gdy upewnię się, że pozostaje podniesiona, znajduje się za oknem dialogowym (w szarym obszarze) i nie ma sposobu, aby się do niej dostać bez zamykania okna .
To powiedziawszy, chciałbym podkreślić, że chociaż mogę sprawić, że to obejście zadziała, przede wszystkim jestem zainteresowany znalezieniem prostego powodu, dla którego EditText nie jest wyzwalany w pierwszej kolejności i dlaczego to wydaje się być tak powszechne!