Android アプリ開発「MATRIX」

Androidアプリの開発に役立つサンプル集


画面の回転(縦位置 ⇔ 横位置)に対応する方法

画面の回転に対応する方法

アンドロイドアプリは画面を回転(横位置 ⇔ 縦位置)させると、自動でアクティビティが再起動される仕組み(仕様)になっているため、変数のデータも破棄されてしまいます。

そのため、画面の回転に対応するには、回転の直前に呼び出される「onSaveInstanceState」メソッド内でデータを一旦保存し、次に画面の回転が完了すると呼び出される「onRestoreInstanceState」メソッド、または「onCreate」メソッドの中で、画面回転前に保存したデータを読み込み再び画面上にセットするという処理が必要になります。

アプリの縦横回転対応

サンプルコード①(MainActivity.java

今回のサンプルでは1秒間隔でカウントをアップして画面に表示します。サンプルコードの詳しい説明はコード内のコメントを参照してください。

public class MainActivity extends AppCompatActivity {

private Timer timer1; //タイマーオブジェクト
private Handler handler1; //ハンドラーオブジェクト
private TextView textView; //テキストビューオブジェクト
private int counter; //カウンター変数

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

//レイアウトファイルをビューにセット
setContentView(R.layout.activity_main);

//レイアウトファイルのテキストビューを取得
textView = (TextView)findViewById(R.id.counter);
//タイマーをインスタンス
timer1 = new Timer();
//ハンドラーをインスタンス
handler1 = new Handler();
//カウントアップ用変数を初期化
counter = 0;

//タイマーを生成+スケジュールを実行
timer1.schedule(new TimerTask() {
@Override
public void run() {
//ハンドラー経由で画面を更新 ※直接更新するとエラーになる
handler1.post(new Runnable() {
@Override
public void run() {
//カウントアップ
counter += 1;
//テキストビューにカウント値をセット
textView.setText(String.valueOf(counter));
}
});
}
}, 1000, 1000); //1秒後から1秒間隔で実行
}

//画面の回転時に呼び出される(データを保存する)
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);

//保存領域に「CONTENT_VALUE」というキーの数値を保存
outState.putInt("COUNT_VALUE", counter);
}

//アクティビティが再起動するときに呼び出される(データ読み出し)
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);

//保存領域から「CONTENT_VALUE」というキーの数値を取得
counter = savedInstanceState.getInt("COUNT_VALUE");
//レイアウトファイルのテキストビューにセット
textView.setText(String.valueOf(counter));
}
}

サンプルコード②(AndroidManifest.xml

今回はマニフェストファイルへの記述はありません。

サンプルコード③(activity_main.xml

レイアウトファイルは画面の中央に大きめの TextView を配置しただけの簡単なものです。

<TextView
android:id="@+id/counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="100sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

実行結果

① 起動するとカウントアップ(1秒間隔)が始まります。

アンドロイド開発「画面回転対応」① 

② 画面の回転に対応しているので、端末を横位置にしてアプリが再起動してもカウント用の変数は保持されカウントが継続されます。

アンドロイド開発「画面回転対応」④

<画面の回転に対応していない場合>

端末を横位置にするとアクティビティの再起動と同時にカウント用の変数もクリアーされ「0」からの再スタートになってしまいます。

f:id:vw-dsg:20190119084621j:plain

備考・その他

他に、画面の回転に対応する方法として「マニフェストファイルに記述する属性で画面が回転してもアクティビティを再起動させないようにする(android:configChanges="orientation")」というのがありますが、この方法はアンドロイドの公式開発サイトで「この属性の使用はなるべく避けて、あくまで最後の手段として使用する必要がある」とされているため、少々手間がかかりますが今回紹介した方法を利用した方が良いでしょう。

END