Как использовать ConstraintSet на subCass of ConstraintLayout - PullRequest
0 голосов
/ 28 декабря 2018

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

Если япопробуйте установить ограничения из действия, которое я пробовал:

    ConstraintSet cs = new ConstraintSet();
    cs.clone(mBusinessWeek);
    cs.connect(mIds[0], ConstraintSet.START, mBusinessWeek.mId, ConstraintSet.START, 0);
    cs.setHorizontalBias(mIds[0], .5f);
    cs.connect(mIds[0], ConstraintSet.END, mIds[1], ConstraintSet.START, 8);
    cs.applyTo(mBusinessWeek);

Я изменил сигнатуру метода AddBusiness на

public void addBusinessDay(String txt, int id, int sId, int eId){

и сделал вызовы ограничений в концеmethod

    ConstraintSet cs = new ConstraintSet();
    cs.clone(this); // Even tried to comment this out
    cs.connect(id, ConstraintSet.START, sId, ConstraintSet.START, 0);
    cs.setHorizontalBias(id, .5f);
    cs.connect(id, ConstraintSet.END, eId, ConstraintSet.START, 8);
    cs.applyTo(this);

Ошибка при выполнении вызова клона (this).Если я прокомментирую призыв клонировать ошибки активности в applyTo (this);

Вот класс и один конструктор.

public class BusinessWeek extends ConstraintLayout {

    // My id
    public int mId;

    public BusinessWeek(Context c, ConstraintLayout parentLayout){
        super(c);
        ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        setLayoutParams(lp);

        mId = View.generateViewId();
        setId(mId);
        parentLayout.addView(this);
    }

    public void addBusinessDay(String txt, int id){
        TextView day = new TextView(getContext());
        ConstraintLayout.LayoutParams lp = new 
ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        day.setLayoutParams(lp);
        day.setText(txt);

        setId(id);
        addView(day);
    }
}

В своей деятельности я выполняю набор вызововcall:

// Get the parent ConstraintLayout
ConstraintLayout cl = findViewById(R.id.clServiceDay);
// Instantiate class
mBusinessWeek = new BusinessWeek(this, cl);

// Generate ViewIds
int[7] mIds = new int[7];
for (int i = 0; i <7; i++)
    mIds[i] = = View.generateViewId();

// Generate businessDays in a horizontal chain
mBusinessWeek.addBusinessDay("Mo", mIds[0]);
mBusinessWeek.addBusinessDay("Tu", mIds[1]);
mBusinessWeek.addBusinessDay("We", mIds[2]);
mBusinessWeek.addBusinessDay("Th", mIds[3]);
mBusinessWeek.addBusinessDay("Fr", mIds[4]);
mBusinessWeek.addBusinessDay("Sa", mIds[5]);
mBusinessWeek.addBusinessDay("Su", mIds[6]);

И это в основном работает, потому что наборы ограничений не установлены.Виды накапливаются в левой части страницы, как и следовало ожидать.

...