2012-05-08 4 views
0

У меня есть приложение java, которое динамически добавляет представления в панель контейнера следующим образом.android: динамически добавлять компоненты в макет

void addBoard(int ID) { 
    BoardPanel p = new BoardPanel(myManager,ID); 
    setAutoLayout(); 
    containerPanel.add(p); 
    containerPanel.repaint(); 
} 

Когда я пытаюсь преобразовать это в приложение Android, оно зависает при вызове addView. В чем проблема? Обратите внимание, что пользователь может добавить 1000 просмотров (BoardPanels), если ему это нравится, поэтому я не могу использовать XML-макеты.

void addBoard(int ID) { 
    BoardPanel p = new BoardPanel(context,myManager,ID); 
    Log.i("Info", "Going to add view"); 
    containerPanel.addView(p); 
    Log.i("Info", "Added"); 
    containerPanel.postInvalidate(); 
} 

Благодаря


Update: Проблема, кажется, из-за шитый код, как Aegonis указал.

ответ

1

Попробуйте ViewGroup.addView() (FrameLayout, GridLayout, LinearLayout, ... все расширения ViewGroup).

Например, если вы хотите Вид вставить после первого уже существующего вида:

LinearLayout layout = (LinearLayout) findViewById(R.id.layoutID); 
layout.addView(viewToBeAdded, 1); 
+0

Я использовал LinearLayout для «containerPanel» и «BoarPanel» а. Моя активность уже началась, и просмотры отображаются. Но позже, когда я хочу добавить больше просмотров в контейнер, когда пользователь нажимает кнопку, он зависает на addView, что означает, что это может быть невозможно. Я также хочу очистить все представления в контейнере, когда пользователь нажимает на другую кнопку. Можно ли делать такие вещи в андроиде? – user1382302

+0

То, что вы описываете, должно быть действительно возможно. Я думаю, что проблема не в коде, который вы предоставляете. Все это происходит в основном потоке (UI)? Есть ли в вашем LogCat исключение или сообщение, которое может предоставить дополнительную информацию? Если да: пожалуйста, обновите свой пост, он поможет нам/другим решить вашу проблему. – gleerman

+0

Большое спасибо! В самом деле, я использовал многопоточный код, который был проблемой. Но мне интересно, почему он работал с Java-кодом, хотя я не делал invokeLater на нем. Код Android работал после того, как я добавил runOnUIthread. – user1382302

Смежные вопросы