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

Chapter 8

続き。

  • Toast 表示
package com.myexample.chapter8_1_4.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

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

        Toast.makeText(
            getApplicationContext(), "トーストを表示します", Toast.LENGTH_LONG
        ).show();
    }
}
  • アクティビティのライフサイクルをToast表示
package com.myexample.chapter8_1_5.app;

import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

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

    protected void onPause() {
        super.onPause();
        Toast.makeText(
            getApplicationContext(), "onPauseが呼び出されました", Toast.LENGTH_LONG
        ).show();
    }

    protected void onStop() {
        super.onStop();
        Toast.makeText(
            getApplicationContext(), "onStopが呼び出されました", Toast.LENGTH_LONG
        ).show();
    }

    protected void onDestroy() {
        super.onDestroy();
        Toast.makeText(
            getApplicationContext(), "onDestroyが呼び出されました", Toast.LENGTH_LONG
        ).show();
    }
}

どうでもよいことだけど、書籍では「onPauseが」が「onPausegaが」になってた。

  • ボタンクリックで現在日時を表示
package com.myexample.chapter8_1_6.app;

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

import java.text.SimpleDateFormat;
import java.util.Date;

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) {
                    SimpleDateFormat sdfFormat =
                        new SimpleDateFormat("yyyy.MM.dd '/' hh:mm:ss");

                    Date dateTime = new Date();

                    Toast testToast = Toast.makeText(
                        getApplicationContext(), sdfFormat.format(dateTime),
                        Toast.LENGTH_LONG
                    );

                    testToast.show();
                }
            }
        );
    }
}
package com.myexample.chapter8_1_7.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import org.w3c.dom.Text;


public class MainActivity extends ActionBarActivity
    implements CompoundButton.OnCheckedChangeListener {

    private CheckBox checkBox1, checkBox2, checkBox3;

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

        checkBox1 = (CheckBox) findViewById(R.id.checkBox1);
        checkBox2 = (CheckBox) findViewById(R.id.checkBox2);
        checkBox3 = (CheckBox) findViewById(R.id.checkBox3);

        checkBox1.setOnCheckedChangeListener(this);
        checkBox2.setOnCheckedChangeListener(this);
        checkBox3.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
        ((TextView) findViewById(R.id.textView)).setText(
            String.format(
                "1は「%s」:2は「%s」:3は「%s」",
                checkBox1.isChecked(),
                checkBox2.isChecked(),
                checkBox3.isChecked()
            )
        );
    }
}

f:id:yossk:20141214174058j:plain

書籍には

setContentView(R.layout.activity_main);

が記述しているが、不要かな。

package com.myexample.chapter8_1_7_2.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity
    implements CompoundButton.OnCheckedChangeListener {

    private TextView textView;
    private CheckBox checkBox1, checkBox2, checkBox3;

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

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

        checkBox1 = new CheckBox(this);
        checkBox1.setText("CheckBox1");
        checkBox1.setOnCheckedChangeListener(this);
        linearLayout.addView(checkBox1);

        checkBox2 = new CheckBox(this);
        checkBox2.setText("CheckBox2");
        checkBox2.setOnCheckedChangeListener(this);
        linearLayout.addView(checkBox2);

        checkBox3 = new CheckBox(this);
        checkBox3.setText("CheckBox1");
        checkBox3.setOnCheckedChangeListener(this);
        linearLayout.addView(checkBox3);
    }

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
        textView.setText(
            String.format(
                "1は「%s」:2は「%s」:3は「%s」",
                checkBox1.isChecked(),
                checkBox2.isChecked(),
                checkBox3.isChecked()
            )
        );
    }
}

結果を見ると、XMLで指定したものとはレイアウトやカラーリングが違うなぁ。
f:id:yossk:20141214173904j:plain

package com.myexample.chapter8_1_8.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

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

        ((RadioGroup) findViewById(R.id.radioGroup)).setOnCheckedChangeListener(
            new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
                    TextView textView = (TextView) findViewById(R.id.textView);
                    String message = "";
                    switch (checkedId) {
                        case R.id.radioButton1:
                            message = "RadioButton1がオンです。";
                            break;
                        case R.id.radioButton2:
                            message = "RadioButton2がオンです。";
                            break;
                        case R.id.radioButton3:
                            message = "RadioButton3がオンです。";
                            break;
                    }
                    textView.setText(message);
                }
            }
        );

        // デフォルトチェック
        ((RadioGroup) findViewById(R.id.radioGroup)).check(
            ((RadioButton) findViewById(R.id.radioButton1)).getId()
        );
    }
}

CheckBoxのフィールド変数が設定されていたが、不要。

package com.myexample.chapter8_1_8_2.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

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

        final TextView textView = new TextView(this);
        linearLayout.addView(textView);

        RadioGroup radioGroup = new RadioGroup(this);
        linearLayout.addView(radioGroup);

        final RadioButton radioButton1 = new RadioButton(this);
        radioButton1.setText("RadioButton1");
        radioGroup.addView(radioButton1);

        final RadioButton radioButton2 = new RadioButton(this);
        radioButton2.setText("RadioButton2");
        radioGroup.addView(radioButton2);

        final RadioButton radioButton3 = new RadioButton(this);
        radioButton3.setText("RadioButton3");
        radioGroup.addView(radioButton3);

        radioGroup.setOnCheckedChangeListener(
            new RadioGroup.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
                    String message = "";

                    if (checkedId == radioButton1.getId()) {
                        message = "RadioButton1がオンです。";
                    } else if (checkedId == radioButton2.getId()) {
                        message = "RadioButton2がオンです。";
                    } else  if (checkedId == radioButton3.getId()) {
                        message = "RadioButton3がオンです。";
                    }

                    textView.setText(message);
                }
            }
        );

        radioGroup.check(radioButton2.getId());
    }
}
  • トグルボタン

Toast.LENGTH_LONGに間違ってし設定し、表示が変わらない!と思ってしまった。

package com.myexample.chapter8_1_9.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MainActivity extends ActionBarActivity {

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

        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);
        toggleButton.setOnClickListener(
            new CompoundButton.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (toggleButton.isChecked()) {
                        Toast.makeText(
                            getApplicationContext(), "チェックされています。", Toast.LENGTH_SHORT
                        ).show();
                    } else {
                        Toast.makeText(
                            getApplicationContext(), "チェックされていません。", Toast.LENGTH_SHORT
                        ).show();
                    }
                }
            }
        );
    }
}
  • シークバー
package com.myexample.chapter8_1_10.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

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

        final TextView textView = (TextView) findViewById(R.id.textView);
        ((SeekBar) findViewById(R.id.seekBar)).setOnSeekBarChangeListener(
            new SeekBar.OnSeekBarChangeListener() {

                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    textView.setText(String.format("値は「%d」です。", progress));
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                    textView.setText("シークバーがタッチされました。");
                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    textView.setText("シークバーが解放されました。");
                }
            }
        );
    }
}
  • 星の数

見ためがいいね。

package com.myexample.chapter8_1_11.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.RatingBar;
import android.widget.TextView;

import static android.widget.RatingBar.*;

public class MainActivity extends ActionBarActivity {

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

        final TextView textView = (TextView) findViewById(R.id.textView);

        ((RatingBar) findViewById(R.id.ratingBar)).setOnRatingBarChangeListener(
            new OnRatingBarChangeListener() {

                @Override
                public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
                    textView.setText(
                        String.format("☆の数は「%1.1f」です。", rating)
                    );
                }
            }
        );
    }
}

f:id:yossk:20141214214149j:plain

package com.myexample.chapter8_1_12.app;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity
    implements SeekBar.OnSeekBarChangeListener {

    private SeekBar seekBar1, seekBar2, seekBar3;

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

        seekBar1 = (SeekBar) findViewById(R.id.seekBar1);
        seekBar2 = (SeekBar) findViewById(R.id.seekBar2);
        seekBar3 = (SeekBar) findViewById(R.id.seekBar3);

        seekBar1.setOnSeekBarChangeListener(this);
        seekBar2.setOnSeekBarChangeListener(this);
        seekBar3.setOnSeekBarChangeListener(this);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        TextView textView = (TextView) findViewById(R.id.textView);
        ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);

        if (seekBar == seekBar1) {
            progressBar.setProgress(progress);
            textView.setText(String.format("SeekBar 1 = %d", progress));
        } else if (seekBar == seekBar2) {
            progressBar.setProgress(progress);
            textView.setText(String.format("SeekBar 2 = %d", progress));
        } else if (seekBar == seekBar3) {
            progressBar.setProgress(progress);
            textView.setText(String.format("SeekBar 3 = %d", progress));
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
}
  • 3種類のメニュー
  • アクションバーでオプションメニューを表示
  • string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Chapter8_2</string>
    <string name="menu_item1">アイテム1</string>
    <string name="menu_item2">アイテム2</string>
    <string name="menu_item3">アイテム3</string>
    <string name="menu_item4">アイテム4</string>
    <string name="menu_item5">アイテム5</string>
    <string name="menu_item6">アイテム6</string>
</resources>
  • menu_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      tools:context=".MainActivity">

    <item android:id="@+id/item1"
          android:title="@string/menu_item1"
          android:orderInCategory="100"
          app:showAsAction="never"/>
      <item android:id="@+id/item2"
            android:title="@string/menu_item2"
            android:orderInCategory="200"
            app:showAsAction="never"/>
      <item android:id="@+id/item3"
            android:title="@string/menu_item3"
            android:orderInCategory="300"
            app:showAsAction="never"/>
      <item android:id="@+id/item4"
            android:title="@string/menu_item4"
            android:orderInCategory="400"
            app:showAsAction="never"/>
      <item android:id="@+id/item5"
            android:title="@string/menu_item5"
            android:orderInCategory="500"
            app:showAsAction="never"/>
      <item android:id="@+id/item6"
            android:title="@string/menu_item6"
            android:orderInCategory="600"
            app:showAsAction="never"/>
</menu>
package com.myexample.chapter8_2.app;

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

public class MainActivity extends ActionBarActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        TextView textView = (TextView) findViewById(R.id.textView);

        switch (item.getItemId()) {
            case R.id.item1:
                textView.setText(R.string.menu_item1);
                return true;
            case R.id.item2:
                textView.setText(R.string.menu_item2);
                return true;
            case R.id.item3:
                textView.setText(R.string.menu_item3);
                return true;
            case R.id.item4:
                textView.setText(R.string.menu_item4);
                return true;
            case R.id.item5:
                textView.setText(R.string.menu_item5);
                return true;
            case R.id.item6:
                textView.setText(R.string.menu_item6);
                return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
  • イベントリスナーによるメニューの処理

inflate〜の行は置き換え。

package com.myexample.chapter8_2_1_2.app;

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


public class MainActivity extends ActionBarActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        final TextView textView = (TextView) findViewById(R.id.textView);

        getMenuInflater().inflate(R.menu.menu_main, menu);

        MenuItem menuItem1 = menu.findItem(R.id.item1);
        menuItem1.setOnMenuItemClickListener(
            new MenuItem.OnMenuItemClickListener(){

                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    textView.setText("Item1を選択");
                    return true;
                }
            }
        );

        MenuItem menuItem2 = menu.findItem(R.id.item2);
        menuItem2.setOnMenuItemClickListener(
            new MenuItem.OnMenuItemClickListener(){

                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    textView.setText("Item2を選択");
                    return true;
                }
            }
        );

        MenuItem menuItem3 = menu.findItem(R.id.item3);
        menuItem3.setOnMenuItemClickListener(
            new MenuItem.OnMenuItemClickListener(){

                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    textView.setText("Item3を選択");
                    return true;
                }
            }
        );
        return true;
    }
}
  • オプションメニューをJavaで配置
package com.myexample.chapter8_2_1_3.app;

import android.graphics.Color;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
    private TextView textView;

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

        LinearLayout layout = new LinearLayout(this);
        layout.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        setContentView(layout);

        textView = new TextView(this);
        textView.setText("オプションメニューから選択してください");
        textView.setTextColor(Color.BLUE);

        textView.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        layout.addView(textView);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 0, 0, "Monday");
        menu.add(0, 1, 1, "Tuesday");
        menu.add(0, 2, 2, "Wednesday");
        menu.add(0, 3, 3, "Thursday");
        menu.add(0, 4, 4, "Friday");
        menu.add(0, 5, 5, "Saturday");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int groupId = item.getGroupId();
        int itemId = item.getItemId();

        String itemTitle = (String) item.getTitleCondensed();
        textView.setText(
            String.format(
                "'%s' is selected( ID = %d, GroupID = %d ).",
                itemTitle, groupId, itemId
            )
        );
        return super.onOptionsItemSelected(item);
    }
}
  • Javaで作成したオプションメニューにリスナーを埋め込む
package com.myexample.chapter8_2_1_4.app;

import android.graphics.Color;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup.LayoutParams;
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(getApplication());
        linearLayout.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(linearLayout);

        textView = new TextView(getApplication());
        textView.setText("オプションメニューから選択してください");
        textView.setTextColor(Color.BLUE);
        textView.setLayoutParams(
            new LayoutParams(
                LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT
            )
        );
        linearLayout.addView(textView);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuItem item1 = menu.add("Monday");
        item1.setOnMenuItemClickListener(
            new MenuItem.OnMenuItemClickListener() {

                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    textView.setText("Mondayが選択されました");
                    return true;
                }
            }
        );

        MenuItem item2 = menu.add("TuesDay");
        item2.setOnMenuItemClickListener(
            new MenuItem.OnMenuItemClickListener() {

                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    textView.setText("TuesDayが選択されました");
                    return true;
                }
            }
        );

        MenuItem item3 = menu.add("Wednesday");
        item3.setOnMenuItemClickListener(
            new MenuItem.OnMenuItemClickListener() {

                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    textView.setText("Wednesdayが選択されました");
                    return true;
                }
            }
        );

        return true;
    }
}

f:id:yossk:20141214234727j:plain

今日の感想

勉強した記録として書いたソースコードを貼り付けていっているが、失敗かも。
余計な時間を使ってる感が。
また、同じ項目の際は新規にプロジェクト作成するのではなくて、上書き上書きしていかないと、新規プロジェクトからGradleのbuild?か、時間がかかってしかたない。
内容自体は今のところは分かりやすい。