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

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

EDIT: Я думаю, что я еще не сделал свою реальную проблему совершенно ясной: ни один другой элемент на экране не сможет редактировать, пока значение EditText не будет изменено до значения, что делает метод "checkLiganame" (liganame) "возвращает false. Только 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 и помещаю в него String, который уже находится в базе данных. Тост показывает. Теперь я больше не могу редактировать свою строку. Я нажимаю "next" на клавиатуре, и фокус остается на первом 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();
        }
    }
}

Ответ 1

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

editText.requestFocus();

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

Ответ 2

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

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

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

EDIT: добавление дополнительной информации в ответ после добавления метода checkLiganame.

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

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

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

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

EDIT2: Вот здесь код для того, как заставить его работать. EDIT3: Извините, неправильный код, который я добавил...; 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 тому же слушателю, что и в примере.

Ответ 3

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

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

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

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

        imm.showSoftInput(_searchText, InputMethodManager.SHOW_FORCED);

Ответ 4

Это изменяет фокус 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();
            }
        });
    }
}

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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

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

Он устанавливает фокус только на соответствующий компонент EditText.

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

//Function Call
requestFocus(yourEditetxt);

Ответ 11

Вы можете сделать это с помощью одной строки:

yourEditText.RequestFocusFromTouch();

Ответ 12

Для 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);
        }
    }
}

Ответ 13

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

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

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

Ответ 14

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

Ответ 15

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

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

Ответ 16

Вы можете использовать этот код

txt_Mob.setOnFocusChangeListener(new View.OnFocusChangeListener(){

    @Override
    public void onFocusChange(View view, boolean b) {

        if (b){
          //IsFocus

        }else{
          //IsNotFocus

        }

    }
});

Ответ 17

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

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

BindingAdapter

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