Встановіть фокус на EditText


178

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

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

Це працює для мене, сподіваюся, що це допомагає


163

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

Щоб зосередитись і показати клавіатуру, ви б написали щось подібне:

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

EDIT: Додавання додаткової інформації до відповіді після додавання методу checkLiganame.

У методі checkLiganame ви перевіряєте, чи не вказано курсор. Курсор завжди поверне об’єкт, тому перевірка на null нічого не робить. Однак проблема полягає в черзіdb.close();

Коли ви закриваєте підключення до бази даних, значення Cursorстає недійсним і, швидше за все, обнуляється нанівець.

Тож закрийте базу даних після того, як ви отримали значення.

Замість того щоб перевіряти курсор на null, слід перевірити, чи кількість повернутих рядків більше 0: якщо (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на того самого слухача, як у прикладі.


Дякую поки що Але це не вирішує всю мою проблему. Я відредагував опис своєї проблеми.
erdalprinz

Отже, що саме робить checkLiganame? Чому ви не можете просто перевірити, чи є (liganame.isEmpty ()), і якщо це правда, запитайте знову фокус?
Дарвінд

1
Дякую :-) Тепер мій метод працює коректно :-), але моя основна проблема з полем EditText ще не вирішена. Я досі не можу його відредагувати, після того, як метод знайшов рядок ...
erdalprinz

Отже ви додали, якщо (myEditText.requestFocus ()) {getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } Всередині слухача onFocusChanged?
Дарвінд

Так. Під Liganame.requestFocus () ;. Я натискаю "наступний" на клавіатурі, щоб перейти в наступне поле EditText. Тост показує, і в центрі уваги на BOTH 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()до того, як макет буде завищений, він повернеться помилковим. Цей код працює після надуття макета. Вам не потрібно 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)(якщо він порожній) у вашому edittext1?

Будь ласка, дайте мені знати, якщо це допомагає, тому я відредагую свою відповідь на повне рішення.


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

0

При використанні requestFocus()в 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.