【问题标题】:ProgressDialog is deprecated [duplicate]ProgressDialog 已弃用 [重复]
【发布时间】:2018-01-03 04:52:36
【问题描述】:

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

【问题讨论】:

  • 当你使用progresBar时progressBar不显示?
  • 不!我做了同样的事情,只是使用了progressBar。我做了 setVisibility(View.VISIBILE) 和 setVisibility(View.INVISIBLE) 相同但没有迹象。
  • 您可以发布登录代码吗?
  • 我没有任何登录代码。只是我正在从这个活动转移到片段。这需要一点时间。所以我在考虑实现progressDialog
  • @Alok 的问题是在开始发送意图后立即调用dismiss() 方法。对话框“将”很快出现和消失,从用户的角度来看,它似乎从未出现过。诸如“它已被弃用”或“实现自定义对话框”之类的答案无济于事,尤其是关于创建自定义对话框的答案,因为它不仅没有谈论真正的问题,而且对可用性问题,这就是为什么这个类首先被弃用的原因。

标签: android progressdialog android-8.0-oreo


【解决方案1】:

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

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

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

【讨论】:

  • 如果我想要一个像progressDialog 一样的微调器进度条,你相信这行得通吗?标题和其他信息?当我们从 ativity 移动到 Fragment 时,进度条会显示吗?
  • 我用过这个库,但它说的不像 AlertDialog alertdialog = new SpotsDialog(context);这给了我一个错误,我已经从 AlertDialog 将其更改为 SpotsDailog,但它仍然没有出现。因为我通常只是在没有任何进度条的情况下从一项活动转移到另一项活动!
  • 真棒兄弟 :) 这对我有用,非常感谢你:)
  • You can use this library also because it is using AlertDialog instead of ProgressDialog 使用另一种对话是个坏主意,文档说you should use a progress indicator like ProgressBar, which can be embedded in your app's UI
【解决方案2】:

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 中显示/关闭此对话框,这取决于您的需要,希望您可以使用它来解决您的问题,干杯

【讨论】:

    【解决方案3】:

    是的,API level 26 已弃用,您最好只能使用 progressbar

    使用此代码 sn-p 以编程方式创建:

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

    仅供参考,请将android.R.attr.progressBarStyleSmall 更改为android.R.attr.progressBarStyleHorizontal

    也许这个guide 可以帮助你。

    希望对你有帮助。

    【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      用法:

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

      【讨论】:

        【解决方案6】:

        您可以使用ProgressBar 代替ProgressDialog。 在带有TextView 和您需要的其他小部件的自定义对话框中创建ProgressBar

        【讨论】:

          【解决方案7】:

          如果有人坚持要有一个进度对话框,就我而言,我选择在警报对话框中设置一个进度条。您可以使用以下代码开始使用。

          我的情况很简单,因为我只需要一个不确定的进度条。对于完整的版本,您必须将其封装到一个类中并访问 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 上工作,而不得不放入容器中。

          【讨论】:

            【解决方案8】:

            自从该类在 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,所以我希望它有所帮助。

            【讨论】:

              【解决方案9】:

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

              您必须将 dismiss() 调用移动到您的活动的 onStop:

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

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

              【讨论】:

                猜你喜欢
                • 2020-04-20
                • 2014-10-27
                • 2020-09-23
                • 2014-03-14
                • 2013-02-23
                • 2014-09-18
                • 2012-10-29
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多