Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ProgressDialog已弃用_Android_Progressdialog_Android 8.0 Oreo - Fatal编程技术网

Android ProgressDialog已弃用

Android ProgressDialog已弃用,android,progressdialog,android-8.0-oreo,Android,Progressdialog,Android 8.0 Oreo,由于ProgressDialog在Android版本O中被弃用,我仍然在寻找更好的方法来完成我的任务。任务是从我的活动转移到片段。一切正常,但progressdialog不可见。我尝试过实现它,但是。。。progressdialog不起作用 progressbar似乎可以工作,但仍然不工作。我需要一个progressdialog,因为对我来说设置标题和消息很简单。我需要一个旋转器,但不知道怎么做。以下是我的一项工作,但未实施: Java类 ublic class SaveVideo extend

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

progressbar似乎可以工作,但仍然不工作。我需要一个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的新手。任何帮助都会给我新的东西学习

正如Android O文档中提到的:

该类在API级别26中被弃用。ProgressDialog是一个模态 对话框,该对话框阻止用户与应用程序交互。相反 在使用此类时,您应该使用一个进度指示器,如 ProgressBar,可嵌入应用程序的UI中。或者, 您可以使用通知通知用户任务的进度

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

您可以使用
ProgressBar
而不是
ProgressDialog

在自定义对话框中创建一个
ProgressBar
,其中包含
TextView
和您需要的其他小部件。

是的,
API level 26
已弃用,最好只使用
ProgressBar

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

ProgressBar progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleSmall);
仅供将来参考,将
android.R.attr.progressBarStyleSmall
更改为
android.R.attr.progressBarStyleHorizontal

也许这能帮你


我希望这可以帮助您。

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

ProgressDialog是一个模式对话框,它阻止用户 与应用程序交互。您应该使用 进度指示器,如ProgressBar,可嵌入到 应用程序的用户界面。或者,您可以使用通知通知用户 任务的进度


您需要创建一个带有ProgressBar的自定义XML布局文件,并显示它。我一直在使用一个库来获得这个简单的行为

用法:

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

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

您必须将
disclose()
调用移动到活动的顶部:

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

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

这是我设法将其放在一起的,因为Android Oreo(API 26+)中不推荐使用该类

在Xml文件(任何布局文件)中:


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

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

}
公共类GetUserDetails扩展了AppCompative活动{
private ProgressBar topProgressBar、downProgressBar;
私有进程对话;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u get\u user\u details);
//初始化progressbar视图和进度对话框对象
topProgressBar=findViewById(R.id.top\u progressBar);
downProgressBar=findViewById(R.id.down\u progressBar);
如果(Build.VERSION.SDK_INT<26){
progressDialog=新建progressDialog(此);
}否则{
topProgressBar.setUndeterminate(true);
downProgressBar.SetUndeterminate(真);
}
}
私有void showProgressDialog(最终显示){
如果(Build.VERSION.SDK_INT<26){
如果(isToShow){
progressDialog.setMessage(“正在处理…请稍候”);
progressDialog.setCancelable(false);
如果(!progressDialog.isShowing()){
progressDialog.show();
}
}否则{
if(progressDialog.isShowing()){
progressDialog.disclose();
}
}
}否则{
/*这是安卓奥利奥及以上*/
如果(isToShow){
topProgressBar.setVisibility(View.VISIBLE);
downProgressBar.setVisibility(View.VISIBLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG\不可触摸,WindowManager.LayoutParams.FLAG\不可触摸);
}否则{
topProgressBar.setVisibility(View.GONE);
downProgressBar.setVisibility(View.GONE);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG\u不可触摸);
}
}
}
}

好吧,这是我的黑客行为,所以我希望它能有所帮助。

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

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

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;
}
注意:如果你想知道为什么酒吧是在一个容器中:我只是无法让填充物在酒吧上工作,而不得不放在容器中。

ProgressB
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;
}
<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.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