2

同じフラグメントが 3 つのタブで作成されると、フラグメントのライフサイクルを理解するのが難しくなります。各フラグメントのメイン ウィジェットは EditText オブジェクトです。このオブジェクトは、アプリが最初に実行されたときに作成された、タブごとに 1 つずつ作成されたクラスで追跡されます。アプリが入力 (キーボードではなく画面上のボタンによって提供される) を実行すると、テキストが 2 番目のタブの EditText に設定されます。

getItem()入力はmy 内で次のように見えますFragmentPagerAdapter。タブが作成されたときに 2 回呼び出されることは理解してgetItem()いますが、これは完全に正常な動作ですが、理解していないのは、これがフォーカスの問題なのか、コード設計のロジックの問題なのかということです (前者を望んでいます)。instantiate()によって返されることと関係があるのgetItem()でしょうか? が呼び出されると、フラグメントinstantiate()にこのコード行があるため、フォーカスは常にそれに続きますか?onCreateView()

active.editLine = (EditText) v.findViewById(R.id.display);
// active is the currently active object of my app's class.

私がエラーを引き起こしていると思われる理由は、テキストをinstantiate()介してページのレンダリングを増やしたときに、3 番目のタブに送信されたためです。setOffscreenPageLimit(2)

この時点で、私は何がどこで起こっているかを追跡しようとしましたが、それは素晴らしい教育的演習でした. 私が苦労して見つけたのは、これはおそらく焦点の問題であるということでした.しかし、焦点をクリアして焦点を設定しようとする私の試みは適用されていないようであり、それが根本的な問題であるかどうかさえわかりません. 私は最終active.editLine.debug(0)的に、フォーカスが失われたか得られたかを確認するために使用しましたが、そうではありませんでした. このかなり人気のある記事をいくつか読んで、XML から目をそらしましたが、それも役に立ちませんでした。

念のため、どこで EditText オブジェクトを設定する必要がありますか? OnCreateView()私のフラグメントに?それが、上記のコードが現在存在する場所です。アクティビティでカスタム クラスの 3 つのオブジェクトをグローバル変数として作成します。コードの適切な領域と思われる部分にゲッターとセッターがあります。代わりに上記のコードonCreate()を私のフラグメントに含める必要がありますか? これがフォーカスの問題であると思われる場合、フォーカスをオフにして必要なときにのみフォーカスを使用するために受け入れられている方法は何ですか? さらに重要なことは、アプリを初めて実行するときに、どこでフォーカスをオンにすればよいでしょうか? 最初の 2 つのタブをレンダリングするために 2 回実行するOnTabSelected()前に呼び出されます。getItem()では、グローバルにオフにする場合、最初の焦点はどこにあるのでしょうか? リスナーのタイプでフォーカスを設定できますか?

4

1 に答える 1

1

ここで何をしようとしているのか正確にはわかりませんが、いくつかの提案があります。

  • グローバルアクティブオブジェクトをメインアクティビティでライブにし、getActivity().someObjectフラグメントから呼び出します
  • findViewById()の最初のインスタンスが見つかるまで、ビュー階層を下方向に検索しますR.id.display
  • フラグメント ビューは、フラグメント トランザクションでコミットするまで使用できません。これは、そのビューもその時点まで使用できないことを意味します。
  • あなたは呼び出すことによってfindViewById()いくつかのビューに「スコープ」していますvv.findViewById()
  • フラグメントをページングしている場合は、フラグメントのonResume()メソッドでアクティブなビューを設定してみてください
  • フラグメントのonCreateView()メソッドは 1 回だけ呼び出されます。This will be called between onCreate(Bundle) and onActivityCreated(Bundle).
于 2013-07-25T05:48:20.550 に答える