はじめに
フラグメントでの戻るボタンの設置において、
親Activity内で定義して呼び出す書き方にしていたのですが、
Activityに置かずに各Fragmentから直接中身を呼び出すほうがいい
と、ベテランエンジニアから指摘をいただいたので備忘録として両パターン残しておきます。
①MainActivityから呼び出す方法
public class MainActivity extends AppCompatActivity {
// 戻るボタンを定義
public void setupBackButton(boolean enableBackButton) {
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(enableBackButton);
}
}
// onCreateView内で呼び出す
MainActivity activity = (MainActivity) getActivity();
activity.setupBackButton(true);
setHasOptionsMenu(true); // FragmentでActionBarを使うために必要な設定
// onCreateView内で呼び出す
MainActivity activity = (MainActivity) getActivity();
activity.setupBackButton(false);
②Fragmentから直接呼び出す方法
// onCreateView内で呼び出す
.setupBackButton()
setHasOptionsMenu(true); // FragmentでActionBarを使うために必要な設定
// Fragmentクラス内で定義
public void setupBackButton() {
AppCompatActivity activity = (AppCompatActivity) getActivity();
ActionBar actionBar = activity.getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
※下記はFragment1から遷移したときに戻るボタンが表示されてしまうのを防ぐために記載してます。
必要可否は各自判断してください。
// onCreateView内で呼び出す
.hideBackButton()
// Fragmentクラス内で定義
public void hideBackButton() {
AppCompatActivity activity = (AppCompatActivity) getActivity();
ActionBar actionBar = activity.getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(false);
}
違い
ぱっと見た感じ同じですが、Activityの取得先が違います!
①MainActivity activity = (MainActivity) getActivity();
②AppCompatActivity activity = (AppCompatActivity) getActivity();
特定のActivity(今回だとMainActivity)が前提の書き方はやめたほうがいいとのことです。
前提となるクラス(自分で定義したクラス)が増えるほどコードは安全な変更がしづらくなるからです。
取得先がAppCompatActivityであれば継承元なので変更されることはほぼないし安全性が高いということでしょうかね。
先を見据えた実装ができる強強エンジニアになりたいです。