常にタブを表示させる。

前提

先ほど以下のURLの質問をしたものです。
https://teratail.com/questions/5ljzf8nuh7x07v#reply-a2lvevxofy062w
画面遷移を行うプログラムにおいて、明らかに分からない点がありましたので質問させてください。
自分の作成しているプログラムはandroidにおいてタブをフッダーにして操作するものです。しかし先ほどのやり方でした場合、遷移までは成功したのですが、Page1Fragmentの中の内容が処理するごとに増えていき、画面が多くなるにつれて見にくいコードになってしまいます。それを防ぐためにクラスを分けたいです(可読性を上げるため)。
しかしクラスの数は増やしたくありません。1画面1つに抑えたいです(沢山画面を作る予定のため)

実現したいこと

常にタブを表示させる。

該当のソースコード

java(MainActivity.java)

import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.fragment.app.*;import androidx.viewpager2.adapter.FragmentStateAdapter;import androidx.viewpager2.widget.ViewPager2; import android.os.Bundle; import com.google.android.material.tabs.TabLayout;import com.google.android.material.tabs.TabLayoutMediator; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager2 pager = findViewById(R.id.pager); TabLayout tabs = findViewById(R.id.tab); String[] hposition = {"てすと1","てすと2"}; pager.setAdapter(new PageAdapter(this)); new TabLayoutMediator(tabs, pager, (tab, position) -> tab.setText(hposition[position])).attach(); } private static class PageAdapter extends FragmentStateAdapter { public PageAdapter(FragmentActivity activity) { super(activity); } @NonNull @Override public Fragment createFragment(int position) { Fragment fragment = null; if (position == 0) { fragment = new Page1Fragment(R.layout.activity_page1_fragment); } else if (position == 1) { fragment = new Page2Fragment(); } return fragment; } @Override public int getItemCount() { return 2; } }}

java(Page1Fragment.java)

import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.fragment.app.Fragment; import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button; public class Page1Fragment extends Fragment { public Page1Fragment(int layout) { super(layout); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Button button1 = view.findViewById(R.id.button1); if(button1 != null){ button1.setOnClickListener(v -> { startActivity(new Intent(getActivity(), SampleActivity.class)); }); } Button back = view.findViewById(R.id.back); if(back != null){ back.setOnClickListener(v -> { getActivity().finish(); }); } }}

java(Page2Fragment.java)

import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.fragment.app.Fragment; import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button; public class Page2Fragment extends Fragment { public Page2Fragment() { super(R.layout.activity_page2_fragment); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Button button2 = view.findViewById(R.id.button2); button2.setOnClickListener(v -> { startActivity(new Intent(getActivity(), SampleActivity.class)); }); }}

java(SampleActivity.java)

import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import androidx.fragment.app.Fragment;import androidx.fragment.app.FragmentActivity;import androidx.viewpager2.adapter.FragmentStateAdapter;import androidx.viewpager2.widget.ViewPager2; import android.os.Bundle; import com.google.android.material.tabs.TabLayout;import com.google.android.material.tabs.TabLayoutMediator; public class SampleActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager2 pager = findViewById(R.id.pager); TabLayout tabs = findViewById(R.id.tab); String[] hposition = {"てすと1","てすと2"}; pager.setAdapter(new PageAdapter(this)); new TabLayoutMediator(tabs, pager, (tab, position) -> tab.setText(hposition[position])).attach(); } private static class PageAdapter extends FragmentStateAdapter { public PageAdapter(FragmentActivity activity) { super(activity); } @NonNull @Override public Fragment createFragment(int position) { Fragment fragment = null; if (position == 0) { fragment = new Page1Fragment(R.layout.activity_sample); } else if (position == 1) { fragment = new Page2Fragment(); } return fragment; } @Override public int getItemCount() { return 2; } }}

xml(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="20dp" tools:context=".MainActivity"> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/pager" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" app:layout_constraintBottom_toTopOf="@+id/tab" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <com.google.android.material.tabs.TabLayout android:id="@+id/tab" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:tabSelectedTextColor="@color/teal_200" /></androidx.constraintlayout.widget.ConstraintLayout>

xml(activity_page1_fragment.xml)

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Page1Fragment"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ボタン1" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

xml(activity_page2_fragment.xml)

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Page2Fragment"> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ボタン2" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

xml(activity_sample.xml)

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".SampleActivity"> <Button android:id="@+id/back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="戻る" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

試したこと

クラス分けをして、フラグメントを分ければ、処理の部分を分ける羽目になってしまいます。
例えば
Page1Fragmentから別のSampleActivityに飛ばしたとして、sampleの処理は別のフラグメント(SampleFragment)に飛ばすことになると思います。(遷移先でもタブを操作したいため)
そうなってくるとファイル数が1画面で2つ必要となってきて整理が大変になるため、実用的ではありません。

コメントを投稿

0 コメント