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

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

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

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

Android

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

Q&A

1回答

2118閲覧

[android]現在表示しているviewpagerのページ番号を取得したい

i_input_238

総合スコア4

Java

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

Android

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

0グッド

0クリップ

投稿2020/01/08 22:45

前提・実現したいこと

まだandroid開発を始めたばかりで至らないところもあると思いますが
回答よろしくお願いいたします。

現在表示しているviewpagerの番号を取得して
その番号をFragmentに渡したい。
なおそのviewpagerの番号によって
値を渡すFragmentを変えたい。

例)タブ1を選択しているときにページ番号1を取得して
そのページ番号をFragment1に渡す。
タブ2を選択しているときページ番号2を取得して
そのページ番号をFragment2に渡す。

発生している問題・エラーメッセージ

FragmentのgetArguments()でnullが出ており そこでアプリが落ちる。 nyusyutsuko_fragmentの String index = getArguments().getString("kbn"); [logcat] java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.BaseBundle.getString(java.lang.String)' on a null object reference at acom.example.a104_flag.nyusyutsuko_Fragment$2.onClick(nyusyutsuko_Fragment.java:120) //120はString index = getArguments().getString("kbn");のところになります。

該当のソースコード(nyusyutuko.home [activity])

ViewPager pager = findViewById(R.id.pager); pager.setAdapter( new PageAdapter(getSupportFragmentManager())); TabLayout tabs = findViewById(R.id.tabs); tabs.setupWithViewPager(pager); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { ViewPager pager = findViewById(R.id.pager); Bundle args = new Bundle(); int kbn_No = 0 ; if(state == ViewPager.SCROLL_STATE_SETTLING) { int page = pager.getCurrentItem(); if(page == 1){ FragmentManager fm = getFragmentManager(); FragmentTransaction t = fm.beginTransaction(); args.putInt("kbn", 1); nyusyutsuko_Fragment fragment = new nyusyutsuko_Fragment(); fragment.setArguments(args); }else if(page == 2){ FragmentManager fm = getFragmentManager(); FragmentTransaction t = fm.beginTransaction(); nyusyutsuko_Tab2_Fragment fragInfo = new nyusyutsuko_Tab2_Fragment(); args.putInt("kbn", 2); fragInfo.setArguments(args); } } }); }

該当のソースコード(nyusyutsuko_Fragment)

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { Button searchBtn = (Button)v.findViewById(R.id.button_search); searchBtn.setOnClickListener(new OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onClick(View v) { String index = getArguments().getString("kbn"); String kbn_No = index; } } }

該当のソースコード(nyusyutsuko_tab2_Fragment)

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { Button searchBtn = (Button)v.findViewById(R.id.button_search); searchBtn.setOnClickListener(new OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onClick(View v) { String index = getArguments().getString("kbn"); String kbn_No = index; } } }

試したこと

デバックではFragmentのgetArgumentsでnullが出る
setArgumentsがifの中にあるから?

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

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

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

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

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

guest

回答1

0

まず先に, FragmentTransaction が完結していません. 開始したら完結するようにしてください.

デバックではFragmentのgetArgumentsでnullが出る
setArgumentsがifの中にあるから?

なぜそこで止まっているのでしょう.
仮説が出たのでしたら, 実験されては如何でしょうか.
getArguments が実行される前に想定した個所の setArguments が実行されているかをご確認ください.

投稿2020/01/09 03:11

jimbe

総合スコア12648

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

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

i_input_238

2020/01/09 03:41

jimbe様、回答ありがとうございます。 >まず先に, FragmentTransaction が完結していません. 開始したら完結するようにしてください. すみません,FragmentTransactionは下記のようなコードという認識で合っていますでしょうか getSupportFragmentManager().beginTransaction().add(R.id.pager, fragment).commit(); >getArguments が実行される前に想定した個所の setArguments が実行されているかをご確認ください. デバックしたところsetArgumentは実行されており値もargsの中にありましたので Fragmentの方で何か問題があるのでしょうか。
jimbe

2020/01/09 05:12 編集

> getSupportFragmentManager().beginTransaction().add(R.id.pager, fragment).commit(); add で良いのかは画面の構造に依りますのでこちらでは判断できません. > デバックしたところsetArgumentは実行されており値もargsの中にありました 一応確認ですが, setArgments したフラグメントの getArgments で例外が発生しているのですね? 例えば, setArgments したフラグメントで無いほうのフラグメントも表示されていて, そちらの getArgments では無いことは確実ですか? そして, Bundle args = getArgments(); String index = args.getString("kbn"); とした場合 args が null になっているのですね? (ちなみに set のほうでは kbn は int です. int か String かどちらかに統一する必要があると思います.)
i_input_238

2020/01/09 14:23

返信が遅れてしまい大変申し訳ありません。 > setArgments したフラグメントの getArgments で例外が発生しているのですね? 例えば, setArgments したフラグメントで無いほうのフラグメントも表示されていて, そちらの getArgments では無いことは確実ですか? もう一つのフラグメントのgetArgmentに関係するところをコメントアウトして 試しても同じエラーが出ましたので確実だと思います。 >Bundle args = getArgments(); String index = args.getString("kbn"); とした場合 args が null になっているのですね? はい。args:nullとデバックで確認しました。 intに書き換えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問