2017-07-28 802 views
62

我遇到过ProgressDialog已被弃用。除了ProgressBar之外,还有其他替代选择。 我正在使用android studio版本2.3.3。ProgressDialog不推荐使用。替代方法是什么?

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

请我answer.i希望这将帮助你 –

+0

[ProgressDialog可能的重复被弃用](https://stackoverflow.com/questions/45351127/progressdialog-is-deprecated) –

回答

3

由于在documentation page替代提到的是ProgressBarProgressDialog的外观可以通过将ProgressBar放入AlertDialog来复制。

你仍然可以使用它,但Android不希望你使用它,这就是它被弃用的原因。所以你应该考虑以另一种方式解决你的问题,比如将ProgressBar嵌入你的Layout

+0

因为我们仍然可以使用它,它会崩溃在api级别26+还是会正常工作(与较低的api相同)? –

15

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

它在Android O因为Google新的UI标准

+1

“此类在API级别26中已弃用”,而不是日期。他们不希望你再使用它。是的,这是由于新的UI标准,但它们适用于每个API级别...... – creativecreatorormaybenot

+3

“由于Google新的UI标准,它在Android O中已弃用” - 请链接新的UI标准 –

3

也许这guide可以帮助你过时了。

通常我更喜欢使用指示器来定制AlertDialogs。它解决了诸如App视图自定义之类的问题。

79

是的,API level 26已弃用,建议您只效法progressbar

使用此代码,用于创建编程:

RelativeLayout的布局= findViewById(R.id。显示); //在这里指定根布局ID

(或)

RelativeLayout的布局= findViewById(本);

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); //To show ProgressBar 
progressBar.setVisibility(View.GONE);  // To Hide ProgressBar 

要禁用,你只需要添加以下 代码的用户交互

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

此以下行代码的工作仅在高于21 API progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));


解决方案2:另一种方法

<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"/> 

Activity.java

progressBar = (ProgressBar) findViewById(R.id.progressbar); 
`progressBar.setVisibility(View.VISIBLE);`// To Show ProgressBar 
`progressBar.setVisibility(View.INVISIBLE);` //To Hide ProgressBar 

欲了解更多详情:1.Reference one 2.Reference Two

我希望这可以帮助你。

+0

谢谢大家的upvote。 –

+0

为第一种方法,如何以编程方式添加或显示progressBar – usman

+1

@usman请检查我的更新答案...如果它是有用的donot忘记upvote。 –

8

那么,如果你真的想要去违背自己的意愿,仍然可以使用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(); 
     } 
+1

我在SweetAlertDialog的制作环境中遇到过可怕的经历,因为它在窗口之间泄漏,所以非常谨慎。 – Jeremy

1

它可以帮助其他人。

很多热门的应用有不同的方法来显示的像网络请求,文件加载等加载微调什么进展没有显示多少内容已经被加载或剩余加载。有一段时间的不确定性是坏UI/UX的观点。很多流行的应用程序(Facebook,Linkedin等)已经通过首先显示裸露的骨骼UI显示解决了这个问题。然后,加载的内容逐渐填充在屏幕上。

我已经使用shimmer为我的应用程序来解决这个问题。

有关于这这将是其他人

1

我用DelayedProgressDialog从https://github.com/Q115/DelayedProgressDialog它确实一样ProgressDialog与延迟额外的好处,如果必要的有益的好article

使用它的是AndroidØ前同样ProgressDialog:

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

ProgressDialog API等级26已被否决。

"Deprecated"指的是在由较新的被替换的过程中的功能或元件。

ProgressDialog是一个模态对话框,这防止用户从与 该应用进行交互。您应该使用像ProgressBar这样的进度 指标,而不是使用此课程,该指标可以嵌入您应用的用户界面 。

优势

我个人说,ProgressBar拥有两个边缘。 ProgressBar是指示操作进度的用户界面元素。以非中断的方式向用户显示进度条。在应用的用户界面中显示进度条。

5

您可以简单地为您的进度条设计一个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> 

显示的进度对话框中的代码的代码。只需复制此代码并将其粘贴到片段即可。

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

,每当你想显示progressdialog并通过真正作为参数来显示它或假关闭该对话框然后,只需调用该方法。

+0

无法解析获取活动 –

+0

设置视图需要API级别21.所以没有准备好api19 –

+1

@Alok Rajasukumaran它似乎你正在使用活动,只需将它替换为'this',以便它看起来像这样'AlertDialog.Builder builder =新的AlertDialog.Builder(this);'。请确保你正在复制正确的代码。 – DevMike

相关问题