ユーザーが何かを予測したいときに値を表示するために、パーセント値を使用してProgressBar
を追加するタスクがあります。 ProgressDialog
を使用していないため、推奨されていません。ここで、パーセント値は、リクエストが完了するまで、リクエストを開始するのかによって異なります。サーバーからデータを取得するには、Volley
を使用しています。
ここで私が達成しようとしているもののサンプルイメージに行きます。
私はすでにこのようにしました
私は警告ダイアログの中に水平方向の進行状況バーを実装しました(進行状況ダイアログが推奨されていないため、このように使用しています)。進捗バーをこのような進捗バーを設定したいと思います。
_public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_result_prediction, container, false);
predictProgress = (ProgressBar) view.findViewById(R.id.progressbarPredict);
AlertDialog.Builder(view.getContext());
builder.setCancelable(false); // if you want user to wait for some process to finish,
View v = inflater.inflate(R.layout.layout_loading_dialog, null);
builder.setView(v);
final AlertDialog dialog = builder.create();
submitPredictPlant.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.show();
predictProgress.setProgress(25);
predictProgress.setProgress(50);
predictProgress.setProgress(75);
predictProgress.setProgress(100);
dialog.dismiss();
_
進行状況が100のときにダイアログを閉じたいです。しかし、これはのようなエラーを与えます
_Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.widget.ProgressBar.setProgress(int)' on a null object reference
_
builder.SetViewで使用されているLayout_Loading_Dialogから進行中のバーを参照しています。
これが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="vertical"
Android:padding="20dp">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_weight="4"
Android:gravity="center"
Android:text="Please wait! This may take a moment." />
<ProgressBar
Android:layout_width="match_parent"
Android:id="@+id/progressbarPredict"
Android:layout_height="wrap_content"
Android:layout_weight="1"
style="?android:attr/progressBarStyleHorizontal"/>
_
以下は、画像のような割合の進行状況ダイアログを作成するためのコードです。
int status = 0;
Handler handler = new Handler();
public void showDialog(Activity activity, String msg) {
final Dialog dialog = new Dialog(activity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.dialog);
final ProgressBar text = (ProgressBar) dialog.findViewById(R.id.progress_horizontal);
final TextView text2 = dialog.findViewById(R.id.value123);
new Thread(new Runnable() {
@Override
public void run() {
while (status < 100) {
status += 1;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
text.setProgress(status);
text2.setText(String.valueOf(status));
if (status == 100) {
dialog.dismiss();
}
}
});
}
}
}).start();
dialog.show();
Window window = dialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
}
_
レイアウトファイル:ダイアログ
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:orientation="vertical">
<ProgressBar
Android:id="@+id/progress_horizontal"
style="?android:attr/progressBarStyleHorizontal"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:padding="16dp" />
<RelativeLayout
Android:layout_width="wrap_content"
Android:paddingLeft="20dp"
Android:layout_margin="16dp"
Android:layout_height="wrap_content">
<TextView
Android:id="@+id/value123"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_toRightOf="@id/value123"
Android:text="%" />
</RelativeLayout>
_
結果 :
int status = 0;
Handler handler = new Handler();
Dialog dialog;
ProgressBar text;
TextView text2;
public void showDialog(Activity activity, String msg) {
dialog = new Dialog(activity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.dialog);
text = (ProgressBar) dialog.findViewById(R.id.progress_horizontal);
text2 = dialog.findViewById(R.id.value123);
dialog.show();
Window window = dialog.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
new Thread(new Runnable() {
@Override
public void run() {
while (status < 100) {
status += 1;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
@Override
public void run() {
text.setProgress(status);
text2.setText(String.valueOf(status));
if (status == 100) {
status = 0;
}
}
});
}
}
}).start();
}
private class AsyncTaskRunner extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
// it will fill the progress bar to 100
// and will refill again and again
/*
*
* Make your api call here
* MAke request to API and return data when response comes
*
*
* */
/*
*
* I have just add sleep to thead for example purposes
*
* */
try {
Thread.sleep(30 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return resp;
}
@Override
protected void onPostExecute(String result) {
/*
*
*
* Do your processing there on the api result
*
*
* */
dialog.dismiss();
}
@Override
protected void onPreExecute() {
showDialog(MainActivity.this,"");
}
@Override
protected void onProgressUpdate(String... text) {
}
}
_
Asyntaskを起動するには:
new AsyncTaskRunner().execute("fs");
_
これが最良のアプローチであるかどうかわかりません