読み込み/進捗インジケーターを表示する最良の方法は?


146

アプリがサーバーからの応答を待っている間に読み込み中のスピナーを表示する最良の方法は何ですか?

これはプログラムで実行できますか?ロードスピナーをxmlファイルに追加する必要がないようにするには?

回答:


293

ProgressDialogはAndroid Oreoから非推奨になりました。代わりにProgressBarを使用してください

ProgressDialog progress = new ProgressDialog(this);
progress.setTitle("Loading");
progress.setMessage("Wait while loading...");
progress.setCancelable(false); // disable dismiss by tapping outside of the dialog
progress.show();
// To dismiss the dialog
progress.dismiss();

または

ProgressDialog.show(this, "Loading", "Wait while loading...");

詳細はこちら。

ちなみに、SpinnerはAndroidでは別の意味を持っています。(これはHTMLの選択ドロップダウンのようなものです)


1
Android開発者Webサイトから:STYLE_SPINNER円形の回転する進行状況バーを備えたProgressDialogを作成します。
テキーラマン2014

34
これは機能しますが、テストしたところ、画面の外側をタッチするか、[ 戻る ]ボタンを押すと、ダイアログを閉じることができました。これを修正するには、への呼び出しを追加しますprogress.setCancelable(false);
Sam

1
下のコメントをありがとう。「スピナー」を1時間働かせようとしていたので、私は夢中になりました。
缶Poyrazoğlu

すばらしい、進行ダイアログを使用できるようになりました
Faisal


17

APIレベル26以降、ProgressDialogは非推奨になりました https://developer.android.com/reference/android/app/ProgressDialog.html

レイアウトにProgressBarを含めます

   <ProgressBar
        android:layout_weight="1"
        android:id="@+id/progressBar_cyclic"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="40dp"
        android:minWidth="40dp" />

そして、その可視性を.GONE |に変更します。ユースケースによっては.VISIBLE。

    progressBar_cyclic.visibility = View.VISIBLE

わかりませんが、progressBarを非表示にした後、常にバックグラウンドで(UIから非表示に)実行されますか?
シャンブー

16

使用する ProgressDialog

ProgressDialog.show(Context context, CharSequence title, CharSequence message);

ここに画像の説明を入力してください

ただし、これは今日(2013)のアンチパターンと見なされます。http//www.youtube.com/watch?v = pEGWcMTxs3I


12
@artworkadシでは、これのどの側面が悪いと考えられますか?受け入れられた回答は同じアンチパターンの例ですか?そして代わりに何をすることが推奨されますか?複数のUXの問題に関するオフサイトビデオにリンクしても、この回答は実際には改善されません。
LarsH


9

実際、サーバーからの応答を待っている場合は、プログラムで行う必要があります。進捗ダイアログを作成して閉じることもできますが、それでも「Androidの方法」ではありません。

現在推奨されている方法は、DialogFragmentを使用することです

public class MySpinnerDialog extends DialogFragment {

    public MySpinnerDialog() {
        // use empty constructors. If something is needed use onCreate's
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {

        _dialog = new ProgressDialog(getActivity());
        this.setStyle(STYLE_NO_TITLE, getTheme()); // You can use styles or inflate a view
        _dialog.setMessage("Spinning.."); // set your messages if not inflated from XML

        _dialog.setCancelable(false);  

        return _dialog;
    }
}

次に、あなたの活動に、あなたのフラグメントマネージャを設定し、表示し始めたサーバーの待機一度ダイアログ:

FragmentManager fm = getSupportFragmentManager();
MySpinnerDialog myInstance = new MySpinnerDialog();
}
myInstance.show(fm, "some_tag");

サーバーが完全に応答したら、それを閉じます。

myInstance.dismiss()

プログレスダイアログは属性に応じてスピナーまたはプログレスバーであることに注意してください。APIガイドで詳細を読んでください


ProgressDialog.show(Context context、CharSequence title、CharSequence message); タイトルパラメータを空の文字列として渡すと、タイトルが削除されます。ProgressDialog.show(context、 ""、 "Loading ..");
Rajendra 2012年

1
良い例ですが、私はまだ戻るボタンを使用することができました。それはあなたの変数dlgAlert(そしてそれはどこから来ているのですか?:))のせいだと思います。とにかく-dialogfragmentを拡張しているので、setCancelable(false)を呼び出すだけで機能します。
ラッセ2014年

サーバーが応答を返す不確定な時間にフラグメントトランザクションをコミットすることは、確実ではないようです。たとえば、応答が返されたときに、フラグメントをホストするアクティビティが誤った状態になっている可能性があります。解決策はありますか?
ジョナス

android.app.DialogFragmentではなくandroid.support.v4.app.DialogFragmentをインポートしているか、getSupportFragmentManagerを使用できないことを確認してください(stackoverflow.com/questions/27514338/…を参照)
StCleezy


6

このようにして、一度に1つの進行状況ダイアログしか開くことができませんでした。Suraj Bajajからの回答に基づく

private ProgressDialog progress;



public void showLoadingDialog() {

    if (progress == null) {
        progress = new ProgressDialog(this);
        progress.setTitle(getString(R.string.loading_title));
        progress.setMessage(getString(R.string.loading_message));
    }
    progress.show();
}

public void dismissLoadingDialog() {

    if (progress != null && progress.isShowing()) {
        progress.dismiss();
    }
}

私も使用しなければなりませんでした

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.