ฉันเจอเพื่อดูว่าProgressDialog
เลิกใช้แล้ว ProgressBar
สิ่งที่จะเป็นหนึ่งในทางเลือกที่จะใช้ในสถานที่ที่แตกต่างจาก ฉันใช้ android studio เวอร์ชั่น 2.3.3
ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();
ฉันเจอเพื่อดูว่าProgressDialog
เลิกใช้แล้ว ProgressBar
สิ่งที่จะเป็นหนึ่งในทางเลือกที่จะใช้ในสถานที่ที่แตกต่างจาก ฉันใช้ android studio เวอร์ชั่น 2.3.3
ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();
คำตอบ:
ใช่API level 26
มันเลิกใช้แล้ว progressBar
แต่คุณสามารถใช้
ในการสร้างโดยทางโปรแกรม:
ก่อนอื่นรับการอ้างอิงถึงเค้าโครงของรูท
RelativeLayout layout = findViewById(R.id.display); //specify here Root layout Id
หรือ
RelativeLayout layout = findViewById(this);
จากนั้นเพิ่มแถบความคืบหน้า
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);
เพื่อซ่อนแถบความคืบหน้า
progressBar.setVisibility(View.GONE);
หากต้องการปิดใช้งานการโต้ตอบกับผู้ใช้คุณเพียงแค่เพิ่มรหัสต่อไปนี้
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
ในการรับการโต้ตอบจากผู้ใช้คุณต้องเพิ่มรหัสต่อไปนี้
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
เพียงเพื่อใช้อ้างอิงในอนาคตเปลี่ยนไปandroid.R.attr.progressBarStyleSmall
android.R.attr.progressBarStyleHorizontal
รหัสด้านล่างใช้งานได้เฉพาะด้านบน API level 21
progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
วิธีสร้างผ่าน xml:
<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"/>
ในกิจกรรมของคุณ
progressBar = (ProgressBar) findViewById(R.id.progressbar);
การแสดง / ซ่อนแถบความคืบหน้าเหมือนกัน
progressBar.setVisibility(View.VISIBLE); // To show the ProgressBar
progressBar.setVisibility(View.INVISIBLE); // To hide the ProgressBar
นี่คือภาพตัวอย่างของสิ่งที่ดูเหมือน:
สำหรับรายละเอียดเพิ่มเติม:
1. อ้างอิงหนึ่ง
2. อ้างอิงสอง
คุณสามารถใช้AlertDialog
เป็นดูด้านล่างรหัสสำหรับProgressDialog
ProgressDialog
ฟังก์ชั่นนี้คุณต้องโทรหาเมื่อใดก็ตามที่คุณแสดงกล่องโต้ตอบความคืบหน้า
รหัส:
public void setProgressDialog() {
int llPadding = 30;
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setPadding(llPadding, llPadding, llPadding, llPadding);
ll.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
llParam.gravity = Gravity.CENTER;
ll.setLayoutParams(llParam);
ProgressBar progressBar = new ProgressBar(this);
progressBar.setIndeterminate(true);
progressBar.setPadding(0, 0, llPadding, 0);
progressBar.setLayoutParams(llParam);
llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
llParam.gravity = Gravity.CENTER;
TextView tvText = new TextView(this);
tvText.setText("Loading ...");
tvText.setTextColor(Color.parseColor("#000000"));
tvText.setTextSize(20);
tvText.setLayoutParams(llParam);
ll.addView(progressBar);
ll.addView(tvText);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
builder.setView(ll);
AlertDialog dialog = builder.create();
dialog.show();
Window window = dialog.getWindow();
if (window != null) {
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.copyFrom(dialog.getWindow().getAttributes());
layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
dialog.getWindow().setAttributes(layoutParams);
}
}
เอาท์พุท:
AlertDialog
ไม่ควรใช้ที่นี่
คลาสนี้เลิกใช้แล้วในระดับ API 26 ProgressDialog เป็นกล่องโต้ตอบโมดัลซึ่งป้องกันไม่ให้ผู้ใช้โต้ตอบกับแอพ แทนที่จะใช้คลาสนี้คุณควรใช้ตัวบ่งชี้ความคืบหน้าเช่น ProgressBar ซึ่งสามารถฝังอยู่ใน UI ของแอปของคุณ หรือคุณสามารถใช้การแจ้งเตือนเพื่อแจ้งให้ผู้ใช้ทราบถึงความคืบหน้าของงาน ลิงค์
เลิกใช้แล้วAndroid O
เนื่องจากGoogle
มาตรฐาน UI ใหม่
คุณสามารถออกแบบอินเทอร์เฟซ 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>
รหัสรหัสที่แสดงกล่องโต้ตอบความคืบหน้า เพียงคัดลอกรหัสนี้และวางส่วนของคุณ
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
private void setDialog(boolean show){
builder.setView(R.layout.progress);
Dialog dialog = builder.create();
if (show)dialog.show();
else dialog.dismiss();
}
จากนั้นให้เรียกเมธอดเมื่อใดก็ตามที่คุณต้องการแสดงความคืบหน้าและส่งผ่านค่าเป็นอาร์กิวเมนต์เพื่อแสดงหรือเท็จเพื่อยกเลิกการโต้ตอบ
this
เพื่อให้มีลักษณะเช่นนี้AlertDialog.Builder builder = new AlertDialog.Builder(this);
โปรดตรวจสอบว่าคุณกำลังคัดลอกรหัสที่ถูกต้อง
layout_toEndOf
สามารถลบได้ตั้งแต่ไม่ใช่เพื่อLinearLayout
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();
ตอนนี้สิ่งที่เหลือคือการแสดงและซ่อนกล่องโต้ตอบนี้ในกิจกรรมคลิกของเราเช่นนี้
dialog.show(); // to show this dialog
dialog.dismiss(); // to hide this dialog
และนั่นคือมันควรจะทำงานอย่างที่คุณเห็นว่ามันง่ายมากที่จะใช้ ProgressBar แทน ProgressDialog ตอนนี้คุณสามารถแสดง / ยกเลิกกล่องโต้ตอบนี้ใน Handler หรือ ASyncTask ขึ้นอยู่กับความต้องการของคุณ
progress_dialog.show();
builder.show();
ขอบคุณ.
show()
/ dismiss()
แต่ฉันไม่ได้ใส่builder.show()
เพราะเมื่อนั้นให้ยกเลิกเราจะต้องทำสิ่งdialog.dismiss()
ที่สร้างความสับสนให้กับคนที่ชอบให้รหัสของพวกเขาง่ายและเข้าใจง่ายและยัง เนื่องจากbuilder.show()
คืนค่า AlertDialog
วัตถุและเราจะต้องบันทึกการอ้างอิงเช่นAlertDialog dialog = builder.show();
นั้นทำdialog.dismiss()
มันง่ายกว่าที่จะได้builder.create()
คืนค่าในAlertDialog
วัตถุบางอย่างแล้วใช้วัตถุนั้นเพื่อแสดงและซ่อนกล่องโต้ตอบ
ใช่ ProgressDialog เลิกใช้แล้ว แต่กล่องโต้ตอบไม่
คุณสามารถขยายไฟล์ XML ของคุณเอง (ที่มีแถบความคืบหน้าและข้อความโหลด) ลงในวัตถุโต้ตอบของคุณแล้วแสดงหรือซ่อนโดยใช้ฟังก์ชั่นshow()
และ dismiss()
นี่คือตัวอย่าง (Kotlin):
คลาส ProgressDialog :
class ProgressDialog {
companion object {
fun progressDialog(context: Context): Dialog{
val dialog = Dialog(context)
val inflate = LayoutInflater.from(context).inflate(R.layout.progress_dialog, null)
dialog.setContentView(inflate)
dialog.setCancelable(false)
dialog.window!!.setBackgroundDrawable(
ColorDrawable(Color.TRANSPARENT))
return dialog
}
}
}
XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:background="#fff"
android:padding="13dp"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="100dp"
android:layout_margin="7dp"
android:layout_height="100dp"
android:layout_above="@+id/no_jobs_pickups"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_margin="7dp"
android:layout_toEndOf="@+id/progressBar"
android:text="Loading..." />
</RelativeLayout>
ในรหัสของคุณ : ทำvar dialog = ProgressDialog.progressDialog(context)
เพื่อที่จะแสดง: dialog.show()
เพื่อซ่อน: dialog.dismiss()
ถ้าคุณต้องการขัดต่อความต้องการของพวกเขาจริงๆคุณยังสามารถใช้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();
}
HideProgress
ไม่ทำอะไรเลย
ProgressBar เป็นทางเลือกที่ดีที่สุดสำหรับ ProgressDialog องค์ประกอบส่วนต่อประสานผู้ใช้ที่ระบุความคืบหน้าของการดำเนินการ
สำหรับข้อมูลเพิ่มเติมดูGoogle เอกสาร นี้: https://developer.android.com/reference/android/widget/ProgressBar.html
คุณไม่จำเป็นต้องนำเข้าห้องสมุดที่กำหนดเองใด ๆ
ฉันชอบที่จะใช้ความทันสมัยAlertDialog
ดังนั้นนี่เป็นเวอร์ชั่นKotlinสำหรับคำตอบที่ดีที่โพสต์โดยKishan Dongaในหน้านี้
fun setProgressDialog(context:Context, message:String):AlertDialog {
val llPadding = 30
val ll = LinearLayout(context)
ll.orientation = LinearLayout.HORIZONTAL
ll.setPadding(llPadding, llPadding, llPadding, llPadding)
ll.gravity = Gravity.CENTER
var llParam = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT)
llParam.gravity = Gravity.CENTER
ll.layoutParams = llParam
val progressBar = ProgressBar(context)
progressBar.isIndeterminate = true
progressBar.setPadding(0, 0, llPadding, 0)
progressBar.layoutParams = llParam
llParam = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT)
llParam.gravity = Gravity.CENTER
val tvText = TextView(context)
tvText.text = message
tvText.setTextColor(Color.parseColor("#000000"))
tvText.textSize = 20.toFloat()
tvText.layoutParams = llParam
ll.addView(progressBar)
ll.addView(tvText)
val builder = AlertDialog.Builder(context)
builder.setCancelable(true)
builder.setView(ll)
val dialog = builder.create()
val window = dialog.window
if (window != null) {
val layoutParams = WindowManager.LayoutParams()
layoutParams.copyFrom(dialog.window?.attributes)
layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT
layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT
dialog.window?.attributes = layoutParams
}
return dialog
}
val dialog = setProgressDialog(this, "Loading..")
dialog.show()
view!!.context
ตามที่ระบุไว้ในหน้าเอกสารของทางเลือกคือ ดู 's สามารถทำซ้ำโดยการวางเป็นProgressBar
ProgressDialog
ProgressBar
AlertDialog
คุณยังสามารถใช้งานได้ แต่ Android ไม่ต้องการให้คุณใช้นั่นคือเหตุผลที่เลิกใช้แล้ว ดังนั้นคุณควรพิจารณาการแก้ปัญหาของคุณในทางอื่นเช่นการฝังเข้าไปในของคุณProgressBar
Layout
ProgressDialog
ถูกเลิกใช้ใน API ระดับ 26
หมายถึงฟังก์ชั่นหรือองค์ประกอบที่อยู่ในกระบวนการของการถูกแทนที่ด้วยใหม่กว่า"Deprecated"
ProgressDialog เป็นกล่องโต้ตอบโมดัลซึ่งป้องกันไม่ให้ผู้ใช้โต้ตอบกับแอพ แทนที่จะใช้คลาสนี้คุณควรใช้ตัวบ่งชี้ความคืบหน้าเช่น
ProgressBar
ซึ่งสามารถฝังใน UI ของแอปของคุณ
ความได้เปรียบ
โดยส่วนตัวแล้วฉันจะบอกว่าProgressBar
มีขอบเหนือทั้งสอง ProgressBar
เป็นองค์ประกอบส่วนต่อประสานผู้ใช้ที่ระบุถึงความคืบหน้าของการดำเนินการ แสดงแถบความคืบหน้าให้กับผู้ใช้ในที่ไม่ใช่ interruptiveวิธี แสดงแถบความคืบหน้าในส่วนต่อประสานผู้ใช้แอปของคุณ
ฉันใช้ DelayedProgressDialog จากhttps://github.com/Q115/DelayedProgressDialogมันทำเช่นเดียวกับ ProgressDialog พร้อมกับสิทธิประโยชน์เพิ่มเติมของความล่าช้าหากจำเป็น
ใช้มันคล้ายกับ ProgressDialog ก่อนที่ Android O:
DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");
คุณสามารถใช้คลาสนี้ที่ฉันเขียน มันมีฟังก์ชั่นพื้นฐานเท่านั้น ถ้าคุณต้องการ ProgressDialog ทำงานอย่างเต็มที่แล้วใช้น้ำหนักเบานี้ห้องสมุด
เพิ่มการพึ่งพาต่อไปนี้ไปยัง module / build.gradle:
compile 'com.lmntrx.android.library.livin.missme:missme:0.1.5'
การใช้งานคล้ายกับ ProgressDialog ดั้งเดิม
ProgressDialog progressDialog = new
progressDialog(YourActivity.this);
progressDialog.setMessage("Please wait");
progressDialog.setCancelable(false);
progressDialog.show();
progressDialog.dismiss();
หมายเหตุ : คุณต้องแทนที่กิจกรรมonBackPressed()
การใช้งาน Java8:
@Override
public void onBackPressed() {
progressDialog.onBackPressed(
() -> {
super.onBackPressed();
return null;
}
);
}
การดำเนิน Kotlin:
override fun onBackPressed() {
progressDialog.onBackPressed { super.onBackPressed() }
}
บางทีคู่มือนี้อาจช่วยคุณได้
ฉันมักจะชอบ AlertDialogs ที่กำหนดเองพร้อมตัวชี้ มันแก้ปัญหาเช่นการปรับแต่งมุมมองแอพ
มันอาจช่วยคนอื่น
แอพยอดนิยมจำนวนมากมีวิธีการที่แตกต่างกันในการแสดงความคืบหน้าของสิ่งต่าง ๆ เช่นคำขอเครือข่ายการโหลดไฟล์ ฯลฯ การโหลดสปินเนอร์ไม่แสดงจำนวนเนื้อหาที่โหลดหรือโหลดที่เหลือ มีช่วงเวลาของความไม่แน่นอนซึ่งไม่ดีในมุมมองของ UI / UX แอพยอดนิยมมากมาย (Facebook, Linkedin และอื่น ๆ ) ได้แก้ไขปัญหานี้โดยการแสดง UI ของกระดูกเปลือยก่อน จากนั้นเนื้อหาที่โหลดจะถูกบรรจุลงบนหน้าจอค่อยๆ
ฉันใช้ชิมเมอร์ สำหรับแอปของฉันเพื่อแก้ไขปัญหานี้
มีบทความที่ดีเกี่ยวกับเรื่องนี้ซึ่งจะเป็นประโยชน์สำหรับคนอื่น ๆ
ในกล่องโต้ตอบความคืบหน้าผู้ใช้จะไม่สามารถทำงานใด ๆ ได้ กระบวนการพื้นหลังทั้งหมดจะหยุดในระหว่างการโต้ตอบความคืบหน้า ดังนั้นขอแนะนำให้ผู้ใช้แถบความคืบหน้าแทนการโต้ตอบความคืบหน้า
คุณสามารถใช้SpotDialogโดยใช้ห้องสมุด wasabeef คุณสามารถค้นหาบทช่วยสอนที่สมบูรณ์จากลิงค์ต่อไปนี้: