2009-05-23 3 views
24

Я использую пользовательское представление заголовка и хотел бы показать/скрыть индикатор прогресса в представлении заголовка, когда поток работает.Android - с помощью runOnUiThread для изменения пользовательского интерфейса из потока

Это 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); 
    } 
}); 

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

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

Спасибо.

ответ

16

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

1) (Это, вероятно, не так) Убедитесь, что "titleProgress" летуч.

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

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

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

+3

Уже пробовал первые два, но не помог! И в отчаянии я так думаю, что называет 3? ;) – lostInTransit

+0

3) вариант - лучшее решение для всех проблем ... LOL – Rodrigo

0

Попробуйте изменить стиль ProgressBar к Horizonal:

style="?android:attr/progressBarStyleHorizontal" 

Оригинальный

style="?android:attr/progressBarStyleSmall" 

дает круговую "ProgressBar", который не может быть полностью видно в заголовке окна.

+0

Я даже пробовал с progressBarStyleSmallTitle, который должен вписываться в строку заголовка по умолчанию. Даже этого не видно. – lostInTransit

1

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

4

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

  1. выполнить ваш поток
  2. в run(): вы должны послать сообщение обработчику, который будет обновлять ProgressBar (Horizontal конечно): 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 
        } 
    }; 
    
+0

это будет работать только в том случае, если ваш поток завернут в ваш класс активности. – Miky

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