Установить фокус на EditText


179

У меня есть поле EditText и установить для него OnFocusChangeListener. Когда он потерял фокус, вызывается метод, который проверяет значение EditText с единицей в базе данных. Если возвращаемое значение метода равно true, отображается тост, и фокус должен снова вернуться к EditText. Фокус должен всегда возвращаться к EditText, и клавиатура должна отображаться, пока возвращаемое значение метода не станет ложным.

РЕДАКТИРОВАТЬ: я думаю, я еще не до конца разъяснил свою реальную проблему: ни один другой элемент на экране не может быть в состоянии редактировать, пока значение EditText не будет отредактировано до значения, что делает метод "checkLiganame (liganame)" "вернуть ложь. Только поле EditText должно быть редактируемым.

вот мой код (который не работает для меня):

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

и метод:

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

Этот код приводит к следующему результату: после того, как EditText потерял фокус, фокус возвращается к EditText, но я больше не могу редактировать текст.

EDIT2: изменил мой код. Сценарий:

Я нажимаю на первый EditText и помещаю в него строку, которая уже есть в базе данных. Тост показывает. Теперь я больше не могу редактировать свою строку. Я нажимаю «Далее» на клавиатуре, и фокус остается на первом EditText. Я пытаюсь отредактировать свою строку, но ничего не происходит. Вместо этого моя новая строка отображается во втором EditText. Я нажимаю стрелку назад на моем устройстве и нажимаю на первый и второй EditText -> клавиатура не отображается.

Вот мой новый код:

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

Если вам помогут следующие ответы, примите один из ответов
Акшатха Шринивас

Ответы:


278

Просто поместите эту строку на свой onCreate()

editText.requestFocus();

Это работает для меня, надеюсь, это помогает


164

Запрашивать фокус недостаточно, чтобы показать клавиатуру.

Чтобы сфокусироваться и показать клавиатуру, вы должны написать что-то вроде этого:

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

РЕДАКТИРОВАТЬ: Добавление дополнительной информации к ответу после добавления метода checkLiganame.

В методе checkLiganame вы проверяете, является ли курсор нулевым. Курсор всегда будет возвращать объект, поэтому проверка на нулевое значение ничего не делает. Однако проблема в линииdb.close();

Когда вы закрываете соединение с базой данных, оно Cursorстановится недействительным и, скорее всего, обнуляется.

Поэтому закройте базу данных после того, как вы получили значение.

Вместо того, чтобы проверять курсор на нулевое значение, вы должны проверить, больше ли число возвращаемых строк, чем 0: if (cursor.getCount ()> 0), а затем установить логическое значение true, если это так.

РЕДАКТИРОВАТЬ 2: Итак, вот некоторый код для того, как заставить это работать. РЕДАКТИРОВАТЬ3: Извините неправильный код, который я добавил ...; S

Прежде всего, вам нужно очистить фокус, если другой EditTextполучает фокус. Это можно сделать с помощью myEditText.clearFocus(). Тогда в вашем onFocusChangeListener вы не должны заботиться о том, EditTextимеет ли сначала фокус или нет, поэтому onFocusChangeListener может выглядеть примерно так:

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

Замените первую проверку if(liganame.length() == 0)своей собственной проверкой, затем она должна работать. Обратите внимание, что все представления EditText должны были устанавливать их onFocusChangeListenerдля одного и того же слушателя, как я делал в примере.


Спасибо, пока. Но это не решает всей моей проблемы. Я отредактировал описание моей проблемы.
erdalprinz

Так что именно делает checkLiganame? Почему вы не можете просто проверить, если (liganame.isEmpty ()) и если это правда, снова запросите Focus?
Дарвинд

1
Спасибо :-) Теперь мой метод работает правильно :-), но моя основная проблема с EditText-Field еще не решена. Я до сих пор не могу отредактировать его после того, как метод нашел строку ...
erdalprinz

Поэтому вы добавили if (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } Внутри слушателя onFocusChanged?
Дарвинд

Да, я сделал. Под Liganame.requestFocus () ;. Я нажимаю «Далее» на клавиатуре, чтобы перейти в следующее поле EditText. Тост показывает, и акцент делается на ОБА EditText-Fields. Но я могу редактировать только второй. Первый, который должен быть единственным в этом случае, больше не редактируется.
erdalprinz

59

Код Дарвинда не показывал клавиатуру.

Это работает для меня:

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

если клавиатура не отображается, попробуйте принудительно:

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

19

Это изменяет фокус EditText при нажатии кнопки:

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

Это работает от меня:

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

Прятаться:

private void hideSoftKeyboard(EditText ettext){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(ettext.getWindowToken(), 0);
}

1
Зачем вам ждать 200 мс? это необходимо или я могу просто показать это немедленно?
Coder123

11

Это то, что работает для меня, устанавливает фокус и показывает клавиатуру также

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
Спасибо. setFocusableтребует API 26. Также setFocusableInTouchModeне было необходимости в моем случае.
CoolMind

8

Если мы создаем EditText динамически, тогда мы должны установить requestFocus (), как указано ниже.

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

Если мы уже объявили компонент в представлении xml, мы должны найти его и сосредоточиться, как показано ниже.

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

Он устанавливает только фокус на соответствующий компонент 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

Для Xamarin.Android я создал это расширение.

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

пожалуйста, попробуйте этот код в манифесте

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

2

Если вы попытаетесь позвонить requestFocus()до того, как разметка будет раздута, он вернет false Этот код запускается после раздувания макета. Вам не нужно 200 мс задержки, как указано выше .

editText.post(Runnable {
   if(editText.requestFocus()) {
       val imm = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
       imm?.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0)
   }
})

1

Я не знаю, если вы уже нашли решение, но для вашей проблемы с редактированием после запроса фокуса снова:

Вы пытались вызвать метод selectAll()или setSelection(0)(если есть emtpy) в вашем edittext1?

Пожалуйста, дайте мне знать, если это поможет, поэтому я отредактирую свой ответ для полного решения.


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

0

Если при использовании команды requestFocus()in onCreate()вводится проблема, когда клавиатура не отображается при нажатии, BindingAdapterиспользуйте функцию SingleLiveEvent и запросите фокус внутри нее .

Вот как это сделать:

BindingAdapter

@BindingAdapter("requestFocus")
fun bindRequestFocus(editText: EditText, event: Event<Boolean>?) {
    event?.getContentIfNotHandled()?.let {
        if (it) editText.requestFocus()
    }
}

0

Мой ответ здесь

Когда я читаю на официальном документе, я думаю, что это лучший ответ, просто передайте View в параметр, такой как ваш EditText, но showSoftKeyboard, похоже, не работает в альбомной ориентации.

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)
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.