Показать диалог прогресса в макете вкладки Android - PullRequest
1 голос
/ 02 августа 2011

Мне нужно показать диалог прогресса, при нажатии на вкладку,

Мой код ID

public class SIPTabWidget extends TabActivity{
 Intent intent;
  @Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);


    setContentView(R.layout.main);



    final Resources res = getResources(); // Resource object to get Drawables
    final TabHost tabHost = getTabHost(); // The activity TabHost
    TabHost.TabSpec spec; // Reusable TabSpec for each tab



    // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent().setClass(this, ListContacts.class);

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost
    .newTabSpec("contacts")
    .setIndicator("",
        res.getDrawable(R.drawable.tab_contacts))
        .setContent(intent);



    tabHost.addTab(spec);

    intent = new Intent().setClass(this, Dialer.class);
    spec = tabHost
    .newTabSpec("dialer")
    .setIndicator("", res.getDrawable(R.drawable.tab_dial))
    .setContent(intent);
    tabHost.addTab(spec);


    intent = new Intent().setClass(this, Favorites.class);
    spec = tabHost
    .newTabSpec("favorites")
    .setIndicator("", res.getDrawable(R.drawable.tab_favorites))
    .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, org.sipdroid.sipua.ui.Settings.class);
    spec = tabHost
    .newTabSpec("settings")
    .setIndicator("", res.getDrawable(R.drawable.tab_settings))
    .setContent(intent);

    tabHost.addTab(spec);

}

когда я щелкаю по вкладке настроек, вызывается настройка активности, при ее создании я дал

final ProgressDialog dialog = ProgressDialog.show(getParent(), "Please wait..", "Doing stuff..", true);
        dialog.setCancelable(false);
        dialog.show();

enter image description here

для меня, прежде чем показывать макет «Настройки», требуется некоторое время для загрузки макета, поэтому перед этим мне нужно показать ProgressDialog, означает время , когда я нажимаю на вкладку «Настройки» и мне нужно закрыть Диалог, когда вкладка меняется на Настройки

tabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {
        System.out.println(" Tab ID:  "+tabId);
if(tabId.equals("dial")){
dialog .dismiss();
}

    }
});

Settings.class

public class Settings extends PreferenceActivity implements OnSharedPreferenceChangeListener, OnClickListener {

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        System.out.println("Settings oncreate");
        final ProgressDialog dialog = ProgressDialog.show(getParent(), "Please  wait..", "Doing stuff..", true);
        handler = new Handler() {

              @Override
              public void handleMessage(Message msg) {
              dialog.dismiss();

              }
           };


           Thread t = new Thread() {
                public void run() {
                    //send message
                handler.sendEmptyMessage(0);      
                }
            };  





       if (Receiver.mContext == null) Receiver.mContext = this;
        addPreferencesFromResource(R.xml.preferences);
        setDefaultValues();
        Codecs.check();
        t.start





    }

Ответы [ 4 ]

5 голосов
/ 02 августа 2011

Ну, каждая вкладка - это действие ... Я полагаю, что what is taking time находится в действии настроек ...

Поместите это в действие настройки:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ProgressDialog dialog = ProgressDialog.show(getParent(), "Please wait..", "Doing stuff..", true);
dialog.setCancelable(false);
dialog.show(); 
Runnable myRun = new Runnable(){
public void run(){
    Looper.myLooper().prepare();
    //DO EVERYTHING YOU WANT!

    //Finally
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
    dialog.dismis();
    }
    });
}
};
Thread T = new Thread(myRun);
T.start();

Помните : у вас run() в этом блоке

//DO EVERYTHING YOU WANT!

Если вам нужно изменить пользовательский интерфейс, вы должны сделать это с помощью

    runOnUiThread(new Runnable() {
    @Override
    public void run() {
        //DO IT
    }
    });
1 голос
/ 02 августа 2011

См. Мой ответ здесь:

Диалоговое окно с прогрессом «Вращающееся колесо» при удалении папки с SD-карты

или для этого необходимо выполнить асинхронную задачу.

1 голос
/ 02 августа 2011

вы можете использовать функцию asyntask для Android, чтобы показать диалоги прогресса, см. http://developer.android.com/reference/android/os/AsyncTask.html

0 голосов
/ 09 апреля 2012

Если getParent () не работает для вас, попробуйте использовать просто TabsActivity.context (или подставьте имя класса активности вашей родительской вкладки). Я использую вложенные действия, и в результате использование getParent () все еще не возвращает правильный контекст для диалога.

Попробовав 20 различных вариантов предложенных выше, я заменил эту строку:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 

С:

AlertDialog.Builder builder = new AlertDialog.Builder(TabsActivity.context); 

и это сработало как шарм. Вам также необходимо создать контекстную переменную в классе TabsActivity. Что-то вроде public static TabsActivity context; и context=this в методе onCreate.

...