Как заставить EditText восстановить фокус? - PullRequest
1 голос
/ 22 апреля 2011

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

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

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

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

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

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

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

Кажется, это не работает.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2017

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

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

Таким образом, вы можете исправить это, запросив фокус у запускаемого потока в главном потоке, который запустится сразу после возобновления действия. В вашем 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());
    }
});
0 голосов
/ 22 апреля 2011

Как вы сказали, вы бы хотели, чтобы EditText восстановил фокус, когда вы вернетесь со второго занятия.
Тогда, вероятно, это то, что вы должны попробовать: поскольку вы уже вызываете активность 2 с помощью метода 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;
    }
}
...