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

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

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

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

Android Studio

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

Q&A

解決済

1回答

2633閲覧

Android TabLayoutの選択状態を設定したい

Lily_V

総合スコア12

Java

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

Android Studio

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

0グッド

0クリップ

投稿2022/05/04 11:55

実現したいこと

AndroidStudioでアプリを作成しています。言語はJavaです。
トグルボタンを切り替えた際にタブ内の表示内容を切り替えたいのですが、
2番目以降のタブを選択した状態でトグルボタンを切り替えると、1番目のタブが選択された状態になってしまいます。
"((TabLayout)view).getTabAt(position);”で切り替えようとしてもタブの選択状態が切り変わりません。

方法としましては、TabLayoutにViewPager2を紐づけて、ViewPager2にsetAdapterしなおすことでタブ内容の再表示をしています。その後、タブの選択状態を設定できればと思ったのですが、切り替えるタイミングが悪いのでしょうか?

該当のソースコード

java

1public class DetailInfoFragment extends Fragment { 2 private SQLiteDatabase db; 3 4 private static final String ARG_titleCd = "titleCd"; 5 private static final String ARG_detailList = "detailList"; 6 7 // タイトルコード(引数保持) 8 private int mTitleCd; 9 // 詳細情報リスト(引数保持) 10 private ArrayList<ArrayList> mDetailList; 11 // 表示フラグ 12 private boolean dispFlg = false; 13 // 選択中のタブ 14 private int selectedPosition = 0; 15 16 public DetailInfoFragment() { 17 super(R.layout.fragment_detail_info); 18 } 19 20 /** 21 * Use this factory method to create a new instance of 22 * this fragment using the provided parameters. 23 * 24 * @param titleCd タイトルコード. 25 * @return A new instance of fragment DetailInfoFragment. 26 */ 27 public static DetailInfoFragment newInstance(int titleCd, ArrayList<ArrayList> detailList) { 28 DetailInfoFragment fragment = new DetailInfoFragment(); 29 Bundle args = new Bundle(); 30 args.putInt(ARG_titleCd, titleCd); 31 args.putSerializable(ARG_detailList, (Serializable) detailList); 32 fragment.setArguments(args); 33 return fragment; 34 } 35 36 @Override 37 public void onCreate(Bundle savedInstanceState) { 38 super.onCreate(savedInstanceState); 39 if (getArguments() != null) { 40 mTitleCd = getArguments().getInt(ARG_titleCd); 41 mDetailList = (ArrayList<ArrayList>)getArguments().getSerializable(ARG_detailList); 42 } 43 db = new SqliteOpenHelper(getActivity()).getReadableDatabase(); 44 } 45 46 @Override 47 public View onCreateView(LayoutInflater inflater, ViewGroup container, 48 Bundle savedInstanceState) { 49 return inflater.inflate(R.layout.fragment_detail_info, container, false); 50 } 51 52 @Override 53 public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) { 54 final FragmentsAdapter fragmentsAdapter = new FragmentsAdapter(); 55 56 // 表示切替Changeイベント 57 Switch toggle = view.findViewById(R.id.switchDisp); 58 toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 59 @Override 60 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 61 dispFlg = isChecked; 62 // タブの選択状態を保持する 63 final TabLayout tabLayout = view.findViewById(R.id.tab_layout); 64 selectedPosition = tabLayout.getSelectedTabPosition(); 65 66 // 再表示 67 ViewPager2 viewPager2 = view.findViewById(R.id.view_pager); 68 viewPager2.setAdapter(fragmentsAdapter); 69 70 // タブの選択状態をセットする 71 tabLayout.getTabAt(selectedPosition).select(); 72 } 73 }); 74 75 ViewPager2 viewPager2 = view.findViewById(R.id.view_pager); 76 viewPager2.setAdapter(fragmentsAdapter); 77 78 // タブを追加する 79 TabLayout tabLayout = view.findViewById(R.id.tab_layout); 80 // タブを均一に配置する 81 tabLayout.setTabMode(TabLayout.MODE_FIXED); 82 tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 83 new TabLayoutMediator(tabLayout, viewPager2, fragmentsAdapter).attach(); 84 } 85 86 /** 87 * タブレイアウト 88 */ 89 public class FragmentsAdapter extends FragmentStateAdapter implements TabLayoutMediator.TabConfigurationStrategy { 90 public FragmentsAdapter() { 91 super(DetailInfoFragment.this); 92 } 93 94 @NonNull 95 @Override 96 public Fragment createFragment(int position) { 97 return DetailInfoObjectFragment.newInstance(mDetailList, position, dispFlg); 98 } 99 100 @Override 101 public int getItemCount() { 102 // タブの数 103 return mDetailList.size(); 104 } 105 106 @Override 107 public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) { 108 // タブ名をセット 109 tab.setText("タブ" + position); 110 } 111 } 112}

java

1public class DetailInfoObjectFragment extends Fragment implements CompoundButton.OnCheckedChangeListener { 2 public static final String ARG_OBJECT = "object"; 3 public static final String ARG_POSITION = "position"; 4 public static final String ARG_DISP_FLG = "dispFlg"; 5 6 private static final String CLM_SONG_NAME = "songName"; 7 private static final String CLM_BIKO = "biko"; 8 9 ArrayList<Map<String, String>> mDetailList; 10 11 public static DetailInfoObjectFragment newInstance(ArrayList object, int position, boolean dispFlg) { 12 DetailInfoObjectFragment fragment = new DetailInfoObjectFragment(); 13 Bundle args = new Bundle(); 14 args.putSerializable(ARG_OBJECT, object); 15 args.putInt(ARG_POSITION, position); 16 args.putBoolean(ARG_DISP_FLG, dispFlg); 17 fragment.setArguments(args); 18 return fragment; 19 } 20 21 public DetailInfoObjectFragment() { 22 super(R.layout.fragment_detail_info_object); 23 } 24 25 @Override 26 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 27 Bundle args = getArguments(); 28 // パラメータを取得する 29 ArrayList<ArrayList<Map<String, String>>> detailList = (ArrayList<ArrayList<Map<String, String>>>)args.getSerializable(ARG_OBJECT); 30 int position = args.getInt(ARG_POSITION); 31 boolean dispFlg = args.getBoolean(ARG_DISP_FLG); 32 33 mDetailList = detailList.get(position); 34 35 // 初期表示 36 initDisp(view, detailList, position, dispFlg); 37 } 38 39 /** 40 * 初期表示. 41 * @param view 42 * @param detailList 43 * @param position 44 * @param dispFlg 45 */ 46 public void initDisp(View view, ArrayList<ArrayList<Map<String, String>>> detailList, int position, boolean dispFlg) { 47 LinearLayout layoutSonContents = view.findViewById(R.id.layout_song_contents); 48 49 int cnt = 1; 50 for (Map<String, String> record : detailList.get(position)) { 51 // 曲名テキスト 52 TextView TextSong = new TextView(getActivity()); 53 String song = record.get(CLM_SONG_NAME); 54 if (song == null) { 55 song = "-"; 56 } else { 57 song = cnt + ". " + record.get(CLM_SONG_NAME); 58 } 59 TextSong.setText(song); 60 layoutSongContents.addView(TextSong); 61 62 if (dispFlg) { 63 // 曲情報表示トグルがONの場合、備考を表示する 64 String biko = record.get(CLM_BIKO); 65 if (biko != null && !biko.isEmpty()) { 66 TextView TextBiko = new TextView(getActivity()); 67 TextBiko.setText(record.get(CLM_BIKO)); 68 layoutSongContents.addView(TextBiko); 69 } 70 } 71 cnt++; 72 } 73 } 74}

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

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

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

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

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

guest

回答1

0

ベストアンサー

ViewPager のアダプタを変えた場合は、 TabLayout の方も操作が必要だったはずです。
TabLayout や TabLayoutMediator のドキュメントを参照してください。

投稿2022/05/05 17:51

編集2022/05/05 17:51
jimbe

総合スコア12648

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

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

Lily_V

2022/05/05 23:44

ViewPager のアダプタを設定しなおした後に、以下のようにTabLayoutMediatorもアタッチしなおしたところ、タブの初期選択状態を設定することができました。ありがとうございました。 new TabLayoutMediator(tabLayout, viewPager2, fragmentsAdapter).attach(); // タブの選択状態をセットする tabLayout.getTabAt(selectedPosition).select();
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問