Ok, toată lumea știe că, pentru a ascunde o tastatură aveți nevoie pentru a pune în aplicare:
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
Dar mare lucru aici este cum de a ascunde tastatura atunci când utilizatorul atinge sau alege orice alt loc care nu este un EditText` sau softKeyboard?
Am încercat să folosesc onTouchEvent()
pe părintele meu "Activitate", dar care funcționează doar dacă utilizatorul atinge în afara de orice altă perspectivă și nu există nici scrollview.
Am încercat să pună în aplicare o notă, faceți clic pe, se concentreze ascultător fără nici un succes.
Am încercat chiar să pună în aplicare propria mea scrollview pentru a intercepta evenimente tactile, dar nu pot obține numai de coordonatele evenimentului și nu punctul de vedere clic.
Există o modalitate standard de a face acest lucru?? în iPhone a fost foarte ușor.
Următorul fragment pur și simplu ascunde tastatura:
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager =
(InputMethodManager) activity.getSystemService(
Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(
activity.getCurrentFocus().getWindowToken(), 0);
}
Puteți pune acest lucru într-o clasă de utilitate, sau dacă sunt definind-o într-o activitate, pentru a evita activitatea parametru, sau suna hideSoftKeyboard(acest lucru)
.
Cea mai grea parte este atunci când să-l numesc. Puteți scrie o metodă care reiterează prin fiecare "View" în activitatea dumneavoastră, și verificați dacă acesta este un instanceof EditText
dacă nu se înregistra o setOnTouchListener
pentru componenta respectivă și totul va cădea în loc. În cazul în care vă întrebați cum de a face asta, este de fapt destul de simplu. Aici este ceea ce faci, scrii o metoda recursivă, cum ar fi următoarele, în fapt, puteți utiliza acest pentru a face ceva, cum ar fi de configurare fonturi personalizate etc... Aici este metoda
public void setupUI(View view) {
// Set up touch listener for non-text box views to hide keyboard.
if (!(view instanceof EditText)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
hideSoftKeyboard(MyActivity.this);
return false;
}
});
}
//If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupUI(innerView);
}
}
}
Asta e tot, doar apela la aceasta metoda dupa ce setContentView în activitatea dumneavoastră. În cazul în care vă întrebați de ce parametru v-ar trece, este id
containerului părinte. Atribui un " id " la container părinte ca
<RelativeLayoutPanel android:id="@+id/părinte"> ... </RelativeLayout>
și sun setupUI(findViewById(R. id.părinte))
, asta e tot.
Dacă doriți să utilizați acest lucru în mod eficient, s-ar putea crea o extinsă de "Activitate" și a pus această metodă în, și de a face alte activități în aplicare a extinde această activitate și de apel `setupUI () " în " onCreate () metodă.
Sper că vă ajută.
Dacă utilizați mai mult de 1 activitate defini comun de identitate a părintelui layout ca
<RelativeLayout android:id="@+id/main_parent"> ... </RelativeLayout>
Apoi extinde o clasa de "Activitate" și de a defini setupUI(findViewById(R. id.main_parent))
Cadrul OnResume()
și să extindă această clasă în loc de Activitate în program
Puteți realiza acest lucru prin a face următorii pași:
android:clic="adevărat" android:focusableInTouchMode="adevărat" 2. Pună în aplicare o hideKeyboard() metoda
public void hideKeyboard(View) { InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activitate.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(vezi.getWindowToken(), 0); } 3. În cele din urmă, setați onFocusChangeListener de edittext.
edittext.setOnFocusChangeListener(nou punct de Vedere.OnFocusChangeListener() { @Override public void onFocusChange(Vezi v, boolean hasFocus) { dacă (!hasFocus) { hideKeyboard(v); } } });
După cum a subliniat într-unul din comentariile de mai jos, acest lucru ar putea să nu funcționeze în cazul în care părintele vedere este un ScrollView. Pentru un astfel de caz, se poate face clic și focusableInTouchMode pot fi adăugate pe ecranul direct sub ScrollView.
Am găsi răspunsul acceptat un pic complicat.
Aici's my soluție. Adauga un `OnTouchListener la aspectul principal, ie.:
findViewById(R.id.mainLayout).setOnTouchListener(this)
și pune următorul cod în onTouch metodă.
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
În acest fel nu't trebuie să itera peste toate punctele de vedere.
Mai am o soluție pentru a ascunde tastatura de:
InputMethodManager imm = (InputMethodManager) getSystemService(
Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
Aici trece HIDE_IMPLICIT_ONLY la poziția de showFlag
si 0
la poziția de hiddenFlag`.
Acesta va forța aproape tastatura moale.
Doar suprascrie codul de mai jos în Activitate
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (getCurrentFocus() != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
return super.dispatchTouchEvent(ev);
}
Ei bine, am reușit să oarecum rezolva problema, am rescris dispatchTouchEvent pe activitatea mea, acolo eu sunt, folosind următoarele pentru a ascunde tastatura.
/**
* Called to process touch screen events.
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
touchDownTime = SystemClock.elapsedRealtime();
break;
case MotionEvent.ACTION_UP:
//to avoid drag events
if (SystemClock.elapsedRealtime() - touchDownTime <= 150){
EditText[] textFields = this.getFields();
if(textFields != null && textFields.length > 0){
boolean clickIsOutsideEditTexts = true;
for(EditText field : textFields){
if(isPointInsideView(ev.getRawX(), ev.getRawY(), field)){
clickIsOutsideEditTexts = false;
break;
}
}
if(clickIsOutsideEditTexts){
this.hideSoftKeyboard();
}
} else {
this.hideSoftKeyboard();
}
}
break;
}
return super.dispatchTouchEvent(ev);
}
EDIT: La getFields() metodă este o metodă care returnează o matrice cu casetele de text în vedere. Pentru a evita crearea de această matrice pe fiecare atingere, am creat o matrice statice numit sFields, care este returnat la getFields() metodă. Această matrice este inițializat pe onStart() metode cum ar fi:
sFields = new EditText[] {mUserField, mPasswordField};
Acesta nu este perfect, eveniment trageți de timp se bazează doar pe euristici astfel încât, uneori, nu ascunde atunci când se efectuează timp clics, și, de asemenea, am terminat prin a crea o metodă de a obține toate editTexts-per-view; altfel keyboard-ar ascunde și arată atunci când faceți clic alte EditText.
Totuși, mai curat și mai scurte solutii sunt binevenite
Folosi OnFocusChangeListener.
De exemplu:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
hideKeyboard();
}
}
});
**** Update: de asemenea, pot suprascrie onTouchEvent()
în activitatea dumneavoastră și a verifica coordonatele de contact. Dacă coordonatele sunt în afara de EditText, apoi ascunde tastatura.
Am implementat dispatchTouchEvent în Activitate pentru a face acest lucru:
private EditText mEditText;
private Rect mRect = new Rect();
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final int action = MotionEventCompat.getActionMasked(ev);
int[] location = new int[2];
mEditText.getLocationOnScreen(location);
mRect.left = location[0];
mRect.top = location[1];
mRect.right = location[0] + mEditText.getWidth();
mRect.bottom = location[1] + mEditText.getHeight();
int x = (int) ev.getX();
int y = (int) ev.getY();
if (action == MotionEvent.ACTION_DOWN && !mRect.contains(x, y)) {
InputMethodManager input = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
input.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}
return super.dispatchTouchEvent(ev);
}
și l-am testat, functioneaza perfect!
Override public boolean dispatchTouchEvent(MotionEvent eveniment) în orice Activitate (sau de a prelungi clasa de Activitate)
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
View view = getCurrentFocus();
boolean ret = super.dispatchTouchEvent(event);
if (view instanceof EditText) {
View w = getCurrentFocus();
int scrcoords[] = new int[2];
w.getLocationOnScreen(scrcoords);
float x = event.getRawX() + w.getLeft() - scrcoords[0];
float y = event.getRawY() + w.getTop() - scrcoords[1];
if (event.getAction() == MotionEvent.ACTION_UP
&& (x < w.getLeft() || x >= w.getRight()
|| y < w.getTop() || y > w.getBottom()) ) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getCurrentFocus().getWindowToken(), 0);
}
}
return ret;
}
Și că's tot ce trebuie sa faci
O mai Kotlin & Proiectare Material folosind TextInputEditText (această abordare este, de asemenea, compatibile cu EditTextView)...
1.Face părinte vedere(conținut de vedere al activității/fragment) se poate face clic și focalizare continuă prin adăugarea de următoarele atribute
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
2.Creați o extensie pentru toate View (în interiorul unui ViewExtension.kt de fișier, de exemplu) :
fun View.hideKeyboard(){
val inputMethodManager = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(this.windowToken, 0)
}
3.A crea un BaseTextInputEditText care moștenesc de TextInputEditText. Pune în aplicare metoda onFocusChanged pentru a ascunde tastatura atunci când vederea nu este concentrat :
class BaseTextInputEditText(context: Context?, attrs: AttributeSet?) : TextInputEditText(context, attrs){
override fun onFocusChanged(focused: Boolean, direction: Int, previouslyFocusedRect: Rect?) {
super.onFocusChanged(focused, direction, previouslyFocusedRect)
if (!focused) this.hideKeyboard()
}
}
4.Suna-ti brand nou custom view XML :
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayout"
...>
<com.your_package.BaseTextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
... />
</android.support.design.widget.TextInputLayout>
Ca's toate. Nu este nevoie de a modifica controlere (fragment sau o activitate) să se ocupe de acest lucru repetitive caz.
Am modificat soluția de Andre Luis IM am obținut asta:
Am creat un utilitar metoda pentru a ascunde tastatura moale același mod Andre Luiz IM făcut:
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
Dar în loc de a înregistra un OnTouchListener pentru fiecare vizualizare, care oferă o performanță slabă, am înregistrat OnTouchListener pentru doar rădăcina vedere. De la eveniment bule până când se's consumată (EditText este unul dintre punctele de vedere care consumă în mod implicit), dacă se ajunge la rădăcină de vedere,'s, deoarece nu a fost't consumate, așa că am închide tastatura moale.
findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Utils.hideSoftKeyboard(activity);
return false;
}
});
Am'm conștienți de faptul că acest subiect este destul de vechi, răspunsul corect pare valabil și există o mulțime de soluții de lucru acolo, dar cred că abordarea a declarat de mai jos ar putea avea un beneficiu suplimentar în ceea ce privește eficiența și eleganța.
Am nevoie de acest comportament pentru toate activitățile mele, așa că am creat o clasă CustomActivity moștenesc din clasa Activitate și "prins" dispatchTouchEvent funcția. În principal, există două condiții pentru a avea grijă de:
Acesta este rezultatul meu:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_UP) {
final View view = getCurrentFocus();
if(view != null) {
final boolean consumed = super.dispatchTouchEvent(ev);
final View viewTmp = getCurrentFocus();
final View viewNew = viewTmp != null ? viewTmp : view;
if(viewNew.equals(view)) {
final Rect rect = new Rect();
final int[] coordinates = new int[2];
view.getLocationOnScreen(coordinates);
rect.set(coordinates[0], coordinates[1], coordinates[0] + view.getWidth(), coordinates[1] + view.getHeight());
final int x = (int) ev.getX();
final int y = (int) ev.getY();
if(rect.contains(x, y)) {
return consumed;
}
}
else if(viewNew instanceof EditText || viewNew instanceof CustomEditText) {
return consumed;
}
final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(viewNew.getWindowToken(), 0);
viewNew.clearFocus();
return consumed;
}
}
return super.dispatchTouchEvent(ev);
}
Notă: în Plus, am atribui aceste atribute de la rădăcină de vedere făcând posibilă accent clar pe fiecare câmp de intrare și prevenirea câmpuri de intrare câștigă se concentreze pe activitatea de pornire (a face conținutul vedea "focus catcher"):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final View view = findViewById(R.id.content);
view.setFocusable(true);
view.setFocusableInTouchMode(true);
}
Motiv: recunosc că nu am nici o influență, dar vă rog să-mi răspunzi serios.
Problemă: Respingerea tastatură moale atunci când faceți clic pe departe de tastatură și edita textul cu un minim de cod.
Soluție: Externe de bibliotecă, cunoscut sub numele de cutit de unt.
O Linie Soluție:
@OnClick(R.id.activity_signup_layout) public void closeKeyboard() { ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); }
Mai Ușor De Citit Soluție:
@OnClick(R.id.activity_signup_layout)
public void closeKeyboard() {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
Explicație: Lega OnClick Ascultător de activitate's XML Layout părinte ID-ul, așa că orice faceți clic pe layout (nu pe cele de editare text sau tastatura) va rula acest fragment de cod care va ascunde tastatura.
Exemplu: în Cazul în care aspectul de fișier este R. layout.my_layout și aspectul id-ul este R. id.my_layout_id, apoi cutit de unt lega de apel ar trebui să arate astfel:
(@OnClick(R.id.my_layout_id)
public void yourMethod {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
Cutit de unt Link-ul de Documentare: http://jakewharton.github.io/butterknife/
Plug: cutit de unt va revolutiona dezvoltarea android. Ia în considerare.
Notă: același rezultat poate fi obținut fără utilizarea de externe bibliotecă de cutit de unt. Doar seta OnClickListener la mamă aspect așa cum este descris mai sus.
Mi-a placut abordarea de asteptare `dispatchTouchEvent făcute de către htafoya, dar:
Deci, am făcut această oarecum mai ușor de soluție:
@Override
public boolean dispatchTouchEvent(final MotionEvent ev) {
// all touch events close the keyboard before they are processed except EditText instances.
// if focus is an EditText we need to check, if the touchevent was inside the focus editTexts
final View currentFocus = getCurrentFocus();
if (!(currentFocus instanceof EditText) || !isTouchInsideView(ev, currentFocus)) {
((InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
return super.dispatchTouchEvent(ev);
}
/**
* determine if the given motionevent is inside the given view.
*
* @param ev
* the given view
* @param currentFocus
* the motion event.
* @return if the given motionevent is inside the given view
*/
private boolean isTouchInsideView(final MotionEvent ev, final View currentFocus) {
final int[] loc = new int[2];
currentFocus.getLocationOnScreen(loc);
return ev.getRawX() > loc[0] && ev.getRawY() > loc[1] && ev.getRawX() < (loc[0] + currentFocus.getWidth())
&& ev.getRawY() < (loc[1] + currentFocus.getHeight());
}
Există un dezavantaj:
Trecerea de la o EditText
în alt `EditText face tastatura ascunde și reshow - în cazul meu-o's a dorit așa, pentru că asta arată că te-ai schimbat între două componentele de intrare.
Am găsi răspunsul acceptat cam complex pentru această cerință simplă. Aici's ceea ce a lucrat pentru mine, fără nici o eroare.
findViewById(R.id.mainLayout).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
return false;
}
});
Aici's o altă variație pe fje's a răspunde, care abordează problemele ridicate de sosite.
Ideea aici este să se ocupe atât de jos și acțiuni în Activitate's dispatchTouchEvent
metoda. Privind în jos de acțiune, vom face act de prezent axat vedere (dacă este cazul) și dacă atingeți era în ea, de economisire, atât cei de biți pentru mai târziu.
Pe acțiune, trebuie mai întâi de expediere, pentru a permite un alt punct de vedere pentru a lua potențial să se concentreze. Dacă, după aceea, în prezent axat vedere este axat inițial vedere, și în jos atingeți era în vedere, apoi ne-am lăsa deschisă tastatura.
Dacă în prezent concentrat de vedere este diferit de cel inițial vedere concentrat și l's o EditText
, apoi ne-am lăsa, de asemenea, tastatura deschide.
În caz contrar, ne-am apropiat de ea.
Deci, pentru a rezuma, acest lucru funcționează după cum urmează:
EditText
, tastatura rămâne deschisăEditText
în alt EditText
, tastatura rămâne deschis (nu't inchide/redeschide)EditText că nu este alt
EditText`, tastatura se închideEditText
pentru a aduce bara de acțiune contextuală (cu cut/copy/paste butoane), tastatura rămâne deschisă, chiar dacă acțiunea a avut loc în afara concentrat EditText
(care s-a mutat în jos pentru a face loc pentru TAXI). Rețineți, totuși, că, atunci când apăsați pe un buton in CABINA, se va închide tastatura. Care poate sau nu poate fi de dorit; dacă vrei să-cut/copy de la un domeniu și inserați codul în alta, ar fi. Dacă doriți să lipiți spate în același EditText
, nu ar fi.EditText
este în partea de jos a ecranului și faceți clic lung pe un text pentru a o selecta, de EditText
continuă să se concentreze și, prin urmare, tastatura se deschide ca vrei, pentru că facem "touch este în vedere limitele" verificați pe acțiune, nu pe acțiune.privat Vedere focusedViewOnActionDown; private boolean touchWasInsideFocusedView;
@Override public boolean dispatchTouchEvent(MotionEvent ev) { comutator (ev.getAction()) { caz MotionEvent.ACTION_DOWN: focusedViewOnActionDown = getCurrentFocus(); dacă (focusedViewOnActionDown != null) { final Rect rect = new Rect(); final int[] coordonate = new int[2];
focusedViewOnActionDown.getLocationOnScreen(coordonate);
rect.set(coordonate[0], coordonate[1], coordonatele[0] + focusedViewOnActionDown.getWidth(), coordonatele[1] + focusedViewOnActionDown.getHeight());
final int x = (int) ev.getX(); final int y = (int) ev.vă prind();
touchWasInsideFocusedView = rect.conține(x, y); } pauză;
caz MotionEvent.ACTION_UP:
dacă (focusedViewOnActionDown != null) { // expediere pentru a permite noua viziune a (potențial) să se concentreze final boolean consumate = super.dispatchTouchEvent(ev);
final Vedere currentFocus = getCurrentFocus();
// dacă accentul este încă pe original vedere și atingere a fost în interiorul acest punct de vedere, // tastaturii deschide. În caz contrar, dacă accentul este pus acum pe un alt punct de vedere și acest punct de vedere // este un EditText, lăsa, de asemenea, tastatura deschide. dacă (currentFocus.egal(focusedViewOnActionDown)) { dacă (touchWasInsideFocusedView) { reveni consumate; } } altceva dacă (currentFocus instanceof EditText) { reveni consumate; }
// touch a fost în afara inițial vedere concentrat și nu într-o altă EditText, // atât de aproape tastatura InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow( focusedViewOnActionDown.getWindowToken(), 0); focusedViewOnActionDown.recenziile noi vor fi conectate();
reveni consumate; } pauză; }
return super.dispatchTouchEvent(ev); }
e prea simplu, doar să-ți faci recente layout poate face clic o focusable de acest cod:
android:id="@+id/loginParentLayout"
android:clickable="true"
android:focusableInTouchMode="true"
și apoi scrie o metodă și un OnClickListner pentru ca aspect , astfel încât, atunci când cel mai de sus layout este atins în cazul în care se va apela o metodă în care veți scrie codul pentru a respinge tastatură. următoarele este codul pentru ambele; // trebuie să scrie asta în OnCreate()
yourLayout.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
hideKeyboard(view);
}
});
metoda numita de listner:-
public void hideKeyboard(View view) {
InputMethodManager imm =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Metoda pentru a afișa / ascunde tastatura moale
InputMethodManager inputMethodManager = (InputMethodManager) currentActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (isShow) {
if (currentActivity.getCurrentFocus() == null) {
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
} else {
inputMethodManager.showSoftInput(currentActivity.getCurrentFocus(), InputMethodManager.SHOW_FORCED);
}
} else {
if (currentActivity.getCurrentFocus() == null) {
inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
} else {
inputMethodManager.hideSoftInputFromInputMethod(currentActivity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
Sper ca au fost utile
Nu există o abordare mai simplă, bazată pe iPhone aceeași problemă. Pur și simplu să ignore fundal's layout la atingere eveniment, în cazul în care editați textul este conținută. Doar folosi acest cod în activitatea's OnCreate (login_fondo este root-layout):
final LinearLayout llLogin = (LinearLayout)findViewById(R.id.login_fondo);
llLogin.setOnTouchListener(
new OnTouchListener()
{
@Override
public boolean onTouch(View view, MotionEvent ev) {
InputMethodManager imm = (InputMethodManager) mActivity.getSystemService(
android.content.Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mActivity.getCurrentFocus().getWindowToken(), 0);
return false;
}
});
În kotlin, putem face următoarele. Nu este nevoie pentru a repeta toate punctele de vedere. Se va lucra pentru fragmente, de asemenea,.
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
currentFocus?.let {
val imm: InputMethodManager = getSystemService(
Context.INPUT_METHOD_SERVICE
) as (InputMethodManager)
imm.hideSoftInputFromWindow(it.windowToken, 0)
}
return super.dispatchTouchEvent(ev)
}