Android - использование runOnUiThread для изменения пользовательского интерфейса из потока - PullRequest
24 голосов
/ 23 мая 2009

Я использую пользовательский вид заголовка и хотел бы показать / скрыть индикатор прогресса в виде заголовка, когда поток работает.

Это XML моего представления заголовка

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>
    <Button
        android:id="@+id/image_left_btn"
        android:layout_width="75dip" 
        android:layout_height="wrap_content" 
        android:text="Back"
    />
    <TextView
        android:id="@+id/image_title_text"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_weight="1"
        android:textSize="20dip"
        android:textStyle="bold"
        android:textColor="#fff"
        android:layout_gravity="center"
        android:gravity="center"
        android:paddingLeft="8dip"
        android:paddingRight="8dip"
    />
    <ProgressBar 
        android:id="@+android:id/progress_small_title"
        style="?android:attr/progressBarStyleSmall"
        android:layout_width="75dip"
        android:layout_height="wrap_content" 
        android:paddingRight="8dip"/>
</LinearLayout>

В моей Деятельности, после установки этого в качестве пользовательской строки заголовка, я делаю это

titleProgress = (ProgressBar)findViewById(R.id.progress_small_title);
titleProgress.setVisibility(View.INVISIBLE);

где titleProgress - объект ProgressBar.

Это то, что я делаю в своей теме

runOnUiThread(new Runnable() {
    public void run() {
        titleProgress.setVisibility(View.VISIBLE);
    }
});
//long operation here
runOnUiThread(new Runnable() {
    public void run() {
        titleProgress.setVisibility(View.INVISIBLE);
    }
});

Но нет никаких изменений в индикаторе выполнения. Это никогда не отображается. Может кто-нибудь подскажите, пожалуйста, что не так с кодом?

Можно ли отображать индикатор выполнения заголовка в пользовательском заголовке?

Спасибо.

Ответы [ 5 ]

16 голосов
/ 23 сентября 2009

Несколько вещей, чтобы попробовать:

1) (Возможно, это не так) Убедитесь, что «titleProgress» является изменчивым.

2) Попробуйте добавить туда несколько postInvalidate() или titleProgress.postInvalidate(), чтобы вызвать перерисовку.

3) Вы пожертвовали машиной x486 на алтаре, напоминающем гигантского зеленого робота? (шучу)

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

5 голосов
/ 23 сентября 2009

В этом случае следует использовать AsyncTask, см. http://developer.android.com/reference/android/os/AsyncTask.html

Если вы не ориентируетесь на версию Android до версии 1.5, вам придется использовать другой класс, называемый UserTask. См. http://android -developers.blogspot.com / 2009/05 / painless-threading.html

4 голосов
/ 18 февраля 2011

использовать связь с обработчиками,

  1. выполнить вашу тему
  2. в run(): вы должны отправить сообщение обработчику, который обновит индикатор выполнения (по горизонтали): handler.sendMessage(handler.obtainMessage());
  3. в своей деятельности вы должны переопределить метод handleMessage(Message msg ): вот так

    handler = new Handler(){
      @override
      public void handleMessage(Message msg ) 
      {
        //here you write the code which will update your progressBar 
      }
    };
    
1 голос
/ 29 октября 2010

Ваш макет правильный? Вы пытались заставить это работать с вертикальным расположением сначала? Просто чтобы увидеть, отображается ли индикатор выполнения, когда вы начинаете свою деятельность?

0 голосов
/ 05 июня 2009

Попробуйте изменить стиль индикатора ProgressBar на горизонтальный:

style="?android:attr/progressBarStyleHorizontal"

Оригинал

style="?android:attr/progressBarStyleSmall"

дает круговой «индикатор прогресса», который не полностью виден в заголовке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...