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