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

Chapter 8

続き。ソース貼り付けはほどほどに。

  • Spinner

今回は難しい。getResource、Adapter。

package com.myexample.chapter8_2_2_1.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

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

        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        String[] labels = getResources().getStringArray(R.array.item_label);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
            this, android.R.layout.simple_spinner_item, labels
        );
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> adapterView, View view, int positoin, long id) {
                    TextView item = (TextView) view;
                    ((TextView) findViewById(R.id.textView)).setText(
                        String.format("[%s]が選択されています。", item.getText())
                    );
                }

                @Override
                public void onNothingSelected(AdapterView<?> adapterView) {

                }
            }
        );
    }
}
  • 画面タッチでメニューを表示して項目選択

currentViewフィールド変数は不要。
またonCreate内でtextViewを割当する。

package com.myexample.chapter8_2_3.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private TextView textView;

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

        textView = (TextView) findViewById(R.id.textView);
        registerForContextMenu((View)findViewById(R.id.layoutView));
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.menu1, menu);
    }

    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item01:
                textView.setText(R.string.context01);
                return true;
            case R.id.item02:
                textView.setText(R.string.context02);
                return true;
            case R.id.item03:
                textView.setText(R.string.context03);
                return true;
            case R.id.item04:
                textView.setText(R.string.context04);
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
}
  • 時計とタイマー
package com.myexample.chapter8_3.app;

import android.os.SystemClock;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Chronometer;
import android.widget.Button;

public class MainActivity extends ActionBarActivity {

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

        final Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);

        ((Button) findViewById(R.id.start_button)).setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    chronometer.setBase(SystemClock.elapsedRealtime());
                    chronometer.start();
                }
            }
        );

        ((Button) findViewById(R.id.stop_button)).setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    chronometer.stop();
                }
            }
        );

        ((Button) findViewById(R.id.reset_button)).setOnClickListener(
            new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    chronometer.setBase(SystemClock.elapsedRealtime());
                    chronometer.stop();
                }
            }
        );
    }
}

f:id:yossk:20141215211131j:plain

Chapter 9 ダイアログボックスを利用する

  • アラートダイアログの表示

P.525の new AlertDialog.Builder(getApplication())ではだめ。
Activity名.thisじゃないと。
getApplicationContext()でもだめなのは、スコープが違うから取れないってことなのかな。
AlertDialog.Builder | Android Developers
Context | Android Developers

package com.myexample.chapter9_1_1_1.app;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

    @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) {
                    new AlertDialog.Builder(MainActivity.this)
                        .setTitle("Alert Dialog OK")
                        .setMessage("OKボタンをクリックしてください")
                        .setIcon(R.drawable.ic_launcher)
                        .setPositiveButton(
                            "OK",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    ((TextView) findViewById(R.id.textView))
                                        .setText("OKボタンがクリックされました");
                                }
                            }
                        ).show();
                }
            }
        );
    }
}
  • YES/NEUTRAL/NO

メソッドの記述順は関係無く、NO/NEUTRAL/YESになるようだ。

package com.myexample.chapter9_1_1_2.app;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

    @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) {
                    final TextView textView = (TextView)findViewById(R.id.textView);
                    new AlertDialog.Builder(MainActivity.this)
                        .setTitle("Alert Dialog")
                        .setMessage("ボタンをクリックしてください")
                        .setPositiveButton(
                            "YES",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    textView.setText("YESボタンがクリックされました。");
                                }
                            }
                        )
                        .setNeutralButton(
                            "NEUTRAL",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    textView.setText("NEUTRALボタンがクリックされました。");
                                }
                            }
                        )
                        .setNegativeButton(
                            "NO",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    textView.setText("NOボタンがクリックされました。");
                                }
                            }
                        ).show();
                }
            }
        );
    }
}
  • 連続してダイアログを出す
package com.myexample.chapter9_1_1_3.app;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private TextView textView;

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

        LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(linearLayout);

        textView = new TextView(this);
        textView.setText("ボタンをクリックしてください。");
        linearLayout.addView(textView);

        Button button = new Button(this);
        button.setText("Button");
        button.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        button.setOnClickListener(new SampleClickLinster());
        linearLayout.addView(button);
    }

    class SampleClickLinster implements View.OnClickListener {

        @Override
        public void onClick(View view) {
            new AlertDialog.Builder(MainActivity.this)
                .setTitle("Alert Dialog")
                .setMessage("ボタンをクリックしてください。")
                .setPositiveButton(
                    "YES",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            new AlertDialog.Builder(MainActivity.this)
                                .setTitle("確認")
                                .setMessage("[OK]ボタンがクリックされました。")
                                .setPositiveButton("OK", null)
                                .show();
                        }
                    }
                )
                .setNegativeButton("NO", null)
                .show();
        }
    }
}
  • リスト形式のダイアログ
package com.myexample.chapter9_1_2.app;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);

        ((Button) findViewById(R.id.button)).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    final CharSequence[] colors = {"RED", "BLUE", "YELLOW"};
                    new AlertDialog.Builder(MainActivity.this)
                        .setTitle("カラーを選択してください。")
                        .setItems(
                            colors,
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    textView.setText(
                                        String.format(
                                            "%s が選択されました。", colors[i]
                                        )
                                    );
                                }
                            }
                        ).show();
                }
            }
        );
    }
}
package com.myexample.chapter9_1_3.app;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

    @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) {
                    final CharSequence[] items = {"RED", "BLUE", "YELLOW"};
                    new AlertDialog.Builder(MainActivity.this)
                        .setTitle("カラーを選択してください。")
                        .setSingleChoiceItems(
                            items, -1, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    ((TextView) findViewById(R.id.textView)).setText(
                                        String.format(
                                            "%s が選択されました。", items[i]
                                        )
                                    );
                                }
                            }
                        )
                        .setPositiveButton(
                            "OK",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                }
                            }
                        ).show();
                }
            }
        );
    }
}
package com.myexample.chapter9_1_4.app;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);

        ((Button) findViewById(R.id.button)).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    textView.setText(
                        String.format(
                            "Green = false%nBlue = false%n" +
                                "Red = false%nYellow = false%n" +
                                "Purple = false"
                        )
                    );

                    final CharSequence[] items = {
                        "Green", "Blue", "Red", "Yellow", "Purple"
                    };

                    final boolean[] checkedItems = {
                        false, false, false, false, false
                    };

                    new AlertDialog.Builder(MainActivity.this)
                        .setTitle("Pick a color")
                        .setMultiChoiceItems(
                            items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                                    checkedItems[i] = b;
                                    textView.setText(
                                        String.format(
                                            "Green = %s%n" +
                                                "Blue = %s%n" +
                                                "Red = %s%n" +
                                                "Yellow = %s%n" +
                                                "Purple = %s%n",
                                            checkedItems[0],
                                            checkedItems[1],
                                            checkedItems[2],
                                            checkedItems[3],
                                            checkedItems[4]
                                        )
                                    );
                                }
                            }
                        )
                        .setPositiveButton(
                            "OK",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {

                                }
                            }
                        ).show();
                }
            }
        );
    }
}
  • オリジナルのダイアログ
package com.myexample.chapter9_1_4.app;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);

        ((Button) findViewById(R.id.button)).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    textView.setText(
                        String.format(
                            "Green = false%nBlue = false%n" +
                                "Red = false%nYellow = false%n" +
                                "Purple = false"
                        )
                    );

                    final CharSequence[] items = {
                        "Green", "Blue", "Red", "Yellow", "Purple"
                    };

                    final boolean[] checkedItems = {
                        false, false, false, false, false
                    };

                    new AlertDialog.Builder(MainActivity.this)
                        .setTitle("Pick a color")
                        .setMultiChoiceItems(
                            items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i, boolean b) {
                                    checkedItems[i] = b;
                                    textView.setText(
                                        String.format(
                                            "Green = %s%n" +
                                                "Blue = %s%n" +
                                                "Red = %s%n" +
                                                "Yellow = %s%n" +
                                                "Purple = %s%n",
                                            checkedItems[0],
                                            checkedItems[1],
                                            checkedItems[2],
                                            checkedItems[3],
                                            checkedItems[4]
                                        )
                                    );
                                }
                            }
                        )
                        .setPositiveButton(
                            "OK",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {

                                }
                            }
                        ).show();
                }
            }
        );
    }
}

f:id:yossk:20141215232739j:plain

今日の感想

どの時にどのメソッドを使うのか、これは経験していくうちに覚えていくしかないのかな。
だんだん難しくなってきて、進みが遅くなってしまっている。
ただ、書いたものが動く、というのは楽しい。