2017-01-12 4 views
-1

Мы позвонили requestFocus, чтобы сфокусироваться на EditText автоматически, но иногда он работает, или он не работает. поэтому мы добавили runnable в поток пользовательского интерфейса, чтобы сосредоточиться на нем.Иногда почему requestFocus() не работает?

view.post(new Runnable() { 
     @Override 
     public void run() { 
     view.requestFocus(); 
     InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.showSoftInput(view, InputMethodManager.SHOW_FORCED); 
     } 
    }); 

Наконец-то мы знаем, что это хорошо работает, но мне действительно интересно. Зачем? Есть ли кто-нибудь, кто это знает?

+0

UI поток основной поток в Android, Что yiur путаница? –

+1

Основная тема и поток пользовательского интерфейса - это то же самое, что и они являются одним и тем же объектом. Таким образом, ваше предположение неверно, и могут возникнуть другие проблемы (в частности, сосредоточиться на правах собственности между родительскими и дочерними элементами). Я предлагаю вам взглянуть на вашу иерархию взглядов и убедиться, что это не какой-то другой взгляд, который поглощает фокус. – Dibzmania

+1

@OlegBogdanov ** Основная тема не всегда - пользовательский интерфейс **. Прочтите документы. – Enzokie

ответ

2

Это слишком рано называть requestFocus() во время инфляции, попытаться вызвать что-то вроде:

button.post(new Runnable(){ 
    @Override 
    public void run(){ 
     inflatedView.requestFocus(); 
    } }); 

, который будет планировать этот вызов в основную очередь (так он будет называться в будущем), после того, как основной поток завершит свою работу здесь.

https://stackoverflow.com/a/21181502/7267105

Смежные вопросы