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

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

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

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

Android

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

Q&A

解決済

2回答

5962閲覧

Android開発でViewPager利用時にFragmentでタブ位置取得

yamayamak

総合スコア131

Java

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

Android

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

0グッド

0クリップ

投稿2017/04/04 06:09

編集2017/04/04 06:29

Android開発でViewPager利用時にFragmentでタブ位置を取得したいです。
Fragmentで呼び出されるJavaclassでタブ位置によって表示する内容を少し変更したいためです。

すみませんが、わからないのでご教授ください。

MainActivityは、ほぼAndroid Studioで作成される標準のまま利用しています。
tab1Activity
tab2Activity
の2つを呼び出していますが、この中でタブ位置により処理を変更したいです
以下の方法でいろいろ試していますがうまくいっていません。
(1)FragmentのActivity(tab1Activity,tab2Activity)呼び出し時にタブ位置の引数を渡す
(2)FragmentのActivity(tab1Activity,tab2Activity)内で現在のタブ位置を取得する

public class MainActivity extends AppCompatActivity { private SectionsPagerAdapter mSectionsPagerAdapter; private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.AppTheme); setContentView(R.layout.activity_main); // Create the adapter that will return a fragment for each of the three // primary sections of the activity. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.container); mViewPager.setAdapter(mSectionsPagerAdapter); TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(mViewPager); //アイコンセット tabLayout.getTabAt(0).setIcon(R.drawable.tab_iconsel_fav1); tabLayout.getTabAt(1).setIcon(R.drawable.tab_iconsel_fav2); tabLayout.getTabAt(2).setIcon(R.drawable.tab_iconsel_tv); tabLayout.getTabAt(3).setIcon(R.drawable.tab_iconsel_air); tabLayout.getTabAt(4).setIcon(R.drawable.tab_iconsel_dvd); tabLayout.getTabAt(5).setIcon(R.drawable.tab_iconsel_lig); tabLayout.getTabAt(6).setIcon(R.drawable.menuset); } // deleted PlaceholderFragment from here /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: tab1Activity npanel0 = new tab1Activity(); return npanel0; case 1: tab2Activity npanel1 = new tab2Activity(); return npanel1; case 2: tab1Activity npanel2 = new tab1Activity(); return npanel2; case 3: tab2Activity npanel3 = new tab2Activity(); return npanel3; case 4: tab1Activity npanel4 = new tab1Activity(); return npanel4; case 5: tab2Activity npanel5 = new tab2Activity(); return npanel5; case 6: tab7MenuActivity npanel6 = new tab7MenuActivity(); return npanel6; default: return null; } } @Override public int getCount() { // Show 3 total pages. return 7; } @Override public CharSequence getPageTitle(int position) { return null; } } } public class tab1Activity extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.frag_tab1, container, false); //TextView textView = (TextView) rootView.findViewById(R.id.section_label); //textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER))); // ここからタブ位置による異なる処理を行いたい return rootView; } }

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

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

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

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

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

uniko

2017/04/04 06:17

これは今選択中のタブのポジションが取りたいということでしょうか?
uniko

2017/04/04 06:17

すみません選択中→表示中の間違いです。
yamayamak

2017/04/04 06:26

なるほど... AndroidStudioから標準で作成しました。 Fragemntのクラスが呼び出されるのは表示中ではない場合もあるのかを理解しておりません。 例えば次のFragemntを準備するため呼び出すようなことがあるのでしたら表示中ではダメだと思っています。 必ず表示中=Fragmentのクラスが処理されるなら、それで良いと思いますが、試してみないと良いかわからないです。。。 一度、試してみたいと思いますので、すみませんが表示中のタブ位置を取得する方法でご教授ください。 よろしくお願いします。
guest

回答2

0

とりあえずコメントからでの回答ですが。

現在、表示中のタブのポジションを取得したい場合は

ViewPager#getCurrentItem

で取得することが可能です。
なお、ページ(タブ)が切り替わった時のコールバック等も基本的にViewPager側で設定しますし色々とれますので参考に。
ViewPager

投稿2017/04/04 06:32

uniko

総合スコア448

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

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

yamayamak

2017/04/04 07:15

ありがとうございます。カレントのPositionは取得できました! ただ、Fragmentは一つ隣りが表示されたときに次の準備に入るように見えます。 そのため、Fragmentのクラスが呼び出させれるときは、カレントは隣りのPositionでした。 仮にカレントpositionが1だとすると、次に2になるか0になるかは判断が難しそうでした。 となると引数にして渡すしかなさそうです。
uniko

2017/04/04 07:38

ちょっと状況が分かっていないんですが、現在のポジションは取れてるんですよね? けどタブを移動したりするとgetCurrentItemの返り値がその移動した画面のポジションに変わってしまうと言っていますか? もし変わったタイミングで何かをしたいのであればaddOnPageChangeListenerの利用を検討してみてはいかがでしょうか?
yamayamak

2017/04/04 10:36

ありがとうございます。0から進んで、カレントが1の場合に、2の準備がされますので、2のFragmentのクラスが実行されて、現在が1が出ます。カレントが1の場合に、2から進むと0が準備されますので、0のクラスが実行されます。 カレントが1の場合にどちらを生成しようとしているかの判断がつかないということです。1、2、3、4も同じクラスで記載しますので、カレントだけでは何を生成するために実行されているかが判断できないです。 確定するには、その前のPositionが必要に思います。 あと、addOnPageChangeListenerは利用していません。Android StudioのTabbedActivityで作成されたものを、ほぼそのまま利用していますが利用されておりません。 おそらく引数で渡すのが素直なんだと思いました。。。 いろいろありがとございました。
uniko

2017/04/04 11:05

なるほど。動きは正常そうですね。 ViewPagerは現在表示の画面に対して隣り合う画面を先に準備しますので、そのためカレントが1の場合に2が準備と言っておられるのかと思います。ようはカレントが1の場合には、0と2のFragmentも画面外で表示されているという感じです。なので4つのタブがある場合にカレントが1から2へ進んだ場合は3が生成されます。 本題ですが、単純に表示順で内容を変えると言う形であればおっしゃる通り、各FragmentごとのpositionをsetArgumentsで渡してあげてFragment側で処理をする方が素直です。 変に複雑な方法を記載したようで申し訳ありません。
yamayamak

2017/04/04 11:19

いえ、いつもお世話になっています。 勉強になります。こちらの質問のとおり回答いただいています。 また、カレントを取得したい場合もあると思いますので、勉強になりました。 ただ、今回は解決した内容でベストとさせていただきます。 今後とも、よろしくお願いします。
uniko

2017/04/04 11:44

Pager外にフローティングボタン配置してカレントによって処理を切り分けたいときとかには使えるので。 どうぞよろしくお願いいたします。
guest

0

ベストアンサー

・tab1Activityにint型を引数にもつファクトリメソッドを作成する。
・getItem内でtab1Activityのファクトリメソッドにpositionを渡してインスタンス化する。
・tab1Activity内でpositionを見て表示内容を変更する。

また、クラス名を変えた方がいいですね。Activityでは無いものをActivityと命名したり、クラス名の頭文字を小文字にしたりするのは良く無いです。

投稿2017/04/04 07:08

編集2017/04/04 07:09
yona

総合スコア18155

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

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

yamayamak

2017/04/04 07:19

ご指摘の通りです。Fragemntのクラスに標準でActivity名が入ってたのでそのまま利用していますが、ActivityとFragmentは異なるようですので、変えるのが望ましいですね。 ところで、ご指摘のとおり実施しようとしていますが、MainActivityのどの部分で引数に渡せるのかが試してみましたが、うまくいきませんでした。 ここら辺とは想定していますが、以下のところで記述できませんでした。 ----- case 0: tab1Activity npanel0 = new tab1Activity(); return npanel0; -------- どのように指定して呼び出すのが望ましいのかご教授願います。 よろしくお願いします。
yona

2017/04/04 07:29

「うまくいかない」ではわかりません、 試みた内容を書いてください。 回答にある通りSectionsPagerAdapter#getItemで渡してください。
yamayamak

2017/04/04 10:30

すみません、そもそも間違っているかもしれませんが、 tab1Activity npanel0 = new tab1Activity(position); なとか、 tab1Activity npanel0(position) = new tab1Activity(); なとか、 tab1Activity(position) npanel0 = new tab1Activity(); return panel0; でいけそうな気もしているのですが、エラーがでます。。。 JavaもAndroidも初めてなので根本ができてないので、ご教授ください。
yamayamak

2017/04/04 10:39

あと、呼ばれるFragment側は以下のように記述しています。 public class tab1Activity extends Fragment{ private int tubposition; public static tab1Activity newInstance(int tubpos) { tab1Activity frag = new tab1Activity(); Bundle args = new Bundle(); args.putInt("tabPosition", tubpos); frag.setArguments(args); return frag; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Tabのポシションを取得 tubposition = getArguments().getInt("tabPosition"); View rootView = inflater.inflate(frag_tab1, container, false); return rootView; }
yona

2017/04/04 11:02

エラーがでるならエラーメッセージを追記してください。 また、実装の方向性はあっています。 ただ、せっかく作ったnewInstanceを使用していないですよね?
yamayamak

2017/04/04 11:17

ありがとうございます!本件は以下で解決しました。 if (position%2==0) { tab1Activity npanel1 = tab1Activity.newInstance(position); return npanel1; } else { tab2Activity npanel2 = tab2Activity.newInstance(position); return npanel2; } newInstanceでした。アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問