はじめてのAndroidプログラミング 改訂版

書籍はじめてのAndroidプログラミング 改訂版

Link

 状態:-  閲覧数:1,190  投稿日:2018-04-28  更新日:2018-05-09

P47 画面作成

 閲覧数:270 投稿日:2018-05-01 更新日:2018-05-15
Translations Editor
「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 ボタンを押した時の処理を記述する

 閲覧数:277 投稿日:2018-05-03 更新日:2018-05-04
▼work/w4c/android0/firsr320180501/MainActivity.java
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 イベント処理をすべて記述する

 閲覧数:277 投稿日:2018-05-07 更新日:2018-05-07

コード


▼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 じゃんけんアプリ

 閲覧数:290 投稿日:2018-05-09 更新日:2018-05-20

アプリ構成


画面が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 体型記録アプリ

 閲覧数:384 投稿日:2018-05-21 更新日:2018-06-12

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 加速度センサーで玉ころがしアプリ

 閲覧数:355 投稿日:2018-06-13 更新日:2018-08-13

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) {

   }
}





週間人気ページランキング / 4-29 → 5-5
順位 ページタイトル抜粋 アクセス数
アクセスが、ありませんでした! 0
2024/5/6 1:01 更新