使用ツール
Android Studio Flamingo | 2022.2.1 Patch 2
1. 通常のプロジェクトを作成する。
ここではスワイプ (画面をなぞる) で画面を切り替えるので、画面の存在するプロジェクトを作成する。
「Empty Activity」「Empty Views Activity」等のプロジェクトが対象。
「No Activity」でも構わないが、Default Activity の追加が必要になるので、ここでは割愛する。(選択しない)
2. 画面を用意
2-1. メイン画面 (activity_main.xml) を変更する。
2-1-1. デフォルトで作成される TextView ("Hello World!") を削除する。2-2. Fragment を作成する。
2-1-2. ViewPager2 を設置する。
デザイン画面で Palette - Containers から ViewPager2 を activity_main にドラッグする。
項目 内容 備考 id ViewPager2 プログラムから R.id.ViewPager2 として参照される。 layout_width match_parent 画面いっぱいに広げる。
(分かってる人は広げなくてもいい)layout_height match_parent
サンプルとして、同じものを 3 つ作成する。(3 ペア = 6 ファイル)2-3. Fragment 画面のテキストの ID 付与とテキストの書き換え。
2-2-1. Fragment (ソース、レイアウトのペア) を作成する。
2-2-1-1. Fragment_0.java を作成する。2-2-2. 上記 2-2-1 を繰り返して 3 つのペア (ファイル数は 6) を作成する。
MainActivity.java を右クリックし New - Fragment - Fragment (Blank) を選択する。2-2-1-2. fragment_0.xml を確認する。
項目 内容 備考 Fragment Name Fragment_0 Fragment_0 ~ 2 とする。 Fragment Layout Name fragment_0 自動入力されるので記入しない。 Source Language デフォルトのままとする。
上記 2-2-1-1 の作業により、自動的にフラグメント画面が作成されるので、これを確認する。
パス レイアウトファイル 備考 app > res > layout > fragment_0.xml fragment_0 ~ 2.xml となる。
Java ソースファイル名 レイアウトファイル名 (自動生成) Fragment_0.java fragment_0.xml Fragment_1.java fragment_1.xml Fragment_2.java fragment_2.xml
上記 2-2 で作成したレイアウトファイルを編集し、自動的に作成された TextView へ ID 付与との表示文字列の変更を行う。
パス レイアウトファイル ID TextView の内容 備考 app > res > layout > fragment_0.xml tvFragment0 Fragment 0 ID はプログラムから R.id.tvFragmentN として参照される。
内容については、画面が判別できる文字列なら何を設定しても良い。
(下記 5 を実施するなら内容を変更しなくても良い)fragment_1.xml tvFragment1 Fragment 1 fragment_2.xml tvFragment2 Fragment 2
3. フラグメントのアダプタを作成
FragmentStateAdapter の派生クラスを作成する。
3-1. ソースファイルを作成する。
MainActivity.java を右クリックし、New - Java Class を選択する。3-2. ソースファイルを編集する。
項目 内容 備考 Name FragmentSlideAdapter FragmentSlideAdapter.java (下記 3-2 の枠組みだけ) が生成される。
FragmentSlideAdapter.java
public class FragmentSlideAdapter { }
↓↓ 大量に行を追加 ↓↓
public class FragmentSlideAdapter extends FragmentStateAdapter { private static final int FRAGMENT_MAX = 3; private final Fragment[] fragments; private final String[] messages; public FragmentSlideAdapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); fragments = new Fragment[]{ new Fragment_0(), new Fragment_1(), new Fragment_2(), }; messages = new String[]{ // Fragment_0~2 へ渡すデータ null, null, null, }; } @NonNull @Override public Fragment createFragment(int position) { if(position == 0) { // Fragment_0 へ文字列を渡す // キー "param1" は Fragment_0.java で定義された ARG_PARAM1 の値を使っている Bundle bundle = new Bundle(); bundle.putString("param1", messages[0]); fragments[position].setArguments(bundle); } return fragments[position]; } @Override public int getItemCount() { return FRAGMENT_MAX; } // MainActivity から文字列を受け取る public void setString(int position, String string) { messages[position] = string; } }
4. MainActivity.java を編集
MainActivity.java
*1フラグメントの内容を一度に入れ替えるときに使う。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
// FragmentSlideAdapter を確保 FragmentSlideAdapter fragmentSlideAdapter; fragmentSlideAdapter = new FragmentSlideAdapter(this); // MainActivity の ViewPager2 に fragmentSlideAdapter を割り当てる ViewPager2 viewPager2 = findViewById(R.id.ViewPager2); viewPager2.setAdapter(fragmentSlideAdapter); // fragmentSlideAdapter を経由して Fragment_0 へ文字列を渡す fragmentSlideAdapter.setString(0, "Hello Fragment 0");
// フラグメントの再構築はこちら*1 (FragmentSlideAdapter のインスタンスを開放して再登録) viewPager2.setAdapter(null); fragmentSlideAdapter = new FragmentSlideAdapter(this); viewPager2.setAdapter(fragmentSlideAdapter); fragmentSlideAdapter.setString(0, "Hello Fragment 0");
} }
5. Fragment の部品を操作
5-1. Fragment_0.java を編集する。
フラグメントのソースファイルにメソッド onStart() または onResume() を追加する。5-2. Fragment_1~2 を編集する。
また、追加したメソッドから部品を操作できるよう、onCreateView() に細工を施す。
(onCreateView() を修正したくない場合は onStart() の中で getView() を呼び出しても良い)
Fragment_0.java
public static final String ARG_PARAM1 = "param1";
public class Fragment_0 extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; public Fragment_0() { // Required empty public constructor } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment Fragment_0. */ // TODO: Rename and change types and number of parameters public static Fragment_0 newInstance(String param1, String param2) { Fragment_0 fragment = new Fragment_0(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_0, container, false); return view;
}
View view; @Override public void onStart() { // onResume() でも可 super.onStart(); if(mParam1 != null) { // FragmentSlideAdapter から受け取った文字列を表示する // view の代わりに getView() でも可 TextView tvFragment0 = view.findViewById(R.id.tvFragment0); tvFragment0.setText(mParam1); } }
}
に変更すると便利なんだけど、説明の趣旨から外れるので今回はやっていません。
必要であれば、上記 5-1 と同様に、
Fragment_1.java (2 ページ目) Fragment_2.java (3 ページ目) も編集する。