Android: обновление экрана во время компьютерных изменений пользовательского интерфейса - PullRequest
1 голос
/ 04 декабря 2010

Я проверил другие вопросы, заданные здесь, и не смог реализовать решения. Мое приложение использует элементы управления, а не рисует на холсте. В основном это подводит итог моей проблемы: -

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    btn1 = (ToggleButton) findViewById(R.id.btn1);
    btn2 = (ToggleButton) findViewById(R.id.btn2);
    btn3 = (ToggleButton) findViewById(R.id.btn2);
    btn4 = (ToggleButton) findViewById(R.id.btn4);
    btn5 = (ToggleButton) findViewById(R.id.btn5);
    btn6 = (ToggleButton) findViewById(R.id.btn6);
    btn7 = (ToggleButton) findViewById(R.id.btn7);
 //blah blah blah
    btn1.requestFocus();
    wait(100);
    btn2.requestFocus();
    wait(100);
    btn3.requestFocus();
    wait(100);
    btn3.setChecked(true);
    wait(100);
    btn4.requestFocus();
    wait(100);
    btn4.setChecked(true);
    wait(100);
    btn5.requestFocus();
    wait(100);
    btn6.requestFocus();
    wait(100);
    btn6.setChecked(true);
    wait(100);
    btn7.requestFocus();
    wait(100);
 //etc
}

Точка, в которой компьютер анимирует перемещение кнопок и их проверку, чтобы пользователь мог видеть, что он делает. Итак, моя проблема в том, что происходит в моем методе wait (), который останавливается на 100 мс, а также обновляет экран и фокус? Любая помощь действительно приветствуется, ура Джонатан.

Решение применимо, спасибо Андрей:)

int timerCounterInterval = 0;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final ToggleButton btn1 = (ToggleButton) findViewById(R.id.btn1);
    final ToggleButton btn2 = (ToggleButton) findViewById(R.id.btn2);
// more btns
    timerCounterInterval = 0; //reset, for each pass of automation
    setFocus(btn1);
    setFocus(btn2);
    setChecked(btn2);
// tidy up
    timerCounterInterval++;
    new Handler().postDelayed(new Runnable() { 
        public void run() {
            btn2.clearFocus(); //whatever button that had the focus last
            }
    }, 100*(timerCounterInterval));
// etc - note any code from here will execute *before* the above timer
}   

public void setFocus(final ToggleButton btn) {
    timerCounterInterval++;
    new Handler().postDelayed(new Runnable() { 
        public void run() {
            btn.setFocusableInTouchMode(true); //eww, messy i know
            btn.requestFocus();
            btn.setFocusableInTouchMode(false); 
        } 
    }, 100*timerCounterInterval);
}

public void setChecked(final ToggleButton btn) {
    timerCounterInterval++;
    new Handler().postDelayed(new Runnable() { 
        public void run() {
            btn.setChecked(true);
        } 
    }, 100*timerCounterInterval);
}

Надеюсь, это поможет другим людям!

1 Ответ

2 голосов
/ 04 декабря 2010

Я настоятельно рекомендую вам изучить объект Handle и, в частности, метод postDelayed .Таким образом, вы можете сохранить все в потоке пользовательского интерфейса, не вызывая связывания потока в методе animate.Это также удерживает Activity от выдачи этого страшного сообщения «это приложение не отвечает».

На самом деле простого обновления ваших вызовов к установщикам элемента управления в runnable и передачи их в postDelayed должно быть достаточно для обновления.элементы управления GUI.

[Обновить] В качестве примера для ваших комментариев вы можете попробовать что-то вроде этого.Я на самом деле не проверял это, но я думаю, что идея все еще там ...

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final ToggleButton btn1 = (ToggleButton) findViewById(R.id.btn1);
    final ToggleButton btn2 = (ToggleButton) findViewById(R.id.btn2);
    // more btns

    Handler handler = new Handler();

    /* tell the handler run these bits after 1 sec, 2 sec, 3 sec, ect... */
    handler.postDelayed(new Runnable() { void run () { btn1.requestFocus(); } }, 1000);
    handler.postDelayed(new Runnable() { void run () { btn2.requestFocus(); } }, 2000);
    handler.postDelayed(new Runnable() { void run () { btn2.setChecked(true); } }, 3000);
}
...