Как заставить EditText восстановить фокус?

#android #android-activity #setfocus #android-edittext #clickable

#Android #android-активность #setfocus #android-edittext #интерактивно

Вопрос:

У меня есть одно действие с EditText и кнопкой. Когда кнопка нажата, я вызываю

 myEditText.setClickable(false);
myEditText.setFocusable(false);
  

У меня есть другая кнопка, которая при нажатии изменяет активность.

 Intent myIntent = new Intent(view.getContext(), DestinationScreen.class);
startActivityForResult(myIntent, 0);
  

Когда я возвращаюсь из activity2 к своему основному действию, в котором есть EditText, я хочу, чтобы оно восстановило фокус. То есть я хочу иметь возможность вводить в нем некоторые новые значения. Есть идеи, как это возможно?

Я пытался сделать это в своей основной деятельности

 startActivityForResult(myIntent, 0);
myEditText = (EditText) findViewById(R.id.textBox);
myEditText.setClickable(true);
myEditText.setFocusable(true);
myEditText.requestFocus();
  

Похоже, это не работает.

Ответ №1:

Как вы сказали, вы хотели бы, чтобы EditText восстановил фокус, когда вы вернетесь со второго действия.
Тогда, вероятно, это то, что вам следует попробовать: поскольку вы уже вызываете activity2 с помощью startActivityForResult метода (requestCode: 0), вы могли бы воспользоваться этим:

Вы должны переопределить

 onActivityResult(int requestCode, int resultCode, Intent data)
  

метод внутри вашего основного действия, проверьте, является ли requestCode == 0 , и если да:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode)
    {
        case 0:
            EditText myEditText = (EditText) findViewById(R.id.textBox);
            myEditText.setClickable(true);
            myEditText.setFocusable(true);
            myEditText.requestFocus();
        default:
            break;
    }
}
  

Комментарии:

1. @rekaszeru , я все еще не могу отредактировать текст. Все, что я ввел ранее, все еще видно, и я не могу ничего ввести.

2. Убедитесь, что ваш myEditText инициализирован локально, он не должен быть глобальной переменной

3. Я могу сделать это в своем основном действии после возврата из activity2 b = (Кнопка) findViewById(R.id.code); b.setClickable (true); Я все еще не могу использовать EditText myEditText = (EditText) findViewById(R.id.TextBox); myEditText.setClickable (true); myEditText.setFocusable (true); myEditText. requestFocus(); с хорошим эффектом.

4. Любая помощь? Я все еще не могу его получить.

5. Вы получаете какие-либо исключения? Вызывается ли метод onActivityResult вашего основного действия?

Ответ №2:

Я не просматривал исходный код Android, чтобы проверить это, но симптомы для меня подразумевают, что:

  • #onActivityResult() вызывается когда-то раньше #onResume() , и
  • для запроса фокуса, вероятно, требуется отображение представления, что пока неверно (поскольку иерархия представлений действия не привязана к его окну, см. View#isShown() ).

Таким образом, вы можете исправить это, запросив фокус у runnable в главном потоке, который запустится сразу после возобновления действия. В вашем onActivityResult() определении:

 final EditText myEditText = (EditText) findViewById(R.id.textBox);
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        myEditText.requestFocus();
        // Also move the cursor to the end
        myEditText.setSelection(myEditText.length());
    }
});