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

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

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

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

Android

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

受付中

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

yamayamak
yamayamak

総合スコア0

Java

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

Android

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

0回答

0評価

0クリップ

949閲覧

投稿2019/04/03 05:55

編集2022/01/12 10:55

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

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

Java

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 destroyAllItem(ViewPager pager) { for (int i = 0; i < getCount() - 1; i++) { try { Object obj = this.instantiateItem(pager, i); if (obj != null) destroyItem(pager, i, obj); } catch (Exception e) { } } } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); if (position <= getCount()) { FragmentManager manager = ((Fragment) object).getFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.remove((Fragment) object); trans.commit(); } } } 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は変更していません。

java

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

<?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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

kakajika
kakajika

2019/04/03 11:33

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

2019/04/03 11:56

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

2019/04/03 13:59 編集

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

2019/04/03 14:20

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

2019/04/03 15:14 編集

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

2019/04/04 00:52

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

2019/04/04 10:57

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Java

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

Android

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