前提
先ほど以下のURLの質問をしたものです。
https://teratail.com/questions/5ljzf8nuh7x07v#reply-a2lvevxofy062w
画面遷移を行うプログラムにおいて、明らかに分からない点がありましたので質問させてください。
自分の作成しているプログラムはandroidにおいてタブをフッダーにして操作するものです。しかし先ほどのやり方でした場合、遷移までは成功したのですが、Page1Fragmentの中の内容が処理するごとに増えていき、画面が多くなるにつれて見にくいコードになってしまいます。それを防ぐためにクラスを分けたいです(可読性を上げるため)。
しかしクラスの数は増やしたくありません。1画面1つに抑えたいです(沢山画面を作る予定のため)
実現したいこと
常にタブを表示させる。
該当のソースコード
java(MainActivity.java)
1import androidx.annotation.NonNull; 2import androidx.appcompat.app.AppCompatActivity; 3import androidx.fragment.app.*; 4import androidx.viewpager2.adapter.FragmentStateAdapter; 5import androidx.viewpager2.widget.ViewPager2; 6 7import android.os.Bundle; 8 9import com.google.android.material.tabs.TabLayout; 10import com.google.android.material.tabs.TabLayoutMediator; 11 12public class MainActivity extends AppCompatActivity { 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 18 ViewPager2 pager = findViewById(R.id.pager); 19 TabLayout tabs = findViewById(R.id.tab); 20 21 String[] hposition = {"てすと1","てすと2"}; 22 pager.setAdapter(new PageAdapter(this)); 23 new TabLayoutMediator(tabs, pager, (tab, position) -> tab.setText(hposition[position])).attach(); 24 } 25 26 private static class PageAdapter extends FragmentStateAdapter { 27 public PageAdapter(FragmentActivity activity) { 28 super(activity); 29 } 30 31 @NonNull 32 @Override 33 public Fragment createFragment(int position) { 34 Fragment fragment = null; 35 if (position == 0) { 36 fragment = new Page1Fragment(R.layout.activity_page1_fragment); 37 } else if (position == 1) { 38 fragment = new Page2Fragment(); 39 } 40 return fragment; 41 } 42 43 @Override 44 public int getItemCount() { 45 return 2; 46 } 47 } 48}
java(Page1Fragment.java)
1import androidx.annotation.NonNull; 2import androidx.annotation.Nullable; 3import androidx.appcompat.app.AppCompatActivity; 4import androidx.fragment.app.Fragment; 5 6import android.content.Intent; 7import android.os.Bundle; 8import android.view.View; 9import android.widget.Button; 10 11public class Page1Fragment extends Fragment { 12 13 public Page1Fragment(int layout) { 14 super(layout); 15 } 16 17 @Override 18 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 19 super.onViewCreated(view, savedInstanceState); 20 21 Button button1 = view.findViewById(R.id.button1); 22 if(button1 != null){ 23 button1.setOnClickListener(v -> { 24 startActivity(new Intent(getActivity(), SampleActivity.class)); 25 }); 26 } 27 28 Button back = view.findViewById(R.id.back); 29 if(back != null){ 30 back.setOnClickListener(v -> { 31 getActivity().finish(); 32 }); 33 } 34 } 35}
java(Page2Fragment.java)
1import androidx.annotation.NonNull; 2import androidx.annotation.Nullable; 3import androidx.appcompat.app.AppCompatActivity; 4import androidx.fragment.app.Fragment; 5 6import android.content.Intent; 7import android.os.Bundle; 8import android.view.View; 9import android.widget.Button; 10 11public class Page2Fragment extends Fragment { 12 public Page2Fragment() { 13 super(R.layout.activity_page2_fragment); 14 } 15 16 @Override 17 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 18 super.onViewCreated(view, savedInstanceState); 19 20 Button button2 = view.findViewById(R.id.button2); 21 button2.setOnClickListener(v -> { 22 startActivity(new Intent(getActivity(), SampleActivity.class)); 23 }); 24 } 25}
java(SampleActivity.java)
1import androidx.annotation.NonNull; 2import androidx.appcompat.app.AppCompatActivity; 3import androidx.fragment.app.Fragment; 4import androidx.fragment.app.FragmentActivity; 5import androidx.viewpager2.adapter.FragmentStateAdapter; 6import androidx.viewpager2.widget.ViewPager2; 7 8import android.os.Bundle; 9 10import com.google.android.material.tabs.TabLayout; 11import com.google.android.material.tabs.TabLayoutMediator; 12 13public class SampleActivity extends AppCompatActivity { 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 20 ViewPager2 pager = findViewById(R.id.pager); 21 TabLayout tabs = findViewById(R.id.tab); 22 23 String[] hposition = {"てすと1","てすと2"}; 24 pager.setAdapter(new PageAdapter(this)); 25 new TabLayoutMediator(tabs, pager, (tab, position) -> tab.setText(hposition[position])).attach(); 26 } 27 28 private static class PageAdapter extends FragmentStateAdapter { 29 public PageAdapter(FragmentActivity activity) { 30 super(activity); 31 } 32 33 @NonNull 34 @Override 35 public Fragment createFragment(int position) { 36 Fragment fragment = null; 37 if (position == 0) { 38 fragment = new Page1Fragment(R.layout.activity_sample); 39 } else if (position == 1) { 40 fragment = new Page2Fragment(); 41 } 42 return fragment; 43 } 44 45 @Override 46 public int getItemCount() { 47 return 2; 48 } 49 } 50}
xml(activity_main.xml)
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 android:gravity="center" 9 android:orientation="vertical" 10 android:padding="20dp" 11 tools:context=".MainActivity"> 12 13 <androidx.viewpager2.widget.ViewPager2 14 android:id="@+id/pager" 15 android:layout_width="0dp" 16 android:layout_height="0dp" 17 android:layout_weight="1" 18 app:layout_constraintBottom_toTopOf="@+id/tab" 19 app:layout_constraintEnd_toEndOf="parent" 20 app:layout_constraintStart_toStartOf="parent" 21 app:layout_constraintTop_toTopOf="parent" /> 22 23 <com.google.android.material.tabs.TabLayout 24 android:id="@+id/tab" 25 android:layout_width="match_parent" 26 android:layout_height="0dp" 27 app:layout_constraintBottom_toBottomOf="parent" 28 app:layout_constraintEnd_toEndOf="parent" 29 app:layout_constraintStart_toStartOf="parent" 30 app:tabSelectedTextColor="@color/teal_200" /> 31</androidx.constraintlayout.widget.ConstraintLayout>
xml(activity_page1_fragment.xml)
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".Page1Fragment"> 8 9 10 <Button 11 android:id="@+id/button1" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="ボタン1" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintEnd_toEndOf="parent" 17 app:layout_constraintStart_toStartOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19</androidx.constraintlayout.widget.ConstraintLayout>
xml(activity_page2_fragment.xml)
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".Page2Fragment"> 8 9 <Button 10 android:id="@+id/button2" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:text="ボタン2" 14 app:layout_constraintBottom_toBottomOf="parent" 15 app:layout_constraintEnd_toEndOf="parent" 16 app:layout_constraintStart_toStartOf="parent" 17 app:layout_constraintTop_toTopOf="parent" /> 18</androidx.constraintlayout.widget.ConstraintLayout>
xml(activity_sample.xml)
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".SampleActivity"> 8 9 <Button 10 android:id="@+id/back" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:text="戻る" 14 app:layout_constraintBottom_toBottomOf="parent" 15 app:layout_constraintEnd_toEndOf="parent" 16 app:layout_constraintStart_toStartOf="parent" 17 app:layout_constraintTop_toTopOf="parent" /> 18</androidx.constraintlayout.widget.ConstraintLayout>
試したこと
クラス分けをして、フラグメントを分ければ、処理の部分を分ける羽目になってしまいます。
例えば
Page1Fragmentから別のSampleActivityに飛ばしたとして、sampleの処理は別のフラグメント(SampleFragment)に飛ばすことになると思います。(遷移先でもタブを操作したいため)
そうなってくるとファイル数が1画面で2つ必要となってきて整理が大変になるため、実用的ではありません。
