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

Android 视图替换后返回为-1的重复布局ID,android,android-fragments,android-view,Android,Android Fragments,Android View,短篇小说: 我有一个布局“layout.xml”,在一个成功的web请求之后,它会被另一个布局“success.xml”所取代。两个版面都有一个ImageView,为版面提供背景。这两个背景都需要相同,并且都取决于用户的偏好 长话短说:这一切都发生在Fragmnet中,在web请求之后,AsyncTask将onPostExecute中的contentView替换为“success.xml”。这种情况发生如下: View view = getView(); view = null; view =

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

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

View view = getView();
view = null;
view = View.inflate(context, R.layout.success, null);
我试图做的是给两个
ImageView
s以下
android:id=“@+id/background\u 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\u image
id设置为合理有效的内容

我还尝试过这样设置第二个视图的背景id:
android:id=“@id/background\u 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
等),则可以避免添加额外的布局。在这种情况下,您将使用与上面相同的代码,但您将修改其他布局文件以使用
合并
标记。此外,您将在
layout.xml
布局中查找根目录的id,您将在其中添加其他文件的内容


然后,您可以使用相同的ID,但必须重新初始化对视图的任何引用(这意味着,如果存储对视图的引用(如fragment类中的
按钮
字段),则必须再次搜索视图)。

+1对于您的短篇和长篇故事,我将介绍第三种方法。我曾经尝试过使用包装器布局并像那样替换视图,但在正确对齐视图时遇到了问题。为什么我不能简单地这样做:
((ViewGroup)getView()).removeAllViews()然后查看。充气(con,R.layout.faults\u track\u result,(视图组)getView())?我刚刚尝试了我刚刚编写的内容,但是getView()会返回一个
nosavestateframeayout
@MikeT,您不能这样做(参见此)。正确的方法是使用包装器布局,使用它自己的id搜索它,并将新视图附加到它(如我的回答中所示)。一切正常。我的布局会按预期的方式改变。我所需要做的就是在布局中找到一个已经正确显示的
ImageView
。我真的不想在我的应用程序中重新构建~12个布局,仅仅为了找到一个新的布局view@MikeT我不确定我是否明白问题所在。布局更改,但您找不到视图?一切正常?是的,布局成功更改,按钮对布局和一切都有效,但当我在ImageView上尝试findViewById时,它返回
null
,如果我使用Eclipse调试工具进行检查,ImageView的id设置为-1