视图替换后,重复的布局ID返回为-1



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

长话短说:这一切都发生在Fragmnet中,AsyncTask在web请求后将onPostExecute中的contentView替换为"success.xml"。这种情况如下:

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"时,我会得到一个NullPointException,因为background为null。

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

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

更复杂的是,我需要做的不仅仅是2个布局,还有大约5个布局,所以回收视图id会非常方便。

如有任何帮助,我们将不胜感激。

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

要用新布局替换片段的视图,您可以在基本布局(layout.xml)中使用另一个ViewGroup(例如FrameLayout)来包装layouts.xml的当前内容(别忘了给它一个id)(据我所知,这是基本布局)。然后,当需要更换布局时,您可以简单地执行以下操作:

// 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字段),则必须再次搜索视图)。

最新更新