17

由于 Android 版本 O 已弃用 ProgressDialog,因此我仍在寻找更好的方法来完成我的任务。任务是从我的活动转移到片段。一切正常,但进度对话框不可见。我已经尝试过实现它,但是...... progressdialog 不起作用。

进度条似乎可以工作,但仍然无法工作。我需要一个进度对话框,因为我很容易设置我的标题和消息。我需要一个微调进度对话框,但不知道该怎么做。这是我的一项工作,但未实施:

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 的新手。任何帮助都会让我学到新东西!

4

9 回答 9

17

正如 Android O 文档中提到的那样:

此类在 API 级别 26 中已弃用。ProgressDialog 是一个模式对话框,可防止用户与应用程序交互。您应该使用 ProgressBar 之类的进度指示器,而不是使用此类,它可以嵌入到应用程序的 UI 中。或者,您可以使用通知来通知用户任务的进度。

您可以使用 TextView 和 ProgressBar 创建自定义视图并管理其可见性。你也可以使用这个库,因为它使用的是 AlertDialog 而不是 ProgressDialog。

于 2017-07-27T12:58:10.573 回答
14

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>

下一步是创建 AlertDialog,它将使用 ProgressBar 显示此布局

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

就是这样,它应该可以工作,正如您所见,实现 ProgressBar(如 ProgressDialog)而不是弃用的 ProgressDialog 非常简单易行。现在您可以在 Handler 或 ASyncTask 中显示/关闭此对话框,这取决于您的需要,希望您可以使用它来解决您的问题,干杯

于 2018-08-05T12:47:24.083 回答
4

API level 26的,它已被弃用,更好的是您只能使用progressbar

使用此代码段以编程方式创建:

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

只是为了将来参考,将 更改android.R.attr.progressBarStyleSmallandroid.R.attr.progressBarStyleHorizontal

也许本指南可以帮助您。

我希望这可以帮助你。

于 2017-08-19T04:49:25.690 回答
1

您可以使用ProgressBar而不是ProgressDialog. 使用您需要的其他小部件ProgressBar在自定义对话框内创建一个。TextView

于 2017-08-01T11:48:31.710 回答
1

此类在 API 级别 26 中已弃用。

ProgressDialog 是一个模态对话框,可防止用户与应用程序交互。您应该使用 ProgressBar 之类的进度指示器,而不是使用此类,它可以嵌入到应用程序的 UI 中。或者,您可以使用通知来通知用户任务的进度。

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

于 2017-09-08T11:58:33.643 回答
1

您需要创建一个带有 ProgressBar 的自定义 XML 布局文件并显示它。我一直在使用像https://github.com/Q115/DelayedProgressDialog这样的库来获得这种简单的行为。

用法:

DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");
于 2017-09-17T08:26:13.207 回答
1

如果有人坚持要有一个进度对话框,在我的例子中,我选择了一个警报对话框中的进度条。您可以使用以下代码开始。

我的情况很简单,因为我只需要一个不确定的进度条。对于完整的版本,您必须将其封装到一个类中并访问 Bar。

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 上工作,而不得不放入容器中。

于 2018-03-02T12:16:50.037 回答
0

这是我设法放在一起的,因为该类在 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>

在上面的示例中,我想到了滚动情况,说您的视图很长,因此有两个进度条。

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

}

好吧,这是我的 hack,所以我希望它有所帮助。

于 2017-12-14T14:47:57.020 回答
-3

您的示例中的 ProgressDialog 将永远不可见,因为您dismiss()show(). Intent 的创建和调用startActivity()不会阻塞:基本上,您只需安排切换到“很快”执行的其他活动。

您必须将dismiss()呼叫移至活动的 onStop:

@Override
protected void onStop()
{
    super.onStop();
    mProgressDialog.dismiss();
}

此外,有人可能会问:为什么在这种情况下从一项活动切换到另一项活动需要这么长时间?我猜您的 MainActivity 在其 onCreate / onStart / onResume 方法中做了一些繁重的工作。一种更好的处理方法可能是将所有工作放入单独的线程中。

于 2017-09-18T10:44:06.310 回答