ProgressDialogは非推奨です。代わりに使用するものは何ですか?


213

私はそれProgressDialogが現在廃止されているのを目にしてきました。とは別に、その代わりに使用する代替のものは何ですかProgressBar。Android Studioバージョン2.3.3を使用しています。

ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();

回答:


196

はい、API level 26非推奨です。代わりに、を使用できますprogressBar

プログラムで作成するには:

最初にルートレイアウトへの参照を取得します

RelativeLayout layout = findViewById(R.id.display);  //specify here Root layout Id

または

RelativeLayout layout = findViewById(this);

次に、進行状況バーを追加します

progressBar = new ProgressBar(youractivity.this, null, android.R.attr.progressBarStyleLarge);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100, 100);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(progressBar, params);

プログレスバーを表示するには

progressBar.setVisibility(View.VISIBLE);

プログレスバーを非表示にするには

progressBar.setVisibility(View.GONE);

ユーザー操作を無効にするには、次のコードを追加するだけです

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                           WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

ユーザーとのやり取りを取り戻すには、次のコードを追加するだけです

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

将来の参照のために、をに変更android.R.attr.progressBarStyleSmallandroid.R.attr.progressBarStyleHorizontalます。

以下のコードは上記でのみ機能します API level 21

progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));

xmlで作成するには:

<ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:max="100"
        android:backgroundTint="@color/white"
        android:layout_below="@+id/framelauout"
        android:indeterminateTint="#1a09d6"
        android:layout_marginTop="-7dp"/>

あなたの活動で

progressBar = (ProgressBar) findViewById(R.id.progressbar);

プログレスバーの表示/非表示は同じです

 progressBar.setVisibility(View.VISIBLE); // To show the ProgressBar 
 progressBar.setVisibility(View.INVISIBLE); // To hide the ProgressBar

これがどのように見えるかのサンプル画像です:

詳細:
1.リファレンス1
2.リファレンス2


これを使用しているようで、最終的には進行状況ダイアログが非推奨になっているようです。そのため、私の可能性を世界に示すことができます。
Mohamed Hajr 2018年

1
しかし、それにsetMessage()する方法は?
reverie_ss 2018年

これを見てください。 stackoverflow.com/questions/18410984/...
Gowthaman M

xmlコードを "@android:color / white"に更新してください
musterjunk

水平バーを取得するには、次を使用してください: ProgressBar progressBar = new ProgressBar(youractivity.this、null、android.R.attr.progressBarStyleHorizo​​ntal); progressBar.setIndeterminate(true);
taranjeetsapra

43

以下の参照コードAlertDialogとして使用できます。この関数は、進捗ダイアログを表示するたびに呼び出す必要があります。ProgressDialogProgressDialog

コード:

    public void setProgressDialog() {

    int llPadding = 30;
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.HORIZONTAL);
    ll.setPadding(llPadding, llPadding, llPadding, llPadding);
    ll.setGravity(Gravity.CENTER);
    LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    ll.setLayoutParams(llParam);

    ProgressBar progressBar = new ProgressBar(this);
    progressBar.setIndeterminate(true);
    progressBar.setPadding(0, 0, llPadding, 0);
    progressBar.setLayoutParams(llParam);

    llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    llParam.gravity = Gravity.CENTER;
    TextView tvText = new TextView(this);
    tvText.setText("Loading ...");
    tvText.setTextColor(Color.parseColor("#000000"));
    tvText.setTextSize(20);
    tvText.setLayoutParams(llParam);

    ll.addView(progressBar);
    ll.addView(tvText);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setView(ll);

    AlertDialog dialog = builder.create();
    dialog.show();
    Window window = dialog.getWindow();
    if (window != null) {
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        layoutParams.copyFrom(dialog.getWindow().getAttributes());
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        dialog.getWindow().setAttributes(layoutParams);
    }
}

出力:

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


それを却下する方法は?
ジェイダンガー、

1
BaseActivityのような1つの基本クラスを作成してから、このコードを追加した後、メソッドを閉じるダイアログを1つ追加しますが、そのためには 'AlertDialogダイアログ'オブジェクトをグローバルに定義する必要があります
Kishan Donga

次に、hide dialogメソッド内でdialog.dismiss()メソッドを呼び出すだけです。
Kishan Donga

1
すべてが問題ありませんが、画面ダイアログのどこかをタップすると却下されます。サービスの呼び出しが進行中であり、suerはそれを却下してUIで遊ぶことができますが、これは適切ではありません。
Vivek Kumar

キャンセル不可に設定できますが、デバイスを回転するか、分割画面を使用すると、いずれにしても表示されなくなり、ユーザーは準備ができていないUIを操作できます。おそらくAlertDialogここでは使用すべきではありません。
Meow Cat 2012

30

このクラスはAPIレベル26で廃止されました。ProgressDialogはモーダルダイアログであり、ユーザーがアプリと対話することを防ぎます。このクラスを使用する代わりに、アプリのUIに埋め込むことができるProgressBarのような進行状況インジケーターを使用する必要があります。または、通知を使用して、タスクの進行状況をユーザーに通知することもできます。リンク

新しいUI標準のAndroid Oために廃止されましたGoogle


1
「このクラスはAPIレベル26で廃止されました」が日付の代わりに使用されます。彼らはあなたにもうそれを使わせたくないのです。はい、それは新しいUI標準が原因ですが、それらはすべてのAPIレベルに適用されます...
creativecreatorまたは

28
「Googleの新しいUI標準のため、Android Oで非推奨になりました」-新しいUI標準をリンクしてください
Ajay S

22
そしてそれを非推奨にする理由は、それがユーザー入力をブロックするためです?ときどき、Googleのエンジニアがどのような粉を嗅いでいるのかと思います。入力コントロールを非表示/無効にしてからプログレスバーを有効にするよりも、ブロックダイアログを使用する方がはるかに簡単です。グーグル側の愚かな考え。
TheRealChx101 2018

@ TheRealChx101 Android UIは、高額な回避策を犠牲にしてユーザーに誤った自由を感じさせ、その結果生じる致命的なエラーを防止するように設計されています。アクセス許可と、通信事業者がGoogleに支払った、アクセス可能かアクセス不可能かを示すまで待ち​​ます。
放棄されたカート

3
モーダルダイアログの悪用を防ぐことに関心があると思います。ユーザーが待機する必要がないはずの状況で、ユーザーが操作の終了を待機するように示されている場合もありますが、他のことは続行できます。なので、不必要に待機させると、ユーザーエクスペリエンスが低下します。それにもかかわらず、ユーザーに選択の余地がなく、操作が完了するのを待つ状況はたくさんあります。そのため、各開発者に独自の実装を強制するのではなく、これらのケースには非推奨ではない標準的な方法があるはずであることに同意します。
Fran Marzoa

25

プログレスバーのxmlインターフェースを設計し、それをビューとしてAlertDialogに渡すだけで、いつでもダイアログを表示または閉じることができます。

progress.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:padding="13dp"
    android:layout_centerHorizontal="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ProgressBar
        android:id="@+id/loader"
        android:layout_marginEnd="5dp"
        android:layout_width="45dp"
        android:layout_height="45dp" />
    <TextView
        android:layout_width="wrap_content"
        android:text="Loading..."
        android:textAppearance="?android:textAppearanceSmall"
        android:layout_gravity="center_vertical"
        android:id="@+id/loading_msg"
        android:layout_toEndOf="@+id/loader"
        android:layout_height="wrap_content" />

</LinearLayout>

進捗ダイアログを表示するコードコード。このコードをコピーしてフラグメントに貼り付けるだけです。

  AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
       private void setDialog(boolean show){
            builder.setView(R.layout.progress);
            Dialog dialog = builder.create();
            if (show)dialog.show();
            else dialog.dismiss();
        }

次に、progressdialogを表示したいときはいつでもメソッドを呼び出し、それを表示する場合は引数としてtrueを、ダイアログボックスを閉じる場合はfalseを渡します。


2
@Alok Rajasukumaranアクティビティを使用しているようです。単にに置き換えてthis、次のようにしAlertDialog.Builder builder = new AlertDialog.Builder(this);ます。正​​しいコードをコピーしていることを確認してください。
DevMike01 2017年

1
layout_toEndOf次の理由で削除できませんLinearLayout
マーク

21

ProgressBarは非常にシンプルで使いやすいので、これを単純な進行状況ダイアログと同じにするつもりです。最初のステップは、表示したいダイアログのxmlレイアウトを作成できることです。このレイアウトに名前を付けてみましょう

layout_loading_dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="20dp">
    <ProgressBar
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:gravity="center"
        android:text="Please wait! This may take a moment." />
</LinearLayout>

次のステップは、ProgressBarでこのレイアウトを表示するAlertDialogを作成することです

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(false); // if you want user to wait for some process to finish,
builder.setView(R.layout.layout_loading_dialog);
AlertDialog dialog = builder.create();

今残っているのは、このようなクリックイベントでこのダイアログを表示および非表示にすることだけです

dialog.show(); // to show this dialog
dialog.dismiss(); // to hide this dialog

ご覧のとおり、ProgressDialogの代わりにProgressBarを実装するのはかなり簡単で簡単です。これで、このダイアログボックスをハンドラまたはASyncTaskで表示/閉じることができます。必要に応じて


に変更progress_dialog.show();してくださいbuilder.show();。ありがとうございました。
Matheus Miranda

2
名前を正しいAlertDialogオブジェクトにshow()/ dismiss()に変更しましたが、コードを単純で理解しやすいようにしたい人にとっては混乱を招くため、それを閉じる必要があるbuilder.show()ので、入れませんでした。dialog.dismiss()なぜならbuilder.show()返す AlertDialogオブジェクト、そして私たちのような、その参照保存する必要がありますAlertDialog dialog = builder.show();、その後んdialog.dismiss()、その簡単に持っているbuilder.create()いくつかで戻りAlertDialogオブジェクトをし、ダイアログを表示し、非表示にし、そのオブジェクトを使用する
サイードNaeem

呼び出しスレッドがメインUIスレッドでない場合は、「ru​​nOnUiThread(new Runnable(){@Override public void run(){dialog.show/dismiss();}});」を使用できます。(WebViewからの呼び出しに使用する場合に便利です-shouldoverrideメソッド。)
SHS

15

はい、ProgressDialogは非推奨ですが、Dialogは非推奨ではありません。

独自のXMLファイル(プログレスバーと読み込みテキストを含む)をダイアログオブジェクトにインフレートし、show()およびdismiss()関数を使用して表示または非表示にすることができます。以下は例です(Kotlin):

ProgressDialogクラス

class ProgressDialog {
companion object {
    fun progressDialog(context: Context): Dialog{
        val dialog = Dialog(context)
        val inflate = LayoutInflater.from(context).inflate(R.layout.progress_dialog, null)
        dialog.setContentView(inflate)
        dialog.setCancelable(false)
        dialog.window!!.setBackgroundDrawable(
                ColorDrawable(Color.TRANSPARENT))
        return dialog
    }
  }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:background="#fff"
android:padding="13dp"
android:layout_height="wrap_content">
<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="100dp"
    android:layout_margin="7dp"
    android:layout_height="100dp"
    android:layout_above="@+id/no_jobs_pickups"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_margin="7dp"
    android:layout_toEndOf="@+id/progressBar"
    android:text="Loading..." />
</RelativeLayout>

あなたのコードではvar dialog = ProgressDialog.progressDialog(context)

表示するには: dialog.show()

隠れる: dialog.dismiss()


11

まああなたが本当に彼らの意志に反したいのなら、それでもあなたはSweet Alert Dialogを使うか、自分でそれを作ることができます。

progress_dialog_layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TableRow
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="64dp" >

        <ProgressBar
            android:id="@+id/progressBar2"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />

        <TextView
            android:gravity="center|left"
            android:id="@+id/textView9"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textColor="@color/black"
            android:textSize="18sp"
            android:text="Downloading data. Please wait.." />
    </TableRow>
</RelativeLayout>

Javaコード:

AlertDialog b;
AlertDialog.Builder dialogBuilder;

public void ShowProgressDialog() {
dialogBuilder = new AlertDialog.Builder(DataDownloadActivity.this);
LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            View dialogView = inflater.inflate(R.layout.progress_dialog_layout, null);
            dialogBuilder.setView(dialogView);
            dialogBuilder.setCancelable(false);
            b = dialogBuilder.create();
            b.show();
        }

        public void HideProgressDialog(){

            b.dismiss();
        }

2
実稼働環境でSweetAlertDialogを使用してひどい経験をしました。ウィンドウからウィンドウに漏れるので非常に注意してください。
ジェレミー

私にとってHideProgressは何もしません。
Saeed Neamati

1
進捗ダイアログを表示するためだけにライブラリを使用するのはなぜですか?
ケムラジ


6

カスタムライブラリをインポートする必要はありません。

私はモダンを使用することを好むAlertDialogので、これはこのページでKishan Dongaによって投稿された素晴らしい答えのKotlinバージョンです。

Kotlinコード:

fun setProgressDialog(context:Context, message:String):AlertDialog {
    val llPadding = 30
    val ll = LinearLayout(context)
    ll.orientation = LinearLayout.HORIZONTAL
    ll.setPadding(llPadding, llPadding, llPadding, llPadding)
    ll.gravity = Gravity.CENTER
    var llParam = LinearLayout.LayoutParams(
                  LinearLayout.LayoutParams.WRAP_CONTENT,
                  LinearLayout.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    ll.layoutParams = llParam

    val progressBar = ProgressBar(context)
    progressBar.isIndeterminate = true
    progressBar.setPadding(0, 0, llPadding, 0)
    progressBar.layoutParams = llParam

    llParam = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    val tvText = TextView(context)
    tvText.text = message
    tvText.setTextColor(Color.parseColor("#000000"))
    tvText.textSize = 20.toFloat()
    tvText.layoutParams = llParam

    ll.addView(progressBar)
    ll.addView(tvText)

    val builder = AlertDialog.Builder(context)
    builder.setCancelable(true)
    builder.setView(ll)

    val dialog = builder.create()
    val window = dialog.window
    if (window != null) {
        val layoutParams = WindowManager.LayoutParams()
        layoutParams.copyFrom(dialog.window?.attributes)
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT
                dialog.window?.attributes = layoutParams
    }
    return dialog
}

使用法:

val dialog = setProgressDialog(this, "Loading..")
dialog.show()

出力:

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


フラグメントで使用する方法?フラグメントのコンテキストとは何ですか?
roghayeh hosseini

通常、あなたのフラグメントに、あなたの現在のビューを取得することができますので、コンテキストは次のようになりますview!!.context
アレッサンドロオルナーノ

4

ドキュメントページで述べたように、代替 ProgressBarです。ProgressDialog表情を配置することによって、複製することができますProgressBarAlertDialog

引き続き使用できますが、Androidでは使用を望まないため、非推奨になっています。したがって、をに埋め込むなど、別の方法で問題を解決することを検討する必要ProgressBarがありますLayout


@PeterHaddadこれは、私のプロジェクトのapi 28で「正常に」機能し、下位のapiと同じように機能します。非推奨が示唆するように、サポートされなくなり、将来は機能しない可能性があります。
DMonkey

3

ProgressDialog APIレベル26で廃止されました。

"Deprecated" 新しいものに置き換えられる過程にある関数または要素を指します。

ProgressDialogはモーダルダイアログであり、ユーザーがアプリを操作することを防ぎます。このクラスを使用する代わりに、のような進行状況インジケーターを使用する必要ProgressBarがあります。これは、アプリのUIに埋め込むことができます。

利点

私は個人的にはそのProgressBar2つよりも優れていると思います。ProgressBar操作の進行状況を示すユーザーインターフェイス要素です。中断のない方法でユーザーに進行状況バーを表示します。アプリのユーザーインターフェイスに進行状況バーを表示します。


2

https://github.com/Q115/DelayedProgressDialogの DelayedProgressDialogを使用します。これはProgressDialogと同じですが、必要に応じて遅延の利点が追加されます。

これを使用することは、Android O以前のProgressDialogに似ています。

DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");

2

私が書いたこのクラスを使用できます。基本機能のみを提供します。完全に機能するProgressDialogが必要な場合は、この軽量ライブラリを使用してください。

Gradleのセットアップ

module / build.gradleに次の依存関係を追加します。

compile 'com.lmntrx.android.library.livin.missme:missme:0.1.5'

どうやって使うのですか?

使用法は元のProgressDialogに似ています

ProgressDialog progressDialog = new 
progressDialog(YourActivity.this);
progressDialog.setMessage("Please wait");
progressDialog.setCancelable(false);
progressDialog.show();
progressDialog.dismiss();

注意:あなたは活動のオーバーライドする必要がありますonBackPressed()

Java8実装:

@Override
public void onBackPressed() {
    progressDialog.onBackPressed(
            () -> {
                super.onBackPressed();
                return null;
            }
    );
}

Kotlinの実装:

override fun onBackPressed() {
   progressDialog.onBackPressed { super.onBackPressed() }
}

1

多分このガイドはあなたを助けるかもしれません。

通常、私はインジケーター付きのカスタムAlertDialogを作成することを好みます。アプリビューのカスタマイズなどの問題を解決します。


1

他の人の役に立つかもしれません。

多くの人気のあるアプリは、ネットワークリクエスト、ファイルの読み込みなどの進行状況を表示するための異なるアプローチを持っています。読み込みスピナーは、読み込まれたコンテンツまたは読み込まれた残りの量を表示しません。UI / UXの観点では悪い不確実な期間があります。多くの人気のあるアプリ(Facebook、Linkedinなど)は、必要最小限のUI表示を最初に表示することでこの問題を解決しました。次に、ロードされたコンテンツが画面に徐々に表示されます。

私は この問題を解決するために私のアプリにきらめきを使いました。

これに関する他の人に有益な良い記事があります


0

進行状況ダイアログでは、ユーザーはどのような作業も行えません。進捗ダイアログの間、すべてのバックグラウンドプロセスが停止します。したがって、進行状況ダイアログではなく、ユーザーの進行状況バーを使用することをお勧めします。


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