Как я могу динамически создать представление с ConstraintLayout? (Не работает) - PullRequest
0 голосов
/ 04 мая 2018

Я видел, что вы можете динамически создавать виджеты, используя LinearLayout. Но LinearLayout не имеет простых средств ограничения новых виджетов относительно друг друга.

Я нашел отличный пример здесь , который показывает, что я могу использовать constraintLayout.addView(widget) для создания нового виджета. Но каждый раз, когда я пробую это в своем коде, это убивает мое приложение, когда я применяю форматирование.

т.е. constraintSet.applyTo(constraintLayout) убивает приложение. Но это только убивает приложение, потому что constraintLayout .addView (виджет) не работает. (закомментируйте их, и код работает нормально, без новых виджетов, конечно)

Используйте LinearLayout, и я получаю новые виджеты, но форматирование - бла.

Вот моя активность .java

public class GuestList extends AppCompatActivity implements View.OnClickListener, TextWatcher{

    int counter = 0;
    EditText et,editTextNextGuest,editTextGuestName,editTextGuestNum;
    CheckBox checkBoxRSVP;
    **ConstraintLayout cl;
    ConstraintSet cs;**
    LinearLayout layout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guest_list);
        cl = (ConstraintLayout) findViewById(R.id.guestListMain);

        cs = new ConstraintSet();
        cs.clone(cl);

        et = (EditText) findViewById(R.id.guestName);
        et.setOnClickListener(this);
        et.addTextChangedListener( this);

    }


    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        if (counter == 0) {

            layout = (LinearLayout) findViewById(R.id.layout1);

            editTextGuestName = findViewById(R.id.guestName);

            editTextNextGuest = new EditText(this);
            editTextNextGuest.setEms(10);
            editTextNextGuest.setHint("Next Guest");
            editTextNextGuest.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);

            editTextGuestNum = new EditText(this);
            editTextGuestNum.setEms(2);
            editTextGuestNum.setHint("#");
            editTextGuestNum.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);

            checkBoxRSVP = new CheckBox(this);

            // I don't want to use linear layout because ConstraintLayout has better methods (connect, setMargin, etc.)
            layout.addView(editTextNextGuest);
            layout.addView(editTextGuestNum);
            layout.addView(checkBoxRSVP);

            **//These are the issue, I want to use them
            //This link-> http://www.uwanttolearn.com/android/constraint-layout-animations-dynamic-constraints-ui-java-hell/
            //Shows them working, but I can't get them to work.
//            cl.addView(editTextNextGuest);
//            cl.addView(editTextGuestNum);
//            cl.addView(checkBoxRSVP);

            cs.setMargin(editTextNextGuest.getId(),ConstraintSet.START,16);
            cs.connect(editTextNextGuest.getId(),ConstraintSet.TOP,editTextGuestName.getId(),ConstraintSet.BOTTOM);
            cs.connect(editTextNextGuest.getId(),ConstraintSet.END,editTextGuestNum.getId(),ConstraintSet.START);
            cs.connect(editTextGuestNum.getId(),ConstraintSet.END,checkBoxRSVP.getId(),ConstraintSet.START);
            cs.connect(checkBoxRSVP.getId(),ConstraintSet.END,ConstraintSet.PARENT_ID,ConstraintSet.END);

            Log.d("tag", "It gets here");
            cs.applyTo(cl);**

            counter++;
        }
    }

А вот и мой .xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/guestListMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".GuestList">

    <LinearLayout
        android:id="@+id/layout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></LinearLayout>
    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:layout_marginTop="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/rsvpTitle" />

    <EditText
        android:id="@+id/guestName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:ems="10"
        android:hint="Guest Name"
        android:inputType="textPersonName"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/guestTitle" />

1 Ответ

0 голосов
/ 11 мая 2018

Ваше приложение падает, потому что дочерние представления, которые вы пытаетесь добавить к ConstraintLayout, не имеют установленных идентификаторов. Чтобы решить эту проблему, вы можете сгенерировать и ID для каждого вида, используя View.generateViewId(), который вы хотите добавить в макет, например:

editTextNextGuest.setId(View.generateViewId());

или вы можете создать ids.xml в папке res/values:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="edit_text_next_guest" type="id" />
</resources>

и используйте его в таком коде:

editTextNextGuest.setId(R.id.edit_text_next_guest);

Обратите внимание, что необходимо установить идентификатор представления перед добавлением его в макет.

...