短篇小说:我有一个布局"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_image
id设置为合理有效的值。
我还尝试过这样设置第二个视图的背景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
字段),则必须再次搜索视图)。