Android: zmusić EditText do usunięcia fokusu?


Chciałbym móc usunąć fokus z EditText. Na przykład, jeśli pojawi się klawiatura, a użytkownik ukryje ją przyciskiem Wstecz, chciałbym, aby fokus i kursor zniknęły. Jak mogę to zrobić?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz usunąć kursor i fokus za pomocą
edittext.clearFocus();

Ale odkrycie, kiedy tablica na klucze jest ukryta, to ciężka praca.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz dodać to do
onCreate
i ukryje klawiaturę za każdym razem, gdy rozpocznie się aktywność.
Możesz również programowo zmienić fokus na inny element.
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dodaj
LinearLayout
przed
EditText
do swojego XML.
<LinearLayout 
android:focusable="true"
android:focusableInTouchMode="true"
android:clickable="true"
android:layout_width="0px"
android:layout_height="0px"/>

Możesz też zrobić to samo, dodając te wiersze widoku przed „EditText”.
<Button
android:id="@+id/btnSearch"
android:layout_width="50dp"
android:layout_height="50dp"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:text="Quick Search"
android:textColor="#fff"
android:textSize="13sp"
android:textStyle="bold"/><EditText
android:id="@+id/edtSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:gravity="left"
android:hint="Name"
android:maxLines="1"
android:singleLine="true"
android:textColorHint="@color/blue"
android:textSize="13sp"
android:textStyle="bold"/>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Nie skupiaj się, ale pozostań skupiony:
>
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);

EditText straci fokus, ale będzie można go odzyskać przy nowym zdarzeniu dotykowym.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

usunąć autofocus edittext android
http://www.helloandroid.com/tu ... droid
To działa dla mnie

Edytować

w linku sugerują użycie LinearLayout, ale prosty widok zadziała
<View
android:id="@+id/focus_thief"
android:layout_width="1dp"
android:layout_height="1dp"
android:focusable="true"
android:focusableInTouchMode="true"/>

Następnie, jeśli ten „złodziej” zostanie umieszczony na górze układu (jako pierwszy element, na którym ma być skupiony), zadziałają wywołania funkcji
clearFocus ()
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dodaj te dwie właściwości do układu nadrzędnego (np. Układ liniowy, układ względny)
android:focusable="true"
android:focusableInTouchMode="true"

To załatwi sprawę :)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz również dołączyć

android:windowSoftInputMode="stateAlwaysHidden"

do sekcji akcji manifestu.
Jest to równoważne z:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

ale w sensie XML.
FYI, możesz też ukryć klawiaturę za pomocą kodów:
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

spróbuj użyć tego w swoim widoku
to zadziałało dla mnie:
<View
android:id="@+id/fucused"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"/>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dodaj do swojego układu nadrzędnego, w którym umieściłeś swój
EditText
ten
android: focusableInTouchMode = "true"
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

musisz usunąć
& < requestFocus/& >
jeśli go nie używasz i nadal występuje ten sam problem
użytkownik
LinearLayout
jako nadrzędny i ustawiony
android:focusable="true"
android:focusableInTouchMode="true"

Mam nadzieję, że to ci pomoże.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby ukryć klawiaturę po rozpoczęciu działania ... napisz następujący kod w onCreate () ..
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

Aby wyczyścić zaznaczenie i usunąć kursor z edycji .....
editText.clearFocus();editText.setCursorVisible(false);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To moja pierwsza odpowiedź na SO, więc nie bądź dla mnie zbyt ostry, jeśli są błędy. : D
Wokół jest kilka odpowiedzi, ale mam ochotę opublikować moje kompletne rozwiązanie, ponieważ doprowadziło mnie to do szału. Łapałem kawałki i kawałki ze wszystkich stron, więc wybacz mi, jeśli nie dam wszystkim odpowiednich kredytów ... :)
(Zbytnio uproszczę wynik, ponieważ moim zdaniem jest zbyt wiele elementów i nie chcę tym spamować i postaram się, aby był jak najbardziej ogólny ...)
Do swojego układu potrzebujesz swojego rodzica

EditText

i

widok rodzica

zdefiniowane w ten sposób:
<LinearLayout xmlns:android="[url=http://schemas.android.com/apk/res/android"]http://schemas.android.com/apk/res/android"[/url] 
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lytContainer"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true">
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/etEditor"
android:inputType="number"
android:layout_gravity="center"
android:hint="@string/enter_your_text"
android:textColor="@android:color/darker_gray"
android:textSize="12dp"
android:textAlignment="center"
android:gravity="center"
android:clickable="true"/>
</LinearLayout>

Więc musiałem coś tutaj zrobić. Musiałem mieć element zastępczy dla mojego EditText - a mianowicie to -

android:hint="hint"

Również,
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

tak to zrobiłem

EditText

nie skupiał się na wejściu

działać
, a później w

akcja

podczas konfigurowania ten parametr pomaga ustawić

onTouchListener

na nim, aby ukraść skupienie

EditText

.
Teraz w aktywności:
package com.at.keyboardhide;import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); setContentView(R.layout.keyboardmain);
getEditText = (EditText)findViewById(R.id.etEditor);
getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
getLinearLayout.setOnTouchListener(this); getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
Log.d("EDTA", "text was entered.");
getEditText.clearFocus();
imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
return true;
}
return false;
}
});
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(v==getLinearLayout){
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
getEditText.clearFocus();
return true;
}
return false;
}
}

Kilka odpowiedzi na fragmenty, które znalazłem na tej stronie z pytaniami, i część dotycząca rozwiązania aktywności, którą znalazłem w tym

blog
http://amitthaperandroidquery. ... 29... reszta, za którą tęskniłem i którą sam musiałem rozgryźć, została oczyszczona z koncentracji

EditText

które dodałem do obu w środku

setOnEditorActionListener

i onTouchLister dla

widok rodzica

.
Mam nadzieję, że to komuś pomoże i zaoszczędzi czas. :)
Owacja,
Zet.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W komentarzach zapytałeś, czy można skupić się na innym widoku zamiast na EditText. Tak to mozliwe. Użyj metody
.requestFocus ()
dla widoku, na którym chcesz się skupić na początku (w metodzie onCreate ())
Skoncentrowanie się na innym widoku pozwoli ci również wyciąć część kodu. (jak kod do ukrycia klawiatury)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Miałem ten sam problem. To sprawiło, że stałem się bardziej niż szalony.
Miałem rozszerzone okno dialogowe ze ScrollView, które miało TableLayout z rozszerzonym LinearLayout, który zawierał SeekBar i EditText.
Pierwszy tekst edycji zawsze miał autofokus po wyświetleniu okna dialogowego, a po zakończeniu edycji tekstu nad klawiaturą tekst edycji nadal miał fokus, a klawiatura była nadal widoczna.
Wypróbowałem prawie wszystkie rozwiązania w tym wątku i żadne z nich nie zadziałało.
Więc tutaj jest moje

proste rozwiązanie

: (text = EditText)
text.setOnEditorActionListener( new OnEditorActionListener( ){
public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
(actionId == EditorInfo.IME_ACTION_DONE) ){
text.clearFocus( );
InputMethodManager iMgr = null;
iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
}
return true;
}
});

Przy okazji ja

nie

nie użył żadnego z poniższych fragmentów do rozwiązania tego problemu:
//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )

I ja

nie

użył separatora, takiego jak widok o szerokości i wysokości 1 dp.
Mam nadzieję, że to komuś pomoże: D
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz także dołączyć
android: windowSoftInputMode = "stateAlwaysHidden"
w sekcji manifestu akcji.
Jest to równoważne z:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

EditText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0);
EditText.setFocusable(false);
EditText.setFocusableInTouchMode(true);
return true;
} else {
return false;
}
}
});
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

editText.setFocusableInTouchMode(true)

EditText
będzie mógł uzyskać fokus, gdy użytkownik go dotknie.
Gdy główny układ (aktywność, okno dialogowe itp.) Staje się widoczny, element
EditText
nie otrzymuje automatycznie fokusu, nawet jeśli jest to pierwszy widok w układzie.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz uniknąć skupiania się na elementach, ustawiając atrybut

android:descendantFocusability

element nadrzędny.
Oto przykład:
<ScrollView xmlns:android="[url=http://schemas.android.com/apk/res/android"]http://schemas.android.com/apk/res/android"[/url]
xmlns:tools="[url=http://schemas.android.com/tools"]http://schemas.android.com/tools"[/url]
android:id="@+id/search__scroller"
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ScrollView>

W tym przypadku atrybut android: descendantFocusability ustawiony na blokady „blocksDescendants” skupia się na dzieciach.
Więcej informacji można znaleźć

tutaj
https://developer.android.com/ ... %2529
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

check your xml file
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp" > **<requestFocus/>**
</EditText>
//Remove **<requestFocus/>** from xml

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się