Android:以编程方式向RelativeLayout添加视图

Android:以编程方式向RelativeLayout添加视图,android,view,android-activity,popup,android-relativelayout,Android,View,Android Activity,Popup,Android Relativelayout,在我的Android应用程序中,我有一个以谷歌地图为特色的活动。在通知等情况下,我会显示一个弹出窗口。这一切都很好。但是,我还有另一个活动,我希望以相同的方式显示相同的信息。其想法是在相应的视图2中使用相同的弹出窗口。问题在于,在第二个活动/视图中,弹出窗口没有出现,代码似乎在group.addViewpopup,lp处崩溃;没有明显的错误;但我确信没有什么是空的。我只是看不到这两个活动/视图之间的本质区别,这可能说明为什么弹出窗口在一个视图中工作良好,而在另一个视图中却不工作。下面我将展示相关

在我的Android应用程序中,我有一个以谷歌地图为特色的活动。在通知等情况下,我会显示一个弹出窗口。这一切都很好。但是,我还有另一个活动,我希望以相同的方式显示相同的信息。其想法是在相应的视图2中使用相同的弹出窗口。问题在于,在第二个活动/视图中,弹出窗口没有出现,代码似乎在group.addViewpopup,lp处崩溃;没有明显的错误;但我确信没有什么是空的。我只是看不到这两个活动/视图之间的本质区别,这可能说明为什么弹出窗口在一个视图中工作良好,而在另一个视图中却不工作。下面我将展示相关的代码片段

下面是我如何在这两个活动中实例化弹出窗口。唯一的区别是引用父视图ID的第三个参数;在每种情况下都有一个相对人

// GoogleMaps Activity
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mapview);
    [...]
    this.popupPanel = new PopupPanel(this, R.layout.popup, R.id.relativeLayoutMap);
    [...]
}


// View2 Activity
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view2);
    [...]
    this.popupPanel = new PopupPanel(this, R.layout.popup, R.id.relativeLayoutView2);
    [...]
}
这是初始化弹出窗口和显示的主代码。活动之间只有值parentViewID不同

public PopupPanel(Activity activity, int layout, int parentViewID) {
    this.activity = activity;
    this.viewID = viewID;

    ViewGroup parent = (ViewGroup) this.activity.findViewById(parentViewID);
    this.popup = activity.getLayoutInflater().inflate(layout, parent, false);
}

public void show(boolean alignTop) {
    RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT
    );
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    ViewGroup group = (ViewGroup) this.activity.findViewById(this.viewID);
    group.addView(popup, lp); // this 'crashes' for the View2 activity
    group.invalidate();
}
最后,这里是相应布局的片段。在这两种情况下,我都引用了一个相对位置,我想在这里放置弹出窗口

 <? xml version="1.0" encoding="utf-8"?>
 <LinearLayout [...]>
     <RelativeLayout [...] android:id="@+id/relativeLayoutMap">
         <com.google.android.maps.MapView  [...]/>
     </RelativeLayout>
 </LinearLayout> 
对于“活动/视图”视图2:

 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout [...] android:id="@+id/relativeLayoutView2">
     <LinearLayout [...] >
         ...
     </LinearLayout>

     <LinearLayout [...] >
         ...
     </LinearLayout>

     <ScrollView [...] >
         <LinearLayout [...] >
            ...
         </LinearLayout>
     </ScrollView>

 </RelativeLayout>

任何提示都将不胜感激!我知道这已经在几个问题中得到了解决,但我的“问题”是它基本上是有效的。仅在一个活动/视图中,而不在另一个活动/视图中。似乎我错过了一些相当愚蠢的事情。

我发现了其中的区别,正如所料,这是一件相当愚蠢的事情:我忘了将显示面板的代码放在runOnUiThread之外。我意识到现在应该更清楚了

runOnUiThread(new Runnable() {
   public void run() {
      // code for showing the popup
   }
});
一个附带的问题:我把addView放在正确的轨道上。。。在try/catch块内调用。没有它只是挂在那里,而不会在LogCat中抛出错误;我正在使用Eclipse。是否有一种默认显示此类错误的方法?谢谢