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();
        }
    }
}

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


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.


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);

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();
            }
        });
    }
}

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);
}

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);

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.


6
    mEditText.setFocusableInTouchMode(true);
    mEditText.requestFocus();

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

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();
        }
    });

3
 private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }

//Function Call
requestFocus(yourEditetxt);


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);
        }
    }
}

2

wypróbuj ten kod w manifeście

<activity android:name=".EditTextActivity" android:windowSoftInputMode="stateAlwaysVisible">
</activity>

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)
   }
})

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.


1
new OnEditorActionListener(){
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      editText.requestFocus();
      //used ******* return true ******
      return **true**;
   }
} 

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()
    }
}

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)
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.