■ なぜFragmentが必要なのか?
最初に疑問に思うのは、「Activityだけじゃダメなの?」という点だと思います。
結論から言うと、UIの再利用性や柔軟なレイアウト対応を考えると、Fragment
は非常に便利です。
▽ たとえばこんな場面:
- スマホでは1画面に1つの情報、タブレットでは複数表示したい
- 複数の画面で同じUI部品(地図やフォームなど)を使い回したい
- 一部の画面だけ切り替えたい(画面全体ではなく一部だけ)
これらに対応するために、画面内に埋め込むことができる“ミニActivity”的なもの=Fragmentが導入されました。
■ Fragmentとは?
Fragment
は「UI + ロジックのかたまり」で、Activityの中に組み込んで使うことを前提に設計されたクラスです。
- 自分自身でライフサイクル(onCreate, onStartなど)を持つ
- 独自のレイアウトファイルを持てる
- Activityと連携して動作する
簡単に言えば、**“Activityの中に入れられる部品化された画面”**です。
■ 基本的な使い方の流れ
1. Fragment クラスを作る
public class SampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_sample, container, false);
}
}
ここで fragment_sample.xml
は、この Fragment 専用のレイアウトファイルです。
2. Activity に Fragment を埋め込む
方法①:XML にあらかじめ定義
<!-- activity_main.xml -->
<fragment
android:name="com.example.SampleFragment"
android:id="@+id/sampleFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
方法②:コードで動的に追加
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
SampleFragment fragment = new SampleFragment();
transaction.add(R.id.fragment_container, fragment);
transaction.commit();
こちらの方法は柔軟に切り替えたり、複数のFragmentを使い分けるのに適しています。
■ ActivityとFragmentの連携(データのやりとり)
▽ Activity → Fragment にデータを渡す
Bundle bundle = new Bundle();
bundle.putString("message", "こんにちは!");
SampleFragment fragment = new SampleFragment();
fragment.setArguments(bundle);
// Fragment 側で受け取る
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
String msg = args.getString("message");
}
}
▽ Fragment → Activity にイベントを伝える
Activity にインターフェースを定義してコールバックする方法が定番です。
// Fragment 側で定義
public interface OnFragmentInteractionListener {
void onButtonClicked();
}
// Activity に実装させる
public class MainActivity extends AppCompatActivity implements OnFragmentInteractionListener {
@Override
public void onButtonClicked() {
Log.d("MainActivity", "Fragmentのボタンが押された!");
}
}
Fragment 側でこのリスナーを呼び出すことで、Activity に通知できます。
■ ライフサイクルの違いにも注意!
Fragment も Activity と同じようなライフサイクルメソッドを持っていますが、Activity に依存しているため、呼ばれるタイミングには違いがあります。
Activity | Fragment |
---|---|
onCreate() | onAttach() → onCreate() |
onStart() | onCreateView() → onStart() |
onDestroy() | onDestroyView() → onDetach() |
画面の再表示や切り替え時に、Fragmentが「ビューの生成・破棄」を頻繁に繰り返す点に注意です。
■ まとめ
特徴 | 内容 |
---|---|
Fragmentとは | Activityの中で使える再利用可能なUIパーツ |
メリット | UIの部品化、タブレット対応、柔軟な切り替え |
連携方法 | Bundleで渡す/コールバックで通知する |
注意点 | ライフサイクルのタイミングに慣れる必要あり |
Fragmentは最初は少し複雑に見えますが、「ActivityとUIを分離することで部品化する」という目的が分かると、非常に強力な道具になります。