web-dev-qa-db-ja.com

ProgressDialogは非推奨です

ProgressDialogはAndroidバージョンOから廃止されているため、タスクを実行するためのより良い方法を探しています。タスクはアクティビティからフラグメントに移動することです。すべて正常に動作しています。ただし、progressdialogは表示されません。実装しようとしましたが、... progressdialogが機能しません。

プログレスバーは動作するようですが、まだ動作しないようです。タイトルとメッセージを簡単に設定できるので、progressdialogが必要です。スピナーprogressDialogが必要ですが、その方法がわかりません。これは私の作業の1つですが、実装していません。

Javaクラス

ublic class SaveVideo extends AppCompatActivity {

private Button button;

private ProgressDialog mProgressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_save_video);

    mProgressDialog = new ProgressDialog(this);

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.back);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    button = (Button) findViewById(R.id.saveVideo);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            //where it must be seen when the button is pressed
            mProgressDialog.setTitle("Title");
            mProgressDialog.setMessage("Message");
            mProgressDialog.show();

            Intent intent = new Intent(SaveVideo.this,MainActivity.class);
            intent.putExtra("change",2);
            startActivity(intent);

            //as soon as the page moves from this to another fragment
            mProgressDialog.dismiss();
        }
    });


}

私はAndroidバージョンOが初めてです。どんな助けでも、学ぶべき新しいことがあります!

11
Alok

Android Oドキュメント:

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

TextViewとProgressBarを使用してカスタムビューを作成し、その可視性を管理できます。 ProgressDialogではなくAlertDialogを使用しているため、 this library も使用できます。

14
Divy Soni

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

あとは、このようなクリックイベントでこのダイアログを表示または非表示にするだけです。

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

これで動作するはずです。非推奨のProgressDialogではなくProgressBar(ProgressDialogなど)を実装するのが非常にシンプルで簡単であることがわかります。ハンドラーまたはASyncTaskのいずれかでこのダイアログボックスを表示/非表示にできるようになりました。必要に応じて、これを使用して問題を解決できることを願っています。

9
Syed Naeem

はい、 API level 26廃止予定です。progressbarのみを使用できます。

次のコードスニペットを使用して、プログラムで作成します。

ProgressBar progressBar = new ProgressBar(activity, null, Android.R.attr.progressBarStyleSmall);

後で参照するために、Android.R.attr.progressBarStyleSmallからAndroid.R.attr.progressBarStyleHorizontal

たぶん、これは ガイド に役立つかもしれません。

これがお役に立てば幸いです。

2
Gowthaman M

ProgressBarの代わりにProgressDialogを使用できます。 ProgressBarおよび必要な他のウィジェットを使用して、カスタムダイアログ内にTextViewを作成します。

1
Milad Moosavi

ProgressBarを含むカスタムXMLレイアウトファイルを作成し、代わりに表示する必要があります。 https://github.com/Q115/DelayedProgressDialog のようなライブラリを使用して、この単純な動作を取得しています。

使用法:

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

このクラスはAPIレベル26で廃止されました。

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

https://developer.Android.com/reference/Android/app/ProgressDialog.html

1
Mayur Prasad

誰かが進行状況ダイアログを持っていると主張する場合、私の場合は、警告ダイアログ内に進行状況バーを選択しました。次のコードを使用して開始できます。

不確定なプログレスバーが必要だったので、私の場合は簡単でした。本格的なバージョンの場合は、クラスにカプセル化してバーにアクセスする必要があります。

private AlertDialog Create_Indeterminate_HorizontalProgressBar_AlertDialog(
        Context context, String title, String message)
{
    final ProgressBar progressBar =
            new ProgressBar(
                    context,
                    null,
                    Android.R.attr.progressBarStyleHorizontal);

    progressBar.setLayoutParams(
            new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT));

    progressBar.setIndeterminate(true);

    final LinearLayout container =
            new LinearLayout(context);

    container.addView(progressBar);

    int padding =
            getDialogPadding(context);

    container.setPadding(
            padding, (message == null ? padding : 0), padding, 0);

    AlertDialog.Builder builder =
            new AlertDialog.Builder(context).
                    setTitle(title).
                    setMessage(message).
                    setView(container);

    return builder.create();
}

private int getDialogPadding(Context context)
{
    int[] sizeAttr = new int[] { Android.support.v7.appcompat.R.attr.dialogPreferredPadding };
    TypedArray a = context.obtainStyledAttributes((new TypedValue()).data, sizeAttr);
    int size = a.getDimensionPixelSize(0, -1);
    a.recycle();

    return size;
}

注:Barがコンテナ内にある理由を知りたい場合:代わりにコンテナに配置する必要があるため、Barでパディングを機能させることができませんでした。

1
Nublodeveloper

Android Oreo(API 26 +)。

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:visibility="gone"
            Android:layout_marginTop="5dp"
            Android:id="@+id/top_progressBar"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            Android:layout_width="match_parent"
            Android:layout_marginRight="10dp"
            Android:layout_marginLeft="10dp"
            Android:layout_height="wrap_content"
            Android:indeterminateTintMode="src_in"
            Android:indeterminateTint="@color/white"
            Android:indeterminate="true" />
    <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" />
  <ProgressBar
                Android:visibility="gone"
                Android:layout_marginTop="2dp"
                Android:id="@+id/down_progressBar"
                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                Android:layout_width="match_parent"
                Android:layout_marginRight="10dp"
                Android:layout_marginLeft="10dp"
                Android:layout_height="wrap_content"
                Android:indeterminateTintMode="src_in"
                Android:indeterminateTint="@color/white"
                Android:indeterminate="true" />

</LinearLayout>

上記のサンプルでは、​​ビューが長いため2つのプログレスバーがあるというスクロール状況を考えました。

Javaファイルサンプル:

public class GetUserDetails extends AppCompatActivity {
private ProgressBar topProgressBar, downProgressBar;
    private ProgressDialog progressDialog;
@Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_get_user_details );
//initilise the progressbar views and progress dialog object
 topProgressBar = findViewById ( R.id.top_progressBar );
    downProgressBar = findViewById ( R.id.down_progressBar );
  if ( Build.VERSION.SDK_INT < 26 ) {
        progressDialog = new ProgressDialog ( this );
    } else {
        topProgressBar.setIndeterminate ( true );
        downProgressBar.setIndeterminate ( true );
    }
 }



    private void showProgressDialog (final boolean isToShow) {
            if ( Build.VERSION.SDK_INT < 26 ) {
                if ( isToShow ) {

                    progressDialog.setMessage ( "Processing ...Please wait." );
                    progressDialog.setCancelable ( false );
                    if ( ! progressDialog.isShowing () ) {
                        progressDialog.show ();

                    }

                } else {
                    if ( progressDialog.isShowing () ) {
                        progressDialog.dismiss ();
                    }
                }
            } else {
                /* this is Android Oreo and above*/
                if ( isToShow ) {
                    topProgressBar.setVisibility ( View.VISIBLE );
                    downProgressBar.setVisibility ( View.VISIBLE );
                    getWindow ().setFlags ( WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE );
                } else {
                    topProgressBar.setVisibility ( View.GONE );
                    downProgressBar.setVisibility ( View.GONE );
                    getWindow ().clearFlags ( WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE );
                }
            }
        }

}

まあ、これは私のハックですので、私はそれが役立つことを願っています。

0
kinsley kajiva