динамическая задача размещения элементов - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь создать Activity с динамическим номером Buttons, каждый из которых представляет объект Shadow.

Я не уверен, возможно ли это сделать с XMLфайл, поэтому я решил использовать вместо этого Java-код.

Вся идея отображения всех элементов List работает - у меня есть кнопка, сгенерированная для каждого Shadow в списке.

Моя проблема в том, что buttons все находятся в одном месте, самый большой из них охватывает остальные.Как я могу заставить их отображаться правильно, например, с расстоянием по вертикали 16 dp между ними?

Вот код класса:

package com.jackw.nfshadow;

import android.os.Bundle;
import android.support.constraint.ConstraintLayout;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;

import com.biernacki.nfshadow.tagdiscoveredactivities.Shadow;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class ShadowLibrary extends AppCompatActivity {

    private List<Shadow> savedShadows;
    private ConstraintLayout layout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if(savedInstanceState != null) {
            super.onCreate(savedInstanceState);
        }else{
            super.onCreate(new Bundle());
        }
        setContentView(R.layout.activity_shadow_library);
        layout  = findViewById(R.id.shadow_library);
        setButtonNames();
    }

    private void setButtonNames() {
        if(Main.savedShadows != null && Main.savedShadows.size() > 0){
            savedShadows = Main.savedShadows.stream()
                    .sorted(Comparator.comparing(Shadow::getName))
                    .collect(Collectors.toList());

            savedShadows.forEach(shadow -> {
                Button button = new Button(this);
                button.setId(View.generateViewId());
                button.setText(shadow.getName());
                layout.addView(button);
            });

        }
    }
}

Поскольку я совершенно новичок в Android, я также был бы признателенлюбая информация о других способах создания динамического контента / небольшой обзор кода, который я написал выше.

ОБНОВЛЕНИЕ: Я немного отредактировал setButtonNames(), все еще пытаюсь использоватьConstraintLayout и connect(), но по какой-то причине он все еще не работает.Я не могу найти, что не так с этим.

savedShadows.forEach(shadow -> {
                Button button = new Button(this);
                button.setId(View.generateViewId());
                button.setText(shadow.getName());

                if(shadow == savedShadows.get(0)){
                    previousButtonId = button.getId();
                }else{
                    constraints.connect(button.getId(), ConstraintSet.TOP, previousButtonId, ConstraintSet.BOTTOM, 16);
                    previousButtonId = button.getId();
                }
                constraints.applyTo(layout);
                layout.addView(button);
            });
        }
}

1 Ответ

0 голосов
/ 13 сентября 2018

Ваша проблема в том, что вы не добавляете ограничения для Button. Вы можете сделать это, как в этом примере, где layout - ваш ConstraintLayout:

ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(layout);
constraintSet.connect(someButton.getId(), ConstraintSet.TOP, 
                       anotherButton.getId(), ConstraintSet.BOTTOM);
constraintSet.applyTo(constraintLayout);

Вам нужно добавить ограничения, как вы хотите. Или замените ваш ConstraintLayout на LinearLayout, и он автоматически добавит кнопки правильно, без необходимости работать с ограничениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...