ContentView / View My MainActivity можно обновить, просто используя invalidate () в любом месте после вызова:

setContentView(R.layout.activity_main);

Но если бы я вызвал диалог в своем элементе, выберите:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch(item.getItemId()){
    case R.id.menu_tools:
        showDialog();
        return true;
            ...

Это не обновляет ImageView внутри диалогового окна:

public class ToolSettingsDialog extends Dialog {
                ...
private void updatePreview() {
    ImageView image = (ImageView)findViewById(R.id.widthImageView);

    Bitmap bitmap = Bitmap.createBitmap(400, 400, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    bitmap.eraseColor(Color.WHITE);

    Drawing d = null;
    d = box.getDrawing();
    s.draw(paint, canvas);
    image.setImageBitmap(bitmap);
    image.invalidate();     
}

Я искал все вокруг и, похоже, не могу понять, как сделать недействительным в другом потоке, чем в пользовательском интерфейсе.

0
Androidus 26 Мар 2013 в 11:27

1 ответ

Лучший ответ

Dialogs рисуются на UI thread, как и все другие операции пользовательского интерфейса на Android. Так что, вероятно, это не ваша проблема.

Кроме того, вы не можете выполнять операции пользовательского интерфейса вне потока пользовательского интерфейса. Вам нужно будет выполнить invalidate() в потоке пользовательского интерфейса, используя что-то вроде View.postInvalidate() или Activity.runOnUIThread().

1
Tushar 27 Мар 2013 в 00:33
Можно ли было бы подробнее рассказать о том, как runOnUiThread () следует использовать в моем классе диалога?
 – 
Androidus
27 Мар 2013 в 00:29
Я обновил свой ответ. Вы можете попробовать image.postInvalidate().
 – 
Tushar
27 Мар 2013 в 00:33