質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2831閲覧

AndroidStudioでViewPager2を使用したタブを実装したい

Lily_V

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2022/03/16 14:06

編集2022/03/18 00:14

前提・実現したいこと

AndroidStudio(Java)でスワイプもできるタブを実装したいです。
色々調べていたところ、ViewPager2とTabLayoutを使用する方法がよいのかと思い、
以下のサイトを参考にコードを組んでみました。
【参考】
https://developer.android.google.cn/guide/navigation/navigation-swipe-view-2?hl=ja#java

発生している問題

エラーはすべて解消したのですが、何も表示されません。
サンプル通りにコーディングしたつもりなのですが、どこが足りないのか自分には見つけることができませんでした。
アドバイスお願い致します。

該当のソースコード

【VAL003Activity.java】

java

1public class VAL003Activity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_val003); 7 8 // パラメータを取得する 9 Intent intent = getIntent(); 10 int titleCd = intent.getIntExtra("titleCd", 0); 11 12 // Fragmentを作成する 13 DetailInfoFragment detailInfoFragment = DetailInfoFragment.newInstance(titleCd); 14 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 15 // 新しく追加を行うのでaddを使用する 16 transaction.add(R.id.layout_fragment, detailInfoFragment); 17 // 最後にcommitを使用することで変更を反映する 18 transaction.commit(); 19 } 20}

【DetailInfoFragment.java】

java

1public class DetailInfoFragment extends Fragment { 2 private static final String ARG_titleCd = "titleCd"; 3 4 private int mTitleCd; 5 6 DemoCollectionAdapter demoCollectionAdapter; 7 ViewPager2 viewPager; 8 9 public DetailInfoFragment() { 10 // Required empty public constructor 11 } 12 13 /** 14 * Use this factory method to create a new instance of 15 * this fragment using the provided parameters. 16 * 17 * @param titleCd タイトルコード. 18 * @return A new instance of fragment DetailInfoFragment. 19 */ 20 public static DetailInfoFragment newInstance(int titleCd) { 21 DetailInfoFragment fragment = new DetailInfoFragment(); 22 Bundle args = new Bundle(); 23 args.putInt(ARG_titleCd, titleCd); 24 fragment.setArguments(args); 25 return fragment; 26 } 27 28 @Override 29 public void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 if (getArguments() != null) { 32 mTitleCd = getArguments().getInt(ARG_titleCd); 33 } 34 } 35 36 @Override 37 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 38 // Inflate the layout for this fragment 39 return inflater.inflate(R.layout.fragment_detail_info, container, false); 40 } 41 42 @Override 43 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 44 demoCollectionAdapter = new DemoCollectionAdapter(this); 45 viewPager = view.findViewById(R.id.pager); 46 viewPager.setAdapter(demoCollectionAdapter); 47 48 // タブを追加する 49 TabLayout tabLayout = view.findViewById(R.id.tab_layout); 50 new TabLayoutMediator(tabLayout, viewPager, 51 new TabLayoutMediator.TabConfigurationStrategy() { 52 @Override 53 public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) { 54 tab.setText("OBJECT " + (position + 1)); 55 } 56 } 57 ).attach(); 58 } 59 60 public class DemoCollectionAdapter extends FragmentStateAdapter { 61 public DemoCollectionAdapter(Fragment fragment) { 62 super(fragment); 63 } 64 65 @NonNull 66 @Override 67 public Fragment createFragment(int position) { 68 // Return a NEW fragment instance in createFragment(int) 69 Fragment fragment = new DetailInfoObjectFragment(); 70 Bundle args = new Bundle(); 71 // Our object is just an integer :-P 72 args.putInt(DetailInfoObjectFragment.ARG_OBJECT, position + 1); 73 fragment.setArguments(args); 74 return fragment; 75 } 76 77 @Override 78 public int getItemCount() { 79 return 100; 80 } 81 } 82}

【DetailInfoObjectFragment.java】

java

1public class DetailInfoObjectFragment extends Fragment { 2 public static final String ARG_OBJECT = "object"; 3 4 @Nullable 5 @Override 6 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, 7 @Nullable Bundle savedInstanceState) { 8 return inflater.inflate(R.layout.fragment_detail_info_object, container, false); 9 } 10 11 @Override 12 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 13 Bundle args = getArguments(); 14 ((TextView) view.findViewById(R.id.textView)) 15 .setText(Integer.toString(args.getInt(ARG_OBJECT))); 16 } 17}

【fragment_detail_info.xml】

xml

1<?xml version="1.0" encoding="utf-8"?> 2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 tools:context=".fragments.DetailInfoFragment"> 7 8 <com.google.android.material.tabs.TabLayout 9 android:id="@+id/tab_layout" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" /> 12 13 <androidx.viewpager2.widget.ViewPager2 14 android:id="@+id/pager" 15 android:layout_width="match_parent" 16 android:layout_height="0dp" 17 android:layout_weight="1" /> 18 19</RelativeLayout>

【fragment_detail_info_object.xml】

xml

1<?xml version="1.0" encoding="utf-8"?> 2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 tools:context=".fragments.DetailInfoObjectFragment"> 7 8 <TextView 9 android:id="@+id/textView" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:text="TextView" /> 13 14</RelativeLayout>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/03/16 16:37

コードのマークダウンにおきまして、ファイル名を書かれている個所には言語名( java や xml )をお書きください。 ファイル名はマークダウンの外にお書きください。
jimbe

2022/03/16 16:55

フラグメントしかご提示されていませんが、アクティビティはどの様になっているでしょうか。
Lily_V

2022/03/18 00:15

マークダウンの書き方修正と、アクティビティのソースコードの追加を行いました。
jimbe

2022/03/18 10:18

ありがとうございます。
guest

回答1

0

ベストアンサー

どこが足りないのか

要所にログの出力を入れる等をし、何が起きているのか、どこまで想定通りに動作しているか、変数等がどこまで想定通りの値になっているか等の情報を集め、想定通りになっていない個所を見つけては修正もしくは作り変えることを繰り替えしていくこと(=デバッグ)が足りていないものと思います。


※クラス名等変更しています。

MainActivity.java

java

1import android.os.Bundle; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5public class MainActivity extends AppCompatActivity { 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 11 //Fragmentを作成・設定する 12 getSupportFragmentManager().beginTransaction() 13 .replace(R.id.fragment_container, new MainFragment()) 14 .commit(); 15 } 16}

res/layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:id="@+id/fragment_container" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical" />

MainFragment.java

java

1import android.os.Bundle; 2import android.view.*; 3 4import androidx.annotation.*; 5import androidx.fragment.app.Fragment; 6import androidx.viewpager2.adapter.FragmentStateAdapter; 7import androidx.viewpager2.widget.ViewPager2; 8 9import com.google.android.material.tabs.*; 10 11public class MainFragment extends Fragment { 12 public MainFragment() { 13 super(R.layout.fragment_main); 14 } 15 16 @Override 17 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 18 FragmentsAdapter fragmentsAdapter = new FragmentsAdapter(); 19 20 ViewPager2 viewPager2 = view.findViewById(R.id.view_pager); 21 viewPager2.setAdapter(fragmentsAdapter); 22 23 // タブを追加する 24 TabLayout tabLayout = view.findViewById(R.id.tabs); 25 new TabLayoutMediator(tabLayout, viewPager2, fragmentsAdapter).attach(); 26 } 27 28 public class FragmentsAdapter extends FragmentStateAdapter implements TabLayoutMediator.TabConfigurationStrategy { 29 public FragmentsAdapter() { 30 super(MainFragment.this); 31 } 32 33 @NonNull 34 @Override 35 public Fragment createFragment(int position) { 36 return ContentsFragment.newInstance(position + 1); 37 } 38 39 @Override 40 public int getItemCount() { 41 return 10; 42 } 43 44 @Override 45 public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) { 46 tab.setText("OBJECT " + (position + 1)); 47 } 48 } 49}

res/layout/fragment_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 xmlns:app="http://schemas.android.com/apk/res-auto" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 android:orientation="vertical" 9 tools:context=".MainFragment"> 10 11 <com.google.android.material.tabs.TabLayout 12 android:id="@+id/tabs" 13 android:layout_width="match_parent" 14 android:layout_height="wrap_content" 15 app:tabMode="scrollable" /> 16 17 <androidx.viewpager2.widget.ViewPager2 18 android:id="@+id/view_pager" 19 android:layout_width="match_parent" 20 android:layout_height="0dp" 21 android:layout_weight="1" /> 22 23</LinearLayout>

ContentsFragment.java

java

1import android.os.Bundle; 2import android.view.*; 3import android.widget.TextView; 4 5import androidx.annotation.*; 6import androidx.fragment.app.Fragment; 7 8public class ContentsFragment extends Fragment { 9 private static final String ARG_OBJECT = "object"; 10 11 public static ContentsFragment newInstance(int object) { 12 ContentsFragment fragment = new ContentsFragment(); 13 Bundle args = new Bundle(); 14 args.putInt(ContentsFragment.ARG_OBJECT, object); 15 fragment.setArguments(args); 16 return fragment; 17 } 18 19 public ContentsFragment() { 20 super(R.layout.fragment_contents); 21 } 22 23 @Override 24 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 25 Bundle args = getArguments(); 26 ((TextView)view.findViewById(R.id.textView)).setText(""+args.getInt(ARG_OBJECT)); 27 } 28}

res/layout/fragment_contents.xml

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:tools="http://schemas.android.com/tools" 5 xmlns:app="http://schemas.android.com/apk/res-auto" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".ContentsFragment"> 9 10 <TextView 11 android:id="@+id/textView" 12 android:layout_width="match_parent" 13 android:layout_height="match_parent" 14 android:text="TextView" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintLeft_toLeftOf="parent" 17 app:layout_constraintRight_toRightOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20</androidx.constraintlayout.widget.ConstraintLayout>

投稿2022/03/16 16:37

編集2022/03/18 10:36
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lily_V

2022/03/18 00:23

ご回答ありがとうございます。 もう少し原因を調査してみます。
Lily_V

2022/03/18 00:54

一つ問題が解決いたしました。 DetailInfoFragmentのgetItemCount()の戻り値が固定で100になっていたため、タブが多すぎてタブにセットした文字列が表示されていない状態になっていただけでした。 スワイプができない問題やタブの中身が表示されない問題が残っているので、引き続き調査したいと思います。
jimbe

2022/03/18 10:28 編集

両レイアウトの最上位が RelativeLayout になっていますが、表示位置の関係で見えなかったりするのではないでしょうか。 また、参考サイトの最下部には「ViewPager2 サンプル(GitHub)」のリンクがあり、そこには Tab と ViewPager2 を組み合わせたコードも有りますので、そちらも参考にされると宜しいかと思います。(サンプルの割にコードが多いですが...)
Lily_V

2022/03/18 13:28

無事解決致しました。 (サンプルコードがあったことに気づかなかったです...) 動かなかったコードと見比べて勉強してみます。本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問