2013-03-31 4 views
2

У меня есть ScrollView, и я хочу вставить указанное пользователем число HorizontalScrollViews. Так что пользователь говорит, что хочет иметь матрицу из элементов 5x5, я хочу вставить 5 HorizontalScrollViews с 5 объектами EditText. Моя программа добавляет первую строку так же, как и предполагалось, но в остальном нет.Android: динамически добавлять представления в ScrollView

for (int i = 0; i < number; i++) { 
     LinearLayout ll = new LinearLayout(this); 
     ll.setLayoutParams(par2); 
     HorizontalScrollView row = new HorizontalScrollView(this); 
     row.setLayoutParams(par1); 
     row.addView(ll); 
     for (int j = 0; j < number; j++) { 
      EditText txt = new EditText(this); 
      txt.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
      txt.setHint(i+","+j); 
      ll.addView(txt); 
     } 
     latout_in_scrollview.addView(row); 
    } 

Любые идеи, почему? Благодаря!

EDIT: в соотношении 1: 1 Код им с помощью

LinearLayout dijkstra_rows; 
FrameLayout.LayoutParams par1 = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
LinearLayout.LayoutParams par2 = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layout_dijkstra); 

    dijkstra_rows = (LinearLayout) findViewById(R.id.dijkstra_rows); 

    Bundle extras = getIntent().getExtras(); 
    number = extras.getInt("vertexes"); 

    for (int i = 0; i < number; i++) { 
     LinearLayout ll = new LinearLayout(this); 
     ll.setLayoutParams(par2); 
     HorizontalScrollView row = new HorizontalScrollView(this); 
     row.setLayoutParams(par1); 
     row.addView(ll); 
     for (int j = 0; j < number; j++) { 
      EditText txt = new EditText(this); 
      txt.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
      txt.setHint(i+","+j); 
      ll.addView(txt); 
     } 
     dijkstra_rows.addView(row); 
    } 
} 
+0

Вы, вероятно, получите исключение .. Что-то говорит, что ScrollViw имеет только один прямой ребенок – Pragnani

ответ

1

ScrollView является единым элементом контейнера.

ScrollView - это FrameLayout, что означает, что вы должны поместить одного ребенка в , содержащего все содержимое для прокрутки; этот ребенок сам может быть менеджером компоновки со сложной иерархией объектов. Ребенок, который является , часто используется LinearLayout в вертикальной ориентации, представляя вертикальный массив элементов верхнего уровня, которые пользователь может прокрутить.

+0

Да, я знаю, у меня есть один LinearLayout вертикально ориентирован в ScrollView. Я описал это неправильно в снайпере, я установил его. –

+0

Было бы лучше, если бы вы разместили фактический код, который используете ... – ElefantPhace

+0

Ну, это в значительной степени код, который я использую. Но я добавил точную копию –

0

Вы добавляете несколько LinearLayouts здесь

for (int i = 0; i < number; i++) { 
     LinearLayout ll = new LinearLayout(this); 
. 
. 
} 

Вы должны иметь только один из этого цикла. Затем добавьте это в свой scrollView, в Loop вы можете добавить мулине HorizontolScrollViews к этому LinearLayout

2

ScrollView может содержать только один childView. Вы можете разместить любой макет в соответствии с вашим требованием. Я обычно использую Relative Layout ...

Затем добавить взгляды динамически относительного макет

viewLayout = (ViewGroup) mView.findViewById(R.id.YOUR_RELATIVE_LAYOUT_ID); 
     View lastCard = viewLayout.getChildAt(viewLayout.getChildCount() - 1); 

    // INFLATE YOUR NEW VIEW YOU WANT TO ADD 
       CardView cardView = (CardView) 

LayoutInflater.from(getContext()).inflate(R.layout.card_nearest_stop, null); 
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

      //Set id to view 
      int id = 125; 
      if (lastCard != null) { 
       params.addRule(RelativeLayout.BELOW, lastCard.getId()); 
       id = lastCard.getId() + 125; 
      } 
      cardView.setLayoutParams(params); 
      cardView.setId(id); 
      viewLayout.addView(cardView);