Link
状態:-
閲覧数:1,367
投稿日:2018-04-28
更新日:2018-05-09
P47 画面作成
Translations Editor
・「Android Studio 3.1.2」で「Translations Editor」を表示
▼MainActivity.java
▼L:\Android\AndroidStudioProject\Firsr320180501\app\src\main\res\values\strings.xml
・「Android Studio 3.1.2」で「Translations Editor」を表示
▼MainActivity.java
package work.w4c.android0.firsr320180501; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } |
▼L:\Android\AndroidStudioProject\Firsr320180501\app\src\main\res\values\strings.xml
<resources> <string name= "app_name" >Firsr 3 20180501 </string> <string name= "first" >はじめて</string> </resources> |
P56 ボタンを押した時の処理を記述する
▼work/w4c/android0/firsr320180501/MainActivity.java
▼layout/activity_main.xml
・「Android Studio 3.0.1」でデザインプレビューで表示されるテキストと、エミュレーター(もしくは実機デバッグ)で表示されるテキスト内容が異なる
・Android Studio のデザインプレビューで日本語表示
package work.w4c.android0.firsr320180501; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClickButton(View view) { TextView textView = (TextView)findViewById(R.id.textView); textView.setText( "ボタンがタップされました" ); } } |
▼layout/activity_main.xml
<?xml version= "1.0" encoding= "utf-8" ?> <android.support.constraint.ConstraintLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" tools:context= ".MainActivity" > <TextView android:id= "@+id/textView" android:layout_width= "wrap_content" android:layout_height= "15dp" android:layout_marginTop= "16dp" android:text= "@string/first" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" /> <Button android:id= "@+id/tapHere" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginBottom= "255dp" android:layout_marginTop= "177dp" android:onClick= "onClickButton" android:text= "@string/tap_here" android:textAlignment= "viewStart" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toBottomOf= "@+id/textView" /> </android.support.constraint.ConstraintLayout> |
・「Android Studio 3.0.1」でデザインプレビューで表示されるテキストと、エミュレーター(もしくは実機デバッグ)で表示されるテキスト内容が異なる
・Android Studio のデザインプレビューで日本語表示
P58 イベント処理をすべて記述する
コード
▼MainActivity.java
package work.w4c.android0.first220180504; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button tapHere = (Button)findViewById(R.id.tapHere); tapHere.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { TextView textView = (TextView)findViewById(R.id.textView); textView.setText( "ボタンがタップされました" ); } }); } // public void onClickButton(View view) { // TextView textView = (TextView)findViewById(R.id.textView); // textView.setText("ボタンがタップされました"); // } } |
▼layout/activity_main.xml
<?xml version= "1.0" encoding= "utf-8" ?> <android.support.constraint.ConstraintLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" tools:context= ".MainActivity" > <TextView android:id= "@+id/textView" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_marginTop= "16dp" android:text= "@string/first" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintHorizontal_bias= "0.5" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" /> <Button android:id= "@+id/tapHere" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "@string/tap_here" app:layout_constraintBottom_toBottomOf= "parent" app:layout_constraintEnd_toEndOf= "parent" app:layout_constraintStart_toStartOf= "parent" app:layout_constraintTop_toTopOf= "parent" /> </android.support.constraint.ConstraintLayout> |
P70 じゃんけんアプリ
アプリ構成
画面が2つ
・プレイヤーの手を選択する画面
・じゃんけんの結果を表示する画面
→ アクティビティも2つ作成する必要がある
▼/janken/MainActivity.java
package work.w4c.android0.janken; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onJankenButtonTapped(View view) { Intent intent = new Intent( this , ResultActivity. class ); intent.putExtra( "MY_HAND" , view.getId()); startActivity(intent); } } |
▼/janken/ResultActivity.java
package work.w4c.android0.janken; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class ResultActivity extends AppCompatActivity { final int JANKEN_GU = 0 ; final int JANKEN_CHOKI = 1 ; final int JANKEN_PA = 2 ; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_result); int myHand = 0 ; Intent intent = getIntent(); int id = intent.getIntExtra( "MY_HAND" , 0 ); ImageView myHandImageView =(ImageView) findViewById(R.id.my_hand_image); switch (id) { case R.id.gu: myHandImageView.setImageResource(R.drawable.gu); myHand = JANKEN_GU; break ; case R.id.choki: myHandImageView.setImageResource(R.drawable.choki); myHand = JANKEN_CHOKI; break ; case R.id.pa: myHandImageView.setImageResource(R.drawable.pa); myHand = JANKEN_PA; break ; default : myHand = JANKEN_GU; break ; } // コンピュータの手を決める int comHand = ( int )(Math.random()* 3 ); //int comHand = getHand(); ImageView comHandImageView = (ImageView) findViewById(R.id.com_hand_image); switch (comHand) { case JANKEN_GU: comHandImageView.setImageResource(R.drawable.com_gu); break ; case JANKEN_CHOKI: comHandImageView.setImageResource(R.drawable.com_choki); break ; case JANKEN_PA: comHandImageView.setImageResource(R.drawable.com_pa); break ; } // 勝敗を判定する TextView resultLabel = (TextView) findViewById(R.id.result_label); int gameResult = (comHand - myHand + 3 ) % 3 ; switch (gameResult) { case 0 : // あいこの場合 resultLabel.setText(R.string.result_draw); break ; case 1 : // 勝った場合 resultLabel.setText(R.string.result_win); break ; case 2 : // 負けた場合 resultLabel.setText(R.string.result_lose); break ; } } public void onBackButtonTapped(View view) { finish(); } } |
・「Android Studio 3.1.2」で「Propertiesペイン」が表示されない
・イメージボタンとメソッドを紐付けられない
共有プリファレンス
Mapインターフェイスのように「キーと値のペア」でデータを保存する設定ファイル
・アプリケーション設定を保存するような、少量のデータ保存に使用
▼/janken/MainActivity.java
package work.w4c.android0.janken; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 起動時にデータをクリアする SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( this ); SharedPreferences.Editor editor = pref.edit(); editor.clear(); editor.commit(); } public void onJankenButtonTapped(View view) { Intent intent = new Intent( this , ResultActivity. class ); intent.putExtra( "MY_HAND" , view.getId()); startActivity(intent); } } |
▼/janken/ResultActivity.java
package work.w4c.android0.janken; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class ResultActivity extends AppCompatActivity { final int JANKEN_GU = 0 ; final int JANKEN_CHOKI = 1 ; final int JANKEN_PA = 2 ; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_result); int myHand = 0 ; Intent intent = getIntent(); int id = intent.getIntExtra( "MY_HAND" , 0 ); ImageView myHandImageView =(ImageView) findViewById(R.id.my_hand_image); switch (id) { case R.id.gu: myHandImageView.setImageResource(R.drawable.gu); myHand = JANKEN_GU; break ; case R.id.choki: myHandImageView.setImageResource(R.drawable.choki); myHand = JANKEN_CHOKI; break ; case R.id.pa: myHandImageView.setImageResource(R.drawable.pa); myHand = JANKEN_PA; break ; default : myHand = JANKEN_GU; break ; } // コンピュータの手を決める //int comHand = (int)(Math.random()*3); int comHand = getHand(); ImageView comHandImageView = (ImageView) findViewById(R.id.com_hand_image); switch (comHand) { case JANKEN_GU: comHandImageView.setImageResource(R.drawable.com_gu); break ; case JANKEN_CHOKI: comHandImageView.setImageResource(R.drawable.com_choki); break ; case JANKEN_PA: comHandImageView.setImageResource(R.drawable.com_pa); break ; } // 勝敗を判定する TextView resultLabel = (TextView) findViewById(R.id.result_label); int gameResult = (comHand - myHand + 3 ) % 3 ; switch (gameResult) { case 0 : // あいこの場合 resultLabel.setText(R.string.result_draw); break ; case 1 : // 勝った場合 resultLabel.setText(R.string.result_win); break ; case 2 : // 負けた場合 resultLabel.setText(R.string.result_lose); break ; } // じゃんけんの結果を保存する saveData(myHand, comHand, gameResult); } public void onBackButtonTapped(View view) { finish(); } private void saveData( int myHand, int comHand, int gameResult) { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( this ); SharedPreferences.Editor editor = pref.edit(); int gameCount = pref.getInt( "GAME_COUNT" , 0 ); int winningStreakCount = pref.getInt( "WINNING_STREAK_COUNT" , 0 ); int lastComHand = pref.getInt( "LAST_COM_HAND" , 0 ); int lastGameResult = pref.getInt( "GAME_RESULT" , - 1 ); editor.putInt( "GAME_COUNT" , gameCount + 1 ); if (lastGameResult == 2 && gameResult == 2 ) { // コンピュータが連勝した場合 editor.putInt( "WINNING_STREAK_COUNT" , winningStreakCount + 1 ); } else { editor.putInt( "WINNING_STREAK_COUNT" , 0 ); } editor.putInt( "LAST_MY_HAND" , myHand); editor.putInt( "LAST_COM_HAND" , comHand); editor.putInt( "BEFORE_LAST_COM_HAND" , lastComHand); editor.putInt( "GAME_RESULT" , gameResult); editor.commit(); } private int getHand() { int hand = ( int ) (Math.random() * 3 ); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( this ); int gameCount = pref.getInt( "GAME_COUNT" , 0 ); int winningStreakCount = pref.getInt( "WINNING_STREAK_COUNT" , 0 ); int lastMyHand = pref.getInt( "LAST_MY_HAND" , 0 ); int lastComHand = pref.getInt( "LAST_COM_HAND" , 0 ); int beforeLastComHand = pref.getInt( "BEFORE_LAST_COM_HAND" , 0 ); int gameResult = pref.getInt( "GAME_RESULT" , - 1 ); if (gameCount == 1 ) { if (gameResult == 2 ) { // 前回の勝負が1回目で、コンピュータが勝った場合、 // コンピュータは次に出す手を変える while (lastComHand == hand) { hand = ( int ) (Math.random() * 3 ); } } else if (gameResult == 1 ) { // 前回の勝負が1回目で、コンピュータが負けた場合 // 相手の出した手に勝つ手を出す hand = (lastMyHand - 1 + 3 ) % 3 ; } } else if (winningStreakCount > 0 ) { if (beforeLastComHand == lastComHand) { // 同じ手で連勝した場合は手を変える while (lastComHand == hand) { hand = ( int ) (Math.random() * 3 ); } } } return hand; } } |
P101 体型記録アプリ
ic_mysize.xml
ベクタ形式の画像
・「点と点の座標」および「それを結ぶ線または面の情報」で図形を表現したグラフィック
・「書籍掲載内容」と「サンプルコード内容」が若干異なる
・Android Studio 3.1.2 で、パレットの「Widgets」内にSpinnerが表示されない
▼com/example/username/mysize/MainActivity.java
package com.example.username.mysize; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private static final String NECK = "NECK" ; private static final String SLEEVE = "SLEEVE" ; private static final String WAIST = "WAIST" ; private static final String INSEAM = "INSEAM" ; private EditText editNeck; private EditText editSleeve; private EditText editWaist; private EditText editInseam; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( this ); String neck = pref.getString(NECK, "" ); String sleeve = pref.getString(SLEEVE, "" ); String waist = pref.getString(WAIST, "" ); String inseam = pref.getString(INSEAM, "" ); editNeck = (EditText) findViewById(R.id.neck); editSleeve = (EditText) findViewById(R.id.sleeve); editWaist = (EditText) findViewById(R.id.waist); editInseam = (EditText) findViewById(R.id.inseam); editNeck.setText(neck); editSleeve.setText(sleeve); editWaist.setText(waist); editInseam.setText(inseam); findViewById(R.id.save).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { saveData(); } }); findViewById(R.id.height_button) .setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity. this , HeightActivity. class ); startActivity(intent); } }); } private void saveData() { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( this ); SharedPreferences.Editor editor = pref.edit(); editor.putString(NECK, editNeck.getText().toString()); editor.putString(SLEEVE, editSleeve.getText().toString()); editor.putString(WAIST, editWaist.getText().toString()); editor.putString(INSEAM, editInseam.getText().toString()); editor.commit(); } } |
▼com/example/username/mysize/HeightActivity.java
package com.example.username.mysize; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.AdapterView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.SeekBar; import android.widget.Spinner; import android.widget.TextView; public class HeightActivity extends AppCompatActivity { public static final String HEIGHT = "HEIGHT" ; private TextView mHeight; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_height); mHeight = (TextView) findViewById(R.id.height); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( this ); int height = pref.getInt(HEIGHT, 160 ); mHeight.setText(String.valueOf(height)); /// スピナーの処理 Spinner spinner = (Spinner) findViewById(R.id.spinner); spinner.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { // 一覧から1つを選んだ時の処理 @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 選ばれた項目を取得してTextViewに表示 Spinner spinner = (Spinner) parent; String item = (String) spinner.getSelectedItem(); if (!item.isEmpty()) { mHeight.setText(item); } } // 一覧で何も選択されなかった時の処理 @Override public void onNothingSelected(AdapterView<?> parent) { } }); /// シークバーの処理 SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar); seekBar.setProgress(height); seekBar.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener() { // シークバーの値が変更された @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 変更された値をintから文字列に変換してTextViewに表示 String value = String.valueOf(progress); mHeight.setText(value); } // シークバーのスライド開始 @Override public void onStartTrackingTouch(SeekBar seekBar) { } // シークバーのスライド終了 @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); /// ラジオボタンの処理 RadioGroup radio = (RadioGroup) findViewById(R.id.radioGroup); radio.setOnCheckedChangeListener( new RadioGroup.OnCheckedChangeListener() { // ラジオグループのチェック状態が変更された時に呼び出されます @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // 選択されたラジオボタンのリソースIDより、ラジオボタンを取得する RadioButton radioButton = (RadioButton) findViewById(checkedId); String value = radioButton.getText().toString(); mHeight.setText(value); } }); } @Override protected void onPause() { super .onPause(); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences( this ); SharedPreferences.Editor editor = pref.edit(); editor.putInt(HEIGHT, Integer.parseInt(mHeight.getText().toString())); editor.commit(); } } |
P133 加速度センサーで玉ころがしアプリ
P140 センサーの値をデバッグ出力する
センサーの値が更新された時に呼ばれる「onSensorChangedメソッド」を実装
・onSensorChanged(SensorEvent event)メソッド
▼L:\Android\AndroidStudioProject\FirstTimeAndroid\06\AccBall\app\src\main\java\work\w4c\android0\accball\MainActivity.java
package work.w4c.android0.accball; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.SurfaceHolder; public class MainActivity extends AppCompatActivity implements SensorEventListener, SurfaceHolder.Callback { SensorManager mSensorManager; Sensor mAccSensor; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } @Override public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { //SensorクラスのgetTypeメソッドを使って、送られてきた値が加速度センサーのものかどうかをチェックしている //加速度センサーであれば、event.values配列からx軸、y軸、z軸それぞれの値を取得し、Logクラスのdメソッドでデバッグログを出力している Log.d( "MainActivity" , "x=" + String.valueOf(event.values[ 0 ]) + "y=" + String.valueOf(event.values[ 1 ]) + "z=" + String.valueOf(event.values[ 2 ])); } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override protected void onResume() { super .onResume(); mSensorManager.registerListener( this ,mAccSensor,SensorManager.SENSOR_DELAY_GAME); } @Override protected void onPause() { super .onPause(); mSensorManager.unregisterListener( this ); } @Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } } |