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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

0回答

1308閲覧

androidでViewPagerにおいてsetCurrentItem(0)が正常に動作しない

yamayamak

総合スコア131

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/04/03 05:55

編集2019/04/04 12:36

Android Studio3.3.2を利用しています。
以下のようにViewPagerを利用していますが、setCurrentItemが正常に動作してくれません。
以下のプロジェクトでbutton1を押して1−0を選択した後にbutton2を押すとなぜか一つずれて表示されてしまいます。
(tabFragmentは作成し変更情報のみ記載してます。)

何か分かればアドバイスをお願いします。

Java

1public class MainActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener, tabFragment.OnFragmentInteractionListener { 2 3 private SectionsPagerAdapter mSectionsPagerAdapter; 4 private ViewPager mViewPager1; 5 private ViewPager mViewPager2; 6 private TabLayout tabLayout; 7 private tabFragment mTabFragment; 8 int viewFlag = 1; 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 setTabicons(0); 14 } 15 16 private void setTabicons(int setTub) { 17 mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 18 mViewPager1 = (ViewPager) findViewById(R.id.container1); 19 mViewPager2 = (ViewPager) findViewById(R.id.container2); 20 tabLayout = (TabLayout) findViewById(R.id.tabs); 21 if (viewFlag == 1) { 22 mViewPager1.setVisibility(View.VISIBLE); 23 mViewPager2.setVisibility(View.GONE); 24 mViewPager1.setAdapter(mSectionsPagerAdapter); 25 tabLayout.setupWithViewPager(mViewPager1); 26 } else { 27 mViewPager1.setVisibility(View.GONE); 28 mViewPager2.setVisibility(View.VISIBLE); 29 mViewPager2.setAdapter(mSectionsPagerAdapter); 30 tabLayout.setupWithViewPager(mViewPager2); 31 } 32 tabLayout.getViewTreeObserver().addOnGlobalLayoutListener(this); 33 if (viewFlag == 1) { 34 for (int i = 0; i < 16; i++) { 35 tabLayout.getTabAt(i).setText("1-" + String.valueOf(i)); 36 } 37 } else { 38 for (int i = 0; i < 6; i++) { 39 tabLayout.getTabAt(i).setText("2-" + String.valueOf(i)); 40 } 41 } 42 if (viewFlag == 1) { 43 mViewPager1.setCurrentItem(setTub); 44 45 mSectionsPagerAdapter.finishUpdate(mViewPager1); 46 mSectionsPagerAdapter.finishUpdate(mViewPager2); 47 } else { 48 mViewPager2.setCurrentItem(setTub); 49 mSectionsPagerAdapter.finishUpdate(mViewPager2); 50 mSectionsPagerAdapter.finishUpdate(mViewPager1); 51 } 52 } 53 @Override 54 public void onFragmentInteraction(Uri uri) { 55 56 } 57 public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 58 public SectionsPagerAdapter(FragmentManager fm) { 59 super(fm); 60 } 61 @Override 62 public Fragment getItem(int position) { 63 tabFragment npanel1 = tabFragment.newInstance(position); 64 return npanel1; 65 } 66 @Override 67 public int getCount() { 68 if (viewFlag == 1) { 69 return 16; 70 } else { 71 return 6; 72 } 73 } 74 @Override 75 public CharSequence getPageTitle(int position) { 76 return null; 77 } 78 @Override 79 public Object instantiateItem(ViewGroup container, int position) { 80 Fragment createdFragment = (Fragment) super.instantiateItem(container, position); 81 return createdFragment; 82 } 83 @Override 84 public int getItemPosition(Object object) { 85 return POSITION_NONE; 86 } 87 } 88 public void button1(View v) { 89 viewFlag = 1; 90 setTabicons(mViewPager2.getCurrentItem()); 91 } 92 public void button2(View v) { 93 viewFlag = 2; 94 setTabicons(mViewPager1.getCurrentItem()); 95 } 96 @Override 97 public void onGlobalLayout() { 98 } 99}

tabFragmentは以下のところだけ修正しました。XMLは変更していません。

java

1public class tabFragment extends Fragment { 2(省略) 3 public static tabFragment newInstance(int tubpos) { 4 tabFragment frag = new tabFragment(); 5 Bundle args = new Bundle(); 6 args.putInt("tabPosition", tubpos); 7 frag.setArguments(args); 8 return frag; 9 }

mainのLayoutを追記します

xml

1<?xml version="1.0" encoding="utf-8"?> 2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/relativeLayout" 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:fitsSystemWindows="true" 9 tools:context=".MainActivity"> 10 11 <TextView 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="Hello World!" 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 <android.support.v4.view.ViewPager 21 android:id="@+id/container2" 22 android:layout_width="match_parent" 23 android:layout_height="match_parent" 24 android:layout_marginTop="100dp" 25 android:layout_marginBottom="55dp" 26 app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"> 27 28 </android.support.v4.view.ViewPager> 29 30 <android.support.v4.view.ViewPager 31 android:id="@+id/container1" 32 android:layout_width="match_parent" 33 android:layout_height="match_parent" 34 android:layout_marginTop="100dp" 35 android:layout_marginBottom="55dp" 36 app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"> 37 38 </android.support.v4.view.ViewPager> 39 40 <android.support.design.widget.AppBarLayout 41 android:id="@+id/appbar" 42 android:layout_width="match_parent" 43 android:layout_height="50dp" 44 android:background="@color/colorPrimary"> 45 46 <android.support.design.widget.TabLayout 47 android:id="@+id/tabs" 48 android:layout_width="match_parent" 49 android:layout_height="match_parent" 50 app:tabMode="scrollable" /> 51 52 </android.support.design.widget.AppBarLayout> 53 54 <Button 55 android:id="@+id/button" 56 android:layout_width="wrap_content" 57 android:layout_height="wrap_content" 58 android:layout_marginTop="50dp" 59 android:layout_marginLeft="10dp" 60 android:text="Button1" 61 android:onClick="button1"/> 62 63 <Button 64 android:id="@+id/button2" 65 android:layout_width="wrap_content" 66 android:layout_height="wrap_content" 67 android:layout_marginTop="50dp" 68 android:layout_marginLeft="150dp" 69 android:text="Button2" 70 android:onClick="button2"/> 71 72</RelativeLayout>

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

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

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

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

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

kakajika

2019/04/03 11:33

setCurrentItemが正常に動作しないとありますが、ViewPagerのページ自体は正しく最初のページが表示されているのですよね?でしたらTabLayout側の問題だと思います。Tabに設定しているカスタムViewのレイアウトなどの情報を追記してください。
yamayamak

2019/04/03 11:56

カスタムViewを追記しました。 ご指摘の通りだと思って、「tabLayout.setScrollPosition(0, 0, true);」などもつけてやってみましたが、うまく行きませんでした。 0ではなく、2だと動作しました。0でも、タブ数によってかはわかりませんが、うまくいくケースもあることも確認しました。 Adaptorの問題かとも思いましたが原因はわかっていません。
kakajika

2019/04/03 13:59 編集

うーん、ほぼ同じコードを試してみましたが、おっしゃるような現象は再現できないです。ご質問に書かれていない箇所に問題があるものと思います。そもそもデータに変化がないならnotifyDataSetChangedを呼ぶ必要はないはずなのでそのあたりも変ですね。
yamayamak

2019/04/03 14:19

なるほど、試して頂いたとのことで大変ありがとうございます。 このコードには問題がないということだけでも大変ありがたいです。 mViewPager1 = (ViewPager) findViewById(R.id.container1); mViewPager2 = (ViewPager) findViewById(R.id.container2); で切り替えた場合に発生していますので、以下を実行した場合にmViewPager1への切り替えは治りました。 mSectionsPagerAdapter.finishUpdate(mViewPager1); mSectionsPagerAdapter.finishUpdate(mViewPager2); でも、同様にmViewPager2を実行していますが治りませんでした。 何かわかったら投稿します。色々ありがとうございました。
yamayamak

2019/04/03 14:20

ちなみに切り替えと同時に mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); からやり直して再構築しています。参考まで。。。
kakajika

2019/04/03 15:14 編集

mViewPager2というのはどこから出てきたものでしょう…?ご質問の文章からもいまいちどんな状況なのか分かりませんし、いったん整理された方がいいように思います。 問題を再現できる最小のコードを作ってみて、再度質問してください。
yamayamak

2019/04/04 00:52

このような事例で他に困った方で、ここに注意が必要などのアドバイスがないか確認したかったのですが無駄なお手数をおかけするのは望ましくないとも思いますので、ご指摘の通り少しまとめて修正等させて頂きます。 ありがとうございましたm(_ _)m
yamayamak

2019/04/04 10:57

新しいプロジェクトを作成し、色々試しましたが、やはり再現しています。 ご教授をお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問