2

短篇小说: 我有一个布局“layout.xml”,在成功的网络请求后被另一个布局“success.xml”替换。两种布局都有一个为布局ImageView提供背景的。这两个背景都需要相同,并且都取决于用户偏好。

更长的故事:这一切都发生在web 请求之后FragmnetAsyncTask“success.xml”替换 contentView 。onPostExecute这发生如下:

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

我试图做的是给两个ImageViews 以下android:id="@+id/background_image"然后打电话

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

此背景设置适用于初始视图(layout.xml),但在尝试更改为“success.xml”时,我得到一个 NullPointException,因为background它是 null。

我已经检查过,视图的 id 设置为 -1,而原始视图的background_imageid 设置为合理且有效的值。

我也试过像这样设置第二个视图的背景ID:,android:id="@id/background_image"即没有'+',但仍然没有运气。

增加的复杂性是它不仅仅是2个布局,而是大约5个我需要这样做,所以回收视图ID真的很方便。

任何帮助将不胜感激。

4

1 回答 1

2

您用于替换片段视图的代码不会执行您想要的操作,原始视图将保持不变,因为您仅更改对该视图的引用而不是实际对象。

要用新布局替换片段的视图,您可以在基本布局( )中使用另一个ViewGroup(例如 a )来包装当前内容(不要忘记给它一个 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)));

LinearLayout如果您的所有五个布局都具有相同的根视图类型(例如等),您可以避免添加额外的布局。在这种情况下,您将使用与上面相同的代码,但您将修改其他布局文件以使用merge标签。此外,您将在layout.xml布局中查找根的 id,您将在其中添加其他文件的内容。

然后你可以有相同的 id,但你必须重新初始化对视图的任何引用(这意味着如果你存储对视图的引用,你将不得不再次搜索视图(就像Button片段类中的一个字段) )。

于 2012-10-17T17:41:26.453 回答