Link
状態:-
閲覧数:1,303
投稿日: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"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
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"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
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) {
}
}