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

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

ただいまの
回答率

89.98%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 281

yamayamak

score 86

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

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

public class MainActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener, tabFragment.OnFragmentInteractionListener {

    private SectionsPagerAdapter mSectionsPagerAdapter;
    private ViewPager mViewPager1;
    private ViewPager mViewPager2;
    private TabLayout tabLayout;
    private tabFragment         mTabFragment;
    int viewFlag = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTabicons(0);
    }

    private void setTabicons(int setTub) {
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        mViewPager1 = (ViewPager) findViewById(R.id.container1);
        mViewPager2 = (ViewPager) findViewById(R.id.container2);
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        if (viewFlag == 1) {
            mViewPager1.setVisibility(View.VISIBLE);
            mViewPager2.setVisibility(View.GONE);
            mViewPager1.setAdapter(mSectionsPagerAdapter);
            tabLayout.setupWithViewPager(mViewPager1);
        } else {
            mViewPager1.setVisibility(View.GONE);
            mViewPager2.setVisibility(View.VISIBLE);
            mViewPager2.setAdapter(mSectionsPagerAdapter);
            tabLayout.setupWithViewPager(mViewPager2);
        }
        tabLayout.getViewTreeObserver().addOnGlobalLayoutListener(this);
        if (viewFlag == 1) {
            for (int i = 0; i < 16; i++) {
                tabLayout.getTabAt(i).setText("1-" + String.valueOf(i));
            }
        } else {
            for (int i = 0; i < 6; i++) {
                tabLayout.getTabAt(i).setText("2-" + String.valueOf(i));
            }
        }
        if (viewFlag == 1) {
            mViewPager1.setCurrentItem(setTub);

            mSectionsPagerAdapter.finishUpdate(mViewPager1);
            mSectionsPagerAdapter.finishUpdate(mViewPager2);
        } else {
            mViewPager2.setCurrentItem(setTub);
            mSectionsPagerAdapter.finishUpdate(mViewPager2);
            mSectionsPagerAdapter.finishUpdate(mViewPager1);
        }
    }
    @Override
    public void onFragmentInteraction(Uri uri) {

    }
    public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }
        @Override
        public Fragment getItem(int position) {
            tabFragment npanel1 = tabFragment.newInstance(position);
            return npanel1;
        }
        @Override
        public int getCount() {
            if (viewFlag == 1) {
                return 16;
            } else {
                return 6;
            }
        }
        @Override
        public CharSequence getPageTitle(int position) {
            return null;
        }
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
            return createdFragment;
        }
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }
    public void button1(View v) {
        viewFlag = 1;
        setTabicons(mViewPager2.getCurrentItem());
    }
    public void button2(View v) {
        viewFlag = 2;
        setTabicons(mViewPager1.getCurrentItem());
    }
    @Override
    public void onGlobalLayout() {
    }
}


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

public class tabFragment extends Fragment {
(省略)
    public static tabFragment newInstance(int tubpos) {
        tabFragment frag = new tabFragment();
        Bundle args = new Bundle();
        args.putInt("tabPosition", tubpos);
        frag.setArguments(args);
        return frag;
    }

mainのLayoutを追記します

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout"
    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:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.v4.view.ViewPager
        android:id="@+id/container2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="100dp"
        android:layout_marginBottom="55dp"
        app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior">

    </android.support.v4.view.ViewPager>

    <android.support.v4.view.ViewPager
        android:id="@+id/container1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="100dp"
        android:layout_marginBottom="55dp"
        app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior">

    </android.support.v4.view.ViewPager>

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimary">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:tabMode="scrollable" />

    </android.support.design.widget.AppBarLayout>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:layout_marginLeft="10dp"
        android:text="Button1"
        android:onClick="button1"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:layout_marginLeft="150dp"
        android:text="Button2"
        android:onClick="button2"/>

</RelativeLayout>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • kakajika

    2019/04/04 00:14 編集

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

    キャンセル

  • yamayamak

    2019/04/04 09:52

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

    キャンセル

  • yamayamak

    2019/04/04 19:57

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

    キャンセル

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

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る