Android: программно добавляем вид в RelativeLayout - PullRequest
0 голосов
/ 04 марта 2012

В моем приложении для Android есть активность с GoogleMaps.В случае уведомлений и т.д. я показываю всплывающее окно.Это работает все довольно хорошо.Однако у меня также есть другой вид деятельности, где я хочу отображать ту же информацию таким же образом.Идея состоит в том, чтобы использовать то же самое всплывающее окно в соответствующем представлении (View2).Проблема заключается в том, что в этом втором действии / представлении всплывающее окно не появляется, и код, кажется, падает на group.addView(popup, lp); (хотя явных ошибок нет, но я уверен, что нет ничего нулевого).Я просто не вижу существенной разницы между двумя действиями / представлениями, которая может указывать на то, почему всплывающие окна хорошо работают в одном представлении, но не в другом.Далее я покажу соответствующие фрагменты кода.

Вот как я создаю экземпляр всплывающего окна в обоих действиях.Единственным отличием является третий параметр, который относится к идентификатору родительского представления;a 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();
}

Наконец, вот фрагменты соответствующих макетов.В обоих случаях я ссылаюсь на 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>

Любые советы приветствуются!Я знаю, что это было решено в нескольких вопросах, но моя «проблема» в том, что это в основном работает.Только в одном действии / представлении, а не в другом.Кажется, что я здесь скучаю по чему-то довольно глупому.

1 Ответ

0 голосов
/ 07 марта 2012

Я понял разницу, и, как и ожидалось, это было довольно глупо: я забыл поставить код, отображающий панель, не в пределах runOnUiThread.Я действительно должен был знать лучше.

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

Один побочный вопрос: я оказался на правильном пути, когда положил вызов addView(...) в блок try / catch.Без этого просто зависает там, не выбрасывая ошибку (в LogCat; я использую Eclipse).Есть ли способ, чтобы такие ошибки показывались по умолчанию?Спасибо!

...