【问题标题】:Show a progress dialog in android tab layout在 android 选项卡布局中显示进度对话框
【发布时间】:2011-08-02 11:51:23
【问题描述】:

我需要显示一个进度对话框,同时单击一个选项卡,

我的代码

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);

}

当我单击设置选项卡时,会在其 oncreate 中调用设置活动

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

对我来说,在显示设置布局之前需要一些时间来加载布局,所以在此之前我需要显示 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





    }

【问题讨论】:

  • 为什么不在设置选项卡中使用 AsyncTask 类

标签: android android-tabhost progressdialog


【解决方案1】:

每个选项卡都是一个活动...我想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!

如果需要更改 UI,您必须使用

    runOnUiThread(new Runnable() {
    @Override
    public void run() {
        //DO IT
    }
    });

【讨论】:

  • 我已经在设置选项卡上尝试过了,但我需要在显示设置布局之前显示进度对话框。在这里,当我单击设置选项卡时,显示布局有延迟,进度对话框在设置活动上下文中给出,..但我需要在选项卡活动上下文中显示它
  • 您认为需要时间的工作在上一个标签的onDestroy 中吗?还是在设置选项卡的onCreate 中?
  • Runnable myRun = new Runnable(){ public void run(){ //做你想做的一切!没有打电话
  • 我在 run 方法中有一个方法,但它没有调用
  • 抱歉@jennifer 我编辑了答案:$ 我添加了 Thread T = new Thread(myRun); T.start();
【解决方案2】:

你可以使用 android 的 asyntask 功能来显示进度对话框,参考这个http://developer.android.com/reference/android/os/AsyncTask.html

【讨论】:

  • 我将在哪里开始这个异步任务
  • 在创建自己,然后在 asyntask 的 doinbackground() 方法中加载您的布局,然后在 postExecute 上删除您的进度
【解决方案3】:

参考我的回答,

"Rotating wheel" progress dialog while deleting folder from SD card

或者您必须执行异步任务才能执行此操作。

【讨论】:

  • 我需要在显示设置布局之前显示进度对话框。在这里,当我单击设置选项卡时,显示布局有延迟,进度 dailog 在设置活动上下文中给出,..但我需要在选项卡活动上下文中显示它
  • 尝试相应地修改它。尝试在 setContent 之前调用 progressdialog.show 到您的活动。但这必须像我那样做。使用单独的线程。
  • 我尝试这样,当我尝试关闭该处理程序内的对话框时引发异常
  • 08-02 19:06:34.068: ERROR/AndroidRuntime(32315): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 08-02 19 :06:34.068: ERROR/AndroidRuntime(32315): at android.os.Handler.(Handler.java:121)
  • 你在线程内写过 Progressdialog.show() 吗?不要在线程内使用它。完全按照那里显示的方式使用它
【解决方案4】:

如果 getParent() 对您不起作用,请尝试仅使用 TabsActivity.context(或替换您的父选项卡活动类的名称)。我正在使用嵌套活动,因此使用 getParent() 仍然没有为对话框返回正确的上下文。

在尝试了上述建议的 20 种不同变体后,我替换了这一行:

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

与:

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

它就像一个魅力。您还需要在 TabsActivity 类中创建上下文变量。 onCreate 方法中的 public static TabsActivity context;context=this 之类的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多