簡體   English   中英

兩個活動之間的android加載圈(微調器)

[英]android loading circle (spinner) between two activity

我有一個主要活動,其中有簡單的按鈕和與之關聯的偵聽器。 每個按鈕都會打開一個新活動(意圖)。 但是,在打開活動時,加載需要一些時間,這會導致 UI 凍結。 我想通過簡單地在兩者之間添加一個加載圈(微調器)來避免這種情況。 我搜索了很多帖子,但仍然找不到任何東西。

通過加載圈我的意思是這個

圖片

那是一個Progress Bar 您可以通過編程方式或使用 XML 中的小部件來創建它。

在 XML 中實現:

<ProgressBar
    android:id="@+id/progress_loader"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="visible" />

要在 Java 中實現(使用您在評論中詢問的Progress Dialog ,但您也可以使用Progress Bar執行此操作):

 ProgressDialog nDialog;
 nDialog = new ProgressDialog(Login.this);
 nDialog.setMessage("Loading..");
 nDialog.setTitle("Get Data");
 nDialog.setIndeterminate(false);
 nDialog.setCancelable(true);
 nDialog.show();

在進行下一個活動之前,您應該dismiss()進度條。

  nDialog.dismiss();

只需在第二個活動中使用以下代碼

<ProgressBar
    android:id="@+id/progress_loader"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="visible" />

完成初始化后使可見性消失

您無法通過添加加載小部件來避免 UI 凍結。 您必須找到阻塞主線程的代碼並將其移至工作線程。 查看Android 文檔中的“Helper classes for threading”。 如果不顯示您現有的代碼(因此我們知道什么是阻塞的),我們無法進一步建議您。

其次,如果您想在視圖事務之間顯示加載小部件,您可以重組應用程序以使用片段 一個活動可以用來在你的片段之間切換,它也可以包含可以在改變片段之前可見的小部件,一旦完成則不可見。

嘗試這樣做

ProgressDialog progressDoalog;

progressDoalog = new ProgressDialog(DetailsActivity.this);
        progressDoalog.setMax(100);
        progressDoalog.setMessage("Please wait...");
        progressDoalog.setTitle("My Application");
        progressDoalog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDoalog.show();
        final Handler handle = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                progressDoalog.incrementProgressBy(1);
            }
        };
new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            while (progressDoalog.getProgress() <= progressDoalog
                                    .getMax()) {
                                Thread.sleep(30);
                                handle.sendMessage(handle.obtainMessage());
                                if (progressDoalog.getProgress() == progressDoalog
                                        .getMax()) {
                                    progressDoalog.dismiss();
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();

2022 年解決方案。

ProgressDialog p = new ProgressDialog(getActivity());
p.setMessage("Connecting ...");
p.setCancelable(false);
p.show();
  • 你肯定想要 Cancelable false ,否則用戶可以移動它!

  • indeterminate 什么都不做,不要使用

  • 無題

  • 一旦您的服務器回復:

     p.dismiss();

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM