2015-08-30 4 views
1

Я пишу приложение, которое загружает ряд кнопок (2 кнопки, затем черную линию внизу) для каждого найденного файла (так что количество циклов не будет статическим). В настоящее время во время построения у меня есть счетчик статического цикла до 15. Но при запуске кода он создает большую кнопку слева и черную линию под тонкой ... Но ... Маленькая кнопка справа появляется только один раз. Любая идея почему?Относительная компоновка android loopable

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ScrollView scrollPictures = new ScrollView(this); 
    RelativeLayout appLayout = new RelativeLayout(this); 
    // appLayout.setClipBounds(null); 
    Resources r = getResources(); 
    ImageView blackLine; 

    RelativeLayout.LayoutParams p; 
    int id = 1; 
    for(int x = 1; x <= 15; x++){ 
     p = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT); 
     Button studentsButton = new Button(this); 
     studentsButton.setClipBounds(null); 
     studentsButton.setId(id); 
     studentsButton.setHeight((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, r.getDisplayMetrics())); 
     studentsButton.setWidth((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 700, r.getDisplayMetrics())); 
     //studentsButton.setBackgroundColor(Color.LTGRAY); 
     if (x > 1){ 
      p.addRule(RelativeLayout.BELOW, id - 1); 
      studentsButton.setLayoutParams(p); 
     } 

     appLayout.addView(studentsButton); 
     id ++; 

     p = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT); 
     Button soundButton = new Button(this); 
     soundButton.setClipBounds(null); 
     soundButton.setHeight((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, r.getDisplayMetrics())); 
     soundButton.setWidth((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, r.getDisplayMetrics())); 
     //soundButton.setBackgroundColor(Color.LTGRAY); 
     p.addRule(RelativeLayout.RIGHT_OF, id - 1); 
     soundButton.setLayoutParams(p); 
     appLayout.addView(soundButton); 

     p = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT); 
     blackLine = new ImageView(this); 
     blackLine.setId(id); 
     blackLine.setBackgroundColor(Color.BLACK); 
     blackLine.setMinimumWidth((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 700, r.getDisplayMetrics())); 
     blackLine.setMinimumHeight(3); 
     blackLine.setMinimumWidth((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 700, r.getDisplayMetrics())); 
     blackLine.setClipBounds(null); 
     p.addRule(RelativeLayout.BELOW, id - 1); 
     blackLine.setLayoutParams(p); 
     appLayout.addView(blackLine); 
     id++; 


    } 

    scrollPictures.addView(appLayout); 
    setContentView(scrollPictures); 

} 

ответ

0

Честно говоря, это похоже на излишний шум, чтобы сделать все это в коде. Я бы рекомендовал создать файл макета и раздуть его несколько раз. Сделать appLayout в LinearLayout с вертикальной ориентацией, это было бы так просто, как это:

for(int x = 1; x <= 15; x++){ 
    View view = LayoutInflater.from(this).inflate(R.layout.some_layout, appLayout, false); 

    // Configure the items inside the view 

    Button button1 = (Button)view.findViewById(R.id.button1); 
    button1.setText("Button 1"); 
    button1.setOnClickListener(new View.OnClickListener() { ... }); 

    ... 

    appLayout.addView(view); 
} 

и файл макета будет относительно просто слишком:

<LinearLayout android:orientation="vertical" ...> 
    <LinearLayout android:orientation="horizontal" ...> 
    <Button android:id="@+id/button1" ... /> 
    <Button android:id="@+id/button2" ... /> 
    </LinearLayout> 
    <View android:background="@android:color/black" 
     android:layout_height="3dp" 
     android:layout_width="match_parent" /> 
</LinearLayout> 

При укладке из элементов в коде, безусловно, DO- возможно, головная боль может стать правильной. Мне легче использовать XML-файлы и раздувать их по мере необходимости. Моя догадка заключается в том, как вы используете свои идентификаторы, это путает макет. Вероятно, лучше всего позволить кнопкам получить свой собственный идентификатор (не использовать setId) и использовать метод getId при настройке параметров относительного расположения.

+0

Я пробовал делать это по-своему, но определение «вид» вызывает ошибку. В начале «getContext()» - это не метод, который можно разрешить. Затем, если я использую «getApplicationContext()», это вызывает ошибку; from() в LayoutInflater нельзя применить к ...... Любая идея? –

+0

это зависит от того, откуда вы его вызываете. Если вы работаете, просто используйте «this» – Matt

+0

. Я получаю ту же ошибку, что и раньше: «from() в LayoutInflater не может быть применено к« ....... Обязательно: Контекст, Найдено: MainActivity, LinearLayout, boolean , причина: фактические и формальные списки аргументов различаются по длине –

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