Я видел, что вы можете динамически создавать виджеты, используя 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" />