1

カスタムビュー「ClearableTextView」があり、相対レイアウト内に EditText とボタンがあります。ビューはレイアウト ファイルを拡張することによって作成されるため、2 つのビューには ID があります。

また、2 つのフラグメントがあり、それぞれが独自のレイアウトを膨らませます。この両方のレイアウトには、他のビュー内に私のカスタム ClearableTextView が含まれています。

同じ ID を再利用するのは良くないことであり、結果が予測できないことはわかっていますが、名前がフランス語に聞こえる Google の担当者は、子ビューが親内で一意の ID を持っている限り、正しい ID を見つけるのに問題はないはずだと言ったことがあります。 . 私の検索したビューには、共通のルート ビューさえありません。ビューが含まれているビューは、異なるフラグメントによって所有されています。

次のように、フラグメント A で EditText の参照を探します。

v= inflater.inflate(layoutA);
TextView tvA=v.findViewById("someLayoutUniqueID").findById(ClearableTextView_uniqueID_A).findViewById(editTextID);

フラグメント B の EditText の場合:

v= inflater.inflate(layoutB);
TextView tvA=v.findViewById("anotherLayoutUniqueId").findById(ClearableTextView_uniqueID_B).findViewById(editTextID);

ID が一意であると言うとき、それはプロジェクト内のすべてのレイアウト内で一意であることを意味します。

奇妙なこと: Fragment A を作成します。問題があるかどうかはわかりませんが、FragmentStatePagerAdapter を使用して Fragment を viewPager にアタッチします。EditText に何か入力します。次に、Fragment B を作成し、viewPager から A を削除し、Fragment B を viewPager にアタッチするボタンを押します。フラグメント B では、EditText にフラグメント A のテキストが含まれています!!! なんで?

ビューページャーが各フラグメントのビューを結合することは知っていますが、私の場合は、常に 1 つのフラグメントしかアタッチされていないため、そうすべきではありません。そして、一意の ID を持つ親内の EditText ビューを探しています。何か案は?

4

3 に答える 3

1

私の記憶が正しければ、ViewPager通常、スワイプパフォーマンスを向上させるために、隣接するフラグメントをメモリに保持します。また、フラグメントの状態を保持するため、ビューの値を含めて、フラグメントをすばやく再ロードできます。フラグメントをビューページャーに追加すると、フラグメントがロードされ、アクティビティのビューツリーにアタッチされます。

私は過去に同様の問題に遭遇し、テキストを間違った場所に置き続けましたTextView。私はfindByIdあなたのように呼び出しをネストしようとしたことはありませんが、単にIDで検索すると、TextView通常、最初に宣言されたものが表示されます。この問題は2つの方法で解決できます。1つは異なるIDを使用する方法で、カットアンドペーストアクションが必要になります(ある程度管理可能)。2番目の最適な選択は、このレイアウトとそのロジックをカプセル化するカスタムビューを作成することです。ボタンのクリックを事前に定義してテキストをクリアし、残りのコードで正しく機能するために必要な/必要なビットを公開するためのインターフェイスを作成します。

于 2013-02-27T19:36:09.173 に答える
1

これが遅れていることはわかっていますが、同じ問題を抱えていて、簡単な解決策を見つけたと思います。ID で EditText を探すだけでなく、その EditText の親を取得してから、次のように EditText である子を探すことができます。

LinearLayout layout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.layout_with_editText);
EditText et = (EditText) layout.getChildAt(index); //whatever index your EditText is at

これにより、実際には、テキストを割り当てたり、問題の EditText ですべての作業を行うことができます。同じ ID を持つメモリ内のすべてのものではありません。私もスピナーで同じ問題を抱えていましたが、この修正も適用されます。これがこの問題を抱えている人に役立つことを願っています

于 2013-07-29T16:04:35.677 に答える