2

短編小説: Web リクエストが成功すると、別のレイアウト「success.xml」に置き換えられるレイアウト「layout.xml」があります。どちらのレイアウトにも、ImageViewレイアウトに背景を提供する があります。これら 2 つの背景は両方とも同じである必要があり、どちらもユーザーの好みに依存します。

長い話:これはすべて、Web 要求の後でcontentView を "success.xml" に置き換えるFragmnetことで発生します。これは次のように発生します。AsyncTaskonPostExecute

View view = getView();
view = null;
view = View.inflate(context, R.layout.success, null);

私がやろうとしたことは、両方ImageViewに次android:id="@+id/background_image"を与えてから呼び出すことです

ImageView background = (ImageView)view.findViewById(R.id.background_image);
background.setImageResource(R.drawable.bg1);

この背景設定は初期ビュー (layout.xml) で機能しますが、「success.xml」に変更しようとすると、backgroundnull であるため NullPointException が発生します。

確認したところ、ビューの ID は -1 に設定されていますが、元のビューのbackground_imageID は適切で有効なものに設定されています。

また、2番目のビューの背景IDを次のように設定しようとしました: android:id="@id/background_image"、つまり「+」なしで、まだ運がありません。

追加の複雑さは、これを行う必要があるのは 2 つのレイアウトだけでなく、約 5 つであるため、ビュー ID をリサイクルすると非常に便利です。

どんな助けでも大歓迎です。

4

1 に答える 1

2

フラグメントのビューを置き換えるためのコードは、あなたが望むことをしません。実際のオブジェクトではなく、そのビューへの参照のみを変更すると、元のビューは同じままになります。

フラグメントのビューを新しいレイアウトに置き換えるには、基本レイアウト ( ) に別のViewGroup(たとえば) を含めることができます( ) の現在のコンテンツ (id を与えることを忘れないでください)レイアウト)。次に、レイアウトを置き換えるときは、次のようにするだけです。FrameLayoutlayout.xmllayouts.xml

// remove the current content
((ViewGroup) getView().findViewById(R.id.yourWrapperLayout)).removeAllViews();
// add the new content
View.inflate(context, R.layout.success, ((ViewGroup) getView().findViewById(R.id.yourWrapperLayout)));

万が一、5 つのレイアウトすべてがルート ビューに対して同じタイプ (aLinearLayoutなど) を持っている場合は、余分なレイアウトを追加することを避けることができます。この場合、上記と同じコードを使用しますが、mergeタグを使用するように他のレイアウト ファイルを変更します。layout.xmlまた、他のファイルのコンテンツを追加するレイアウトでルートの ID を探します。

次に、同じIDを持つことができますが、ビューへの参照を再初期化する必要があります(つまり、ビューへの参照を保存する場合(Buttonフラグメントクラスのフィールドのように)、ビューを再度検索する必要があります) )。

于 2012-10-17T17:41:26.453 に答える