【问题标题】:Android: programmatically adding view to RelativeLayoutAndroid:以编程方式将视图添加到RelativeLayout
【发布时间】:2012-03-04 16:02:51
【问题描述】:

在我的 Android 应用程序中,我有一个以 GoogleMaps 为特色的活动。如果有通知等,我会显示一个弹出窗口。这一切都很好。但是,我还有另一个活动,我想以相同的方式显示相同的信息。这个想法是在相应的视图(View2)中使用相同的弹出窗口。问题是,在第二个活动/视图中,弹出窗口没有出现,代码似乎在group.addView(popup, lp); 处崩溃(虽然没有明确的错误;但我确信没有任何空值)。我只是看不到这两个活动/视图之间的本质区别,这可能表明为什么弹出窗口在一个视图中工作正常但在另一个视图中不能正常工作。下面我展示相关代码sn-ps。

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

// 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();
}

最后,这里是对应布局的sn-ps。在这两种情况下,我都指的是我想要放置弹出窗口的RelativeLayout。

 <? xml version="1.0" encoding="utf-8"?>
 <LinearLayout [...]>
     <RelativeLayout [...] android:id="@+id/relativeLayoutMap">
         <com.google.android.maps.MapView  [...]/>
     </RelativeLayout>
 </LinearLayout> 

对于活动/视图 View2:

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

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

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

 </RelativeLayout>

非常感谢任何提示!我知道这已经在几个问题中得到解决,但我的“问题”是它基本上可以工作。仅在一个活动/视图中,而不是在另一个活动/视图中。看来我在这里错过了一些相当愚蠢的东西。

【问题讨论】:

    标签: android view android-activity popup android-relativelayout


    【解决方案1】:

    我发现了不同之处,正如预期的那样,这是相当愚蠢的事情:我忘记将显示面板的代码放在runOnUiThread 之外。我现在应该已经知道了。

    runOnUiThread(new Runnable() {
       public void run() {
          // code for showing the popup
       }
    });
    

    一个侧面问题:当我将 addView(...) 调用放在 try/catch 块中时,我走上了正确的道路。没有它就挂在那里而不会引发错误(在 LogCat 中;我使用的是 Eclipse)。有没有办法默认显示此类错误?谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 2017-10-09
      相关资源
      最近更新 更多