Ustaw fokus na EditText

178

Mam pole EditText i ustawiam dla niego OnFocusChangeListener. Po utracie fokusu wywoływana jest metoda, która sprawdza wartość EditText z wartością w bazie danych. Jeśli wartość zwracana metody to true, wyświetlany jest toast, a fokus powinien ponownie wrócić do EditText. Fokus powinien zawsze wracać do EditText, a klawiatura powinna się wyświetlać, dopóki wartość zwracana metody nie będzie false.

EDYCJA: Myślę, że nie wyjaśniłem jeszcze swojego prawdziwego problemu: żaden inny element na ekranie nie powinien być w stanie edytować, dopóki wartość EditText nie zostanie zmieniona na wartość, co powoduje, że metoda „checkLiganame (liganame) "return false. Tylko pole EditText-Field powinno być edytowalne.

oto mój kod (który nie działa dla mnie):

final EditText Liganame = (EditText) findViewById(R.id.liganame);

    Liganame.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {

                String liganame = Liganame.getText().toString();


                if (checkLiganame(liganame)) {
                    Toast toast = Toast.makeText(CreateTableActivity.this,
                            "Dieser Liganame ist bereits vergeben",
                            Toast.LENGTH_SHORT);
                    toast.show();
                    Liganame.requestFocus();
                }
            }

i metoda:

public boolean checkLiganame(String liganame) {
    boolean found = false;

    DatabaseHelper databaseHelper = new DatabaseHelper(this);
    SQLiteDatabase db = databaseHelper.getReadableDatabase();

    Cursor cursor = db.query("liga", new String[] { "liganame" },
            "liganame = '" + liganame + "'", null, null, null, null);
    Log.i("Liganame: ", String.valueOf(cursor));

    db.close();
    if (cursor != null) {
        found = true;
    }

    return found;
}

Ten kod prowadzi do następującego wyniku: Po utracie fokusu EditText fokus wraca do EditText, ale nie mogę już edytować tekstu.

EDIT2: Zmieniono mój kod. Scenariusz:

Klikam na pierwszy EditText i umieszczam w nim String, który jest już w bazie danych. Toast się pokazuje. Teraz nie mogę już edytować mojego ciągu. Klikam „dalej” na klawiaturze, a fokus pozostaje na pierwszym EditText. Próbuję edytować mój ciąg, ale nic się nie dzieje. Zamiast tego mój nowy ciąg jest wyświetlany w drugim EditText. Klikam strzałkę wstecz na moim urządzeniu i ponownie klikam pierwszy i drugi EditText -> żadna klawiatura nie jest wyświetlana.

Oto mój nowy kod:

public class CreateTableActivity extends Activity implements
    OnFocusChangeListener {

private EditText Liganame, Mannschaftsanzahl;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_league);

    Liganame = (EditText) findViewById(R.id.liganame);
    Liganame.setOnFocusChangeListener(this);
    Mannschaftsanzahl = (EditText) findViewById(R.id.mannschaftsanzahl);
    Mannschaftsanzahl.setOnFocusChangeListener(this);

    final Button save_button = (Button) findViewById(R.id.create_tabelle_speichern_button);

    OnClickListener mCorkyListener = new OnClickListener() {
        public void onClick(View v) {
            ButtonClick();
        }
    };
    save_button.setOnClickListener(mCorkyListener);



}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    String liganame = Liganame.getText().toString();

    if (checkLiganame(liganame)) {
        if (Liganame.requestFocus()) {
            getWindow()
                    .setSoftInputMode(
                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            Mannschaftsanzahl.clearFocus();
            Toast.makeText(CreateTableActivity.this,
                    "Dieser Liganame ist bereits vergeben",
                    Toast.LENGTH_SHORT).show();
        }
    }
}
erdalprinz
źródło
Jeśli pomogły Ci poniższe odpowiedzi, zaakceptuj jedną z nich
Akshatha Srinivas

Odpowiedzi:

278

Po prostu umieść tę linię na swoim onCreate()

editText.requestFocus();

To działa dla mnie, mam nadzieję, że pomaga

ralphgabb
źródło
163

Żądanie fokusu nie wystarczy, aby wyświetlić klawiaturę.

Aby się skupić i pokazać klawiaturę, napiszesz coś takiego:

if(myEditText.requestFocus()) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

EDYCJA: Dodanie dodatkowych informacji do odpowiedzi po dodaniu metody checkLiganame.

W metodzie checkLiganame sprawdzasz, czy kursor jest pusty. Kursor zawsze zwraca obiekt, więc sprawdzenie wartości null nic nie robi. Jednak problem jest w porządkudb.close();

Kiedy Cursorzamykasz połączenie z bazą danych, staje się ono nieważne i najprawdopodobniej jest puste.

Więc zamknij bazę danych po pobraniu wartości.

Zamiast sprawdzać, czy kursor nie ma wartości null, powinieneś sprawdzić, czy liczba zwracanych wierszy jest większa niż 0: if (cursor.getCount ()> 0), a następnie ustawić wartość logiczną na true, jeśli tak.

EDIT2: Oto kod pokazujący, jak to działa. EDIT3: Przepraszam, zły kod dodałem ...; S.

Po pierwsze, musisz wyraźnie skupić się, jeśli ktoś EditTextsię skupi. Można to zrobić za pomocą myEditText.clearFocus(). Następnie w swoim onFocusChangeListener nie powinieneś przejmować się tym, czy najpierw EditTextma fokus, czy nie, więc onFocusChangeListener może wyglądać mniej więcej tak:

public class MainActivity extends Activity implements OnFocusChangeListener {
    private EditText editText1, editText2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText1 = (EditText) findViewById(R.id.editText1);
        editText1.setOnFocusChangeListener(this);
        editText2 = (EditText) findViewById(R.id.editText2);
        editText2.setOnFocusChangeListener(this);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        String liganame = editText1.getText().toString();

        if(liganame.length() == 0) {
            if(editText1.requestFocus()) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
                editText2.clearFocus();
                Toast.makeText(MainActivity.this, "Dieser Liganame ist bereits vergeben", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

Zastąp pierwszy czek if(liganame.length() == 0)własnym czekiem, a następnie powinien działać. Zwróć uwagę, że wszystkie widoki EditText powinny mieć ustawiony onFocusChangeListenerten sam odbiornik, co w przykładzie.

Darwind
źródło
Jak dotąd dziękuję. Ale to nie rozwiązuje całego mojego problemu. Zredagowałem opis mojego problemu.
erdalprinz
Więc co dokładnie robi checkLiganame? Dlaczego nie możesz po prostu sprawdzić, czy (liganame.isEmpty ()) i jeśli to prawda, jeszcze raz requestFocus?
Darwind,
1
Dziękuję :-) Teraz moja metoda działa poprawnie :-), ale mój główny problem z polem EditText nie został jeszcze rozwiązany. Nadal nie mogę go edytować, po tym, jak metoda znalazła wiersz ...
erdalprinz
Dodałeś więc if (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } Wewnątrz odbiornika onFocusChanged?
Darwind,
Tak. Pod Liganame.requestFocus () ;. Klikam „dalej” na klawiaturze, aby przejść do następnego pola edycji tekstu. Toast jest widoczny, a nacisk kładziony jest na OBA Pól Edycji Tekstu. Ale mogę edytować tylko drugą. Pierwsza z nich, która powinna być jedyną fokusem w tym przypadku, nie jest już edytowalna.
erdalprinz
59

Kod Darwind nie pokazał klawiatury.

To działa dla mnie:

        _searchText.requestFocus();
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(_searchText, InputMethodManager.SHOW_IMPLICIT);

jeśli klawiatura się nie wyświetla, spróbuj wymusić:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);
Groco
źródło
19

Zmienia to punkt skupienia EditText po kliknięciu przycisku:

public class MainActivity extends Activity {
    private EditText e1,e2;
    private Button b1,b2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        e1=(EditText) findViewById(R.id.editText1);
        e2=(EditText) findViewById(R.id.editText2);
        e1.requestFocus();
        b1=(Button) findViewById(R.id.one);
        b2=(Button) findViewById(R.id.two);
        b1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e1.requestFocus();

            }
        });
        b2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                e2.requestFocus();
            }
        });
    }
}
Simon Chius
źródło
16

To działa ode mnie:

public void showKeyboard(final EditText ettext){
    ettext.requestFocus();
    ettext.postDelayed(new Runnable(){
            @Override public void run(){
                InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                keyboard.showSoftInput(ettext,0);
            }
        }
        ,200);
}

Ukryć:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}
Guru raj
źródło
1
Dlaczego musisz czekać 200 ms? czy to konieczne, czy mogę to natychmiast pokazać?
Coder123
11

To działa u mnie, ustawia ostrość i pokazuje również klawiaturę

EditText userNameText = (EditText) findViewById(R.id.textViewUserNameText);
userNameText.setFocusable(true);
userNameText.setFocusableInTouchMode(true);
userNameText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(userNameText, InputMethodManager.SHOW_IMPLICIT);
Berni Gf
źródło
1
Dzięki. setFocusablewymaga API 26. W setFocusableInTouchModemoim przypadku też nie było potrzebne.
CoolMind
8

Jeśli dynamicznie tworzymy EditText, musimy ustawić requestFocus () jak podano poniżej.

    EditText editText = new EditText(this);
    editText.setWidth(600);
    editText.requestFocus();

Jeśli już zadeklarowaliśmy komponent w widoku xml, musimy go znaleźć i możemy skupić się, jak podano poniżej.

EditText e1=(EditText) findViewById(R.id.editText1);
e1.requestFocus();

Skupia się tylko na odpowiednim składniku EditText.

Sudhakar
źródło
6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

    if(mEditText.requestFocus()) {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
Barakzai
źródło
4
    Button btnClear = (Button) findViewById(R.id.btnClear);

    EditText editText1=(EditText) findViewById(R.id.editText2);
    EditText editText2=(EditText) findViewById(R.id.editText3);

    btnClear.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            editText1.setText("");
            editText2.setText("");

            editText1.requestFocus();
        }
    });
Książę
źródło
3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);

źródło
2

Możesz to zrobić za pomocą jednej linii:

yourEditText.RequestFocusFromTouch();
daniel alexandru Ganea
źródło
Właściwie to jedyna odpowiedź, która mi pomogła. Symuluje dotyk tak, jak chciałem.
Antonio Vlasic
2

Dla Xamarin.Android stworzyłem to rozszerzenie.

public static class ViewExtensions
{
    public static void FocusEditText(this EditText editText, Activity activity)
    {
        if (editText.RequestFocus())
        {
            InputMethodManager imm = (InputMethodManager)activity.GetSystemService(Context.InputMethodService);
            imm.ShowSoftInput(editText, ShowFlags.Implicit);
        }
    }
}
c.lamont.dev
źródło
2

wypróbuj ten kod w manifeście

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>
Felix Cruz
źródło
2

Jeśli spróbujesz wywołać, requestFocus()zanim układ zostanie zawyżony, zwróci wartość false. Ten kod jest uruchamiany po zawyżeniu układu. Nie potrzebujesz 200 ms opóźnienia, jak wspomniano powyżej .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})
Mücahit Şenol
źródło
1

Nie wiem, czy już znalazłeś rozwiązanie, ale w przypadku problemu z edycją po ponownym zażądaniu fokusu:

Czy próbowałeś wywołać metodę selectAll()lub setSelection(0)(jeśli jest puste) na swoim edytorze edittext1?

Daj mi znać, jeśli to pomoże, więc zmodyfikuję moją odpowiedź na kompletne rozwiązanie.

Bezsprzeczny
źródło
1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 
user5176384
źródło
0

W przypadku korzystania requestFocus()z onCreate()wprowadza problem z klawiatury nie pokazuje w sposób ciągły, korzystają BindingAdapterz użyciem SingleLiveEvent i poprosić ostrość wewnątrz tego.

Oto jak to zrobić:

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}
Yogesh Umesh Vaity
źródło
0

Moja odpowiedź tutaj

Jak czytałem w oficjalnym dokumencie, myślę, że to najlepsza odpowiedź, po prostu przekaż View do parametru, takiego jak Twój EditText, ale showSoftKeyboard wydaje się nie działać w krajobrazie

private fun showSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

private fun closeSoftKeyboard(view: View) {
    if (view.requestFocus()) {
        val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}
Thành Thỏ
źródło