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() ) ); } }
書籍には
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で指定したものとはレイアウトやカラーリングが違うなぁ。
- ラジオボタン
- RadioGroupでまとめる
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) ); } } ); } }
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; } }
今日の感想
勉強した記録として書いたソースコードを貼り付けていっているが、失敗かも。
余計な時間を使ってる感が。
また、同じ項目の際は新規にプロジェクト作成するのではなくて、上書き上書きしていかないと、新規プロジェクトからGradleのbuild?か、時間がかかってしかたない。
内容自体は今のところは分かりやすい。