web-dev-qa-db-ja.com

Androidの割合を持つProgressBarの例を表示する方法

ユーザーが何かを予測したいときに値を表示するために、パーセント値を使用してProgressBarを追加するタスクがあります。 ProgressDialogを使用していないため、推奨されていません。ここで、パーセント値は、リクエストが完了するまで、リクエストを開始するのかによって異なります。サーバーからデータを取得するには、Volleyを使用しています。

ここで私が達成しようとしているもののサンプルイメージに行きます。

ProgressBar Percentage Value

私はすでにこのようにしました

私は警告ダイアログの中に水平方向の進行状況バーを実装しました(進行状況ダイアログが推奨されていないため、このように使用しています)。進捗バーをこのような進捗バーを設定したいと思います。

_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>
 _

結果 :

enter image description here ASYNTASKで:

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");
 _

これが最良のアプローチであるかどうかわかりません

1
Abdul