1

ViewPager内に3つのフラグメントがあります。フラグメント内に静的ToggleButtonを追加しました。(静的、nullpointerexceptionの回避策が見つからなかったため、onCreateView()ではなくカスタムメソッドのFragmentクラス内でfindViewById()を使用したい場合)

MainActivityのViewPagerの外に、リセットボタンがあります。これにより、すべてのToggleButton(3つのフラグメントすべて)が「オフ」にリセットされます。

リセットボタンをクリックするたびに、現在のページとすべての隣接ページのみが更新されます。

例えば

  • 現在のページ:0更新されたページ:0,1
  • 現在のページ:1更新されたページ:0,1,2
  • 現在のページ:2更新されたページ:1,2

問題はFragmentPagerAdapterだと思います。ドキュメントによると:

各ページをフラグメントとして表すPagerAdapterの実装。これは、ユーザーがページに戻ることができる限り、フラグメントマネージャーに永続的に保持されます。

2ページ目にいるときは、0ページに直接戻ることができないので、0ページ(=フラグメント0)からのビューはもうメモリにないのではないかと思います。 では、現時点では表示されておらず、現在のフラグメントのネイバーでもないフラグメント内のToggleButtonsにアクセスするにはどうすればよいですか?回避策はありますか?

編集:

証書では、(すべてのフラグメント上の)ToggleButtonsのすべてのchecked()値が更新されますが、表示されず、隣接するフラグメントではない、膨張したフラグメントのビューは更新されないことがわかりました。したがって、前のフラグメントに戻ると、ToggleButtonsのchecked()値は、フラグメントが最後に表示されたときの状態にリセットされます。変...

例:

  1. Page2アクティブ-ToggleButton_Page2.checked()= true
  2. ページ0に切り替えます
  3. リセットボタンを押します。Toast ToggleButton_Page2.checked()= false
  4. ページ2に戻ります(またはすでにページ1にあります)
  5. ToggleButton_Page2.checked()= true//falseである必要があります

ソース:

ソースコードの例

4

2 に答える 2

1

では、現時点では表示されておらず、現在の Fragment の隣人でもない Fragment 内の ToggleButtons にアクセスするにはどうすればよいでしょうか? 回避策はありますか?

あなたのコードには多くの問題がありFragmentsますViewPager

リセット ボタンとステータス ボタンのOnClickListenersリスナーでは、その位置でページを表す_adapter.getItem(x);へのハンドルを取得しようとします。Fragmentそのメソッドを単に呼び出すと、実際に使用されたものではなく、その位置での新しいインスタンスが返されるため、これは機能しません(前の瞬間に呼び出すことによって)。呼び出し後に取得した新しいインスタンスは に関連付けられておらず、そのメソッドは呼び出されていないため、ビューがありません (アクセスすると が取得されます)。次に、 を静的フィールドとして作成することで、これを回避しようとしました。FragmentFragmentViewPagergetItem()getItem()ActivityonCreateViewNullPointerExceptionToggelButtonFragmentViewPagerFragments開始時。しかし、これを行うべきではありません. への参照を保持する静的フィールドContext(他のものと同様View) は、それをリークする危険があるため危険ですContext.

また、上で述べたことに関連して、 aに関連付けられているaには、それへの参照を返すメソッドがあるため、 aContextに aを渡す必要はありません。FragmentFragmentActivitygetActivity()Activity

の方法でViewPager遊んでいない限り、可視フラグメント (可視位置の左/右にあるもの) の近くにないからのフラグメントにはアクセスしないでください。には( のように) パフォーマンスを向上させるメカニズムがあるため、すぐに必要なものだけを作成して、ユーザーにスムーズなスワイプを提供できます。setOffscreenPageLimit()ViewPagerViewPagerListView

あなたのプロジェクトにいくつかの変更を加えました。チェックしてください。さらに質問がある場合は、質問に関連するコードを投稿してください。

于 2013-02-07T08:55:44.130 に答える
0

Salut、あなたの良い情報と改善されたコードをありがとう!

「しかし、これを行うべきではありません。コンテキストへの参照を保持する静的フィールド(他のビューと同様)は、そのコンテキストをリークするリスクがあるため危険です。」

私はFragmentの実装に不慣れで、入力文字列がfindFragmentByTag()にどのように正しく使用されているかを調べるのに何時間も費やしました(これで、使用方法がわかったので、それほど複雑になるとは思いませんでした)。だから私はその静的な回避策を実行することにしました、それは良い考えではありませんでした...

ご存知のとおり、たとえばsetOffscreenPageLimit(3)を使用すると、+-1個以上のフラグメントにアクセスできます。これが私の質問に対する答えだと思います。

于 2013-02-07T11:19:19.810 に答える