Androidアプリ開発パーフェクトマスター - 5日目

Chapter 9.2 のプログレスダイアログをアプリの上部に表示するのは動かないので諦める。
検索してもそれらしいのはない。書く順序の話しかでてこない。
検索して出てこないということは、こっちの環境の問題なのかもしれない。
非常に残念で心残りだが、断念。

  • 別スレッドで実行するプログレスダイアログの作成
package com.myexample.chapter9_2_2.app;

import android.app.ProgressDialog;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends ActionBarActivity implements Handler.Callback {
    private ProgressDialog progressDialog;
    private Thread thread;
    private Handler handler;

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

        ((Button) findViewById(R.id.button))
            .setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        handler = new Handler(MainActivity.this);
                        Runnable runnable = new Runnable() {
                            @Override
                            public void run() {
                                for (int i = 0; i < 100; i++) {
                                    try {
                                        Thread.sleep(100);
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                    handler.sendEmptyMessage(0);
                                }

                                handler.sendEmptyMessage(1);
                                thread = null;
                            }
                        };

                        progressDialog = new ProgressDialog(MainActivity.this);
                        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        progressDialog.setTitle(R.string.title);
                        progressDialog.setMessage(getString(R.string.message));
                        progressDialog.setCancelable(false);
                        progressDialog.setProgress(0);
                        progressDialog.setMax(100);
                        progressDialog.show();

                        thread = new Thread(runnable);
                        thread.start();
                    }
                }
            );
    }

    @Override
    public void onPause() {
        handler.sendEmptyMessage(1);
        thread = null;
    }

    @Override
    public boolean handleMessage(Message message) {
        switch (message.what) {
            case 0:
                progressDialog.incrementProgressBy(1);
                return true;
            case 1:
                progressDialog.dismiss();
                return true;
            default:
                return false;
        }
    }
}
  • 日付設定、時刻設定ダイアログ
package com.myexample.chapter9_3_1.app;

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TimePicker;

import java.util.Calendar;

public class MainActivity extends ActionBarActivity {
    private DatePickerDialog.OnDateSetListener dateSetListener;
    private TimePickerDialog.OnTimeSetListener timeSetListener;

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

        final EditText editText = (EditText) findViewById(R.id.extractEditText);
        dateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
                editText.setText(String.format("%s/%s/%s", i, i1 + 1, i2));
            }
        };

        timeSetListener = new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker timePicker, int i, int i1) {
                editText.setText(i + ":" + i1);
            }
        };

        ((Button) findViewById(R.id.button1)).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Calendar calendar = Calendar.getInstance();
                    DatePickerDialog datePickerDialog = new DatePickerDialog(
                        MainActivity.this,
                        dateSetListener,
                        calendar.get(Calendar.YEAR),
                        calendar.get(Calendar.MONTH),
                        calendar.get(Calendar.DAY_OF_MONTH)
                    );
                    datePickerDialog.show();
                }
            }
        );

        ((Button) findViewById(R.id.button2)).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Calendar calendar = Calendar.getInstance();
                    TimePickerDialog timePickerDialog = new TimePickerDialog(
                        MainActivity.this,
                        timeSetListener,
                        calendar.get(Calendar.HOUR_OF_DAY),
                        calendar.get(Calendar.MINUTE),
                        false
                    );
                    timePickerDialog.show();
                }
            }
        );
    }
}

f:id:yossk:20141217191648j:plain

デフォルトで綺麗なPickerが出る。

今日の感想

やはりプログレスダイアログの表示ができなかった。とても心残り。