0

レイアウトの入力中に進行状況ダイアログを表示しようとしています:

編集(ここにコードがあります):

public class CalendarMonth extends Activity {

    private ProgressDialog mDialog;

        private int mMonth = 0;
    private int mYear = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calendar_m);

        filterData();
    }

    private void filterData() {

        mDialog = ProgressDialog.show(this, "Loading calendar", 
                "Please wait...", true, true);
        mDialog.setCancelable(false);
        mDialog.show();

        new GenerateMonth().execute();
    }

class GenerateMonth extends AsyncTask {
        protected Object doInBackground(Object... arg0) {
            generateMonth();
            return true;
        }
        protected void onPostExecute(Object result) {
            mDialog.dismiss();
        }

    private void generateMonth() {

        mCalendar = new CalendarInstance(mMonth, mYear);

        mMonth = this.mCalendar.getSelectedMonth();
        mYear = this.mCalendar.getSelectedYear();

        TextView monthName = (TextView) findViewById(R.id.monthName);
        monthName.setText(mCalendar.getMonthAndYearAsString());

        Button monthPrevious = (Button) findViewById(R.id.monthPrevious);
        monthPrevious.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                int month = mMonth - 1;
                int year = mYear;
                if (mMonth == 1) {
                    month = 12;
                    year = mYear - 1;
                }
                mMonth = month;
                mYear = year;
                filterData();
            }
        });

        Button monthNext = (Button) findViewById(R.id.monthNext);
        monthNext.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                int month = mMonth + 1;
                int year = mYear;
                if (mMonth == 12) {
                    month = 1;
                    year = mYear + 1;
                }
                mMonth = month;
                mYear = year;
                filterData();
            }
        });

        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setNumColumns(7);
        gridview.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
        gridview.setBackgroundColor(Color.BLACK);
        gridview.setAdapter(new CalendarMonthAdapter(this, mMonth, mYear));     
    }

    @Override
    protected void onResume() {

        super.onResume();
        filterData();
    }
    }
4

3 に答える 3

1

AsyncTask http://developer.android.com/reference/android/os/AsyncTask.htmlを使用する方が簡単かもしれません

だからあなたはこのようなものを持っているでしょう

public class Temp extends Activity {
    private Context mContext;
    private ProgressDialog mDialog

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.temp);


        mDialog = ProgressDialog.show(this, "Filter", "blah", true, true);
        mDialog.show();
        new FillDataTask.execute();

    }


    class FillDataTask extends AsyncTask {
        @Override
        protected Object doInBackground(Object... params) {

             try {
                    filterData();
                } catch (ParseException e) {
                    Log.e("FILTER", e.toString());
                    e.printStackTrace();
                }
            return true;  // you can return whatever you want here
        }

        protected void onPostExecute(Object result) {
            //update progressDialog here
            mDialog.dismiss();
        }
    }

}

以下を編集

このようにしてください

public class CalendarMonth extends Activity {

    private ProgressDialog mDialog;

        private int mMonth = 0;
    private int mYear = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calendar_m);

        filterData();
    }

    private void filterData() {

        mDialog = ProgressDialog.show(this, "Loading calendar", 
                "Please wait...", true, true);
        mDialog.setCancelable(false);
        mDialog.show();

        new GenerateMonth().execute();
    }

    private void genMonth()
    {

        mCalendar = new CalendarInstance(mMonth, mYear);

        mMonth = this.mCalendar.getSelectedMonth();
        mYear = this.mCalendar.getSelectedYear();

    }

    private void layoutUI()
    {
          TextView monthName = (TextView) findViewById(R.id.monthName);
        monthName.setText(mCalendar.getMonthAndYearAsString());

        Button monthPrevious = (Button) findViewById(R.id.monthPrevious);
        monthPrevious.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                int month = mMonth - 1;
                int year = mYear;
                if (mMonth == 1) {
                    month = 12;
                    year = mYear - 1;
                }
                mMonth = month;
                mYear = year;
                filterData();
            }
        });

        Button monthNext = (Button) findViewById(R.id.monthNext);
        monthNext.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                int month = mMonth + 1;
                int year = mYear;
                if (mMonth == 12) {
                    month = 1;
                    year = mYear + 1;
                }
                mMonth = month;
                mYear = year;
                filterData();
            }
        });

        GridView gridview = (GridView) findViewById(R.id.gridview);
        gridview.setNumColumns(7);
        gridview.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
        gridview.setBackgroundColor(Color.BLACK);
        gridview.setAdapter(new CalendarMonthAdapter(this, mMonth, mYear)); 
    }
}
}

class GenerateMonth extends AsyncTask {
        protected Object doInBackground(Object... arg0) {
            genMonth();
            return true;
        }
        protected void onPostExecute(Object result) {
            layoutUI();
            mDialog.dismiss();

        }

    }
于 2010-12-16T19:15:18.407 に答える
0

エラーはfilterDataにある必要があります。フィルターデータからUIを更新している場合、その例外が発生します。非同期タスクを使用し、doInBackground を使用してデータを構築し、onPostExecute を使用して UI を更新することをお勧めします。

于 2010-12-16T19:12:47.007 に答える
0

doInBackground 関数から呼び出される generateMonth 関数に問題があるようです。doInBackground 関数または doInBackground から呼び出される関数から UI にアクセスしないでください。この関数は、計算や複雑な DB クエリなど、多くの時間を必要とするタスクを実行することを目的としていますが、UI にアクセスしてはなりません。UI の更新は関数 onPostExecute で行う必要があります。したがって、次のようなものです。

gridview.setNumColumns(7)

doInBackground (またはそこから呼び出される generateMonth) では使用できません。

于 2010-12-16T21:19:59.453 に答える