Программно добавляем макет + потомки - PullRequest
0 голосов
/ 14 апреля 2019

В настоящее время я изучаю основы программирования на Android. Я могу создать статическое приложение с одной страницей и несколькими кнопками. Следующий шаг - научиться динамически создавать приложения, как я привык в веб-приложениях.

То, что я пытаюсь сделать, - это создать простое приложение, похожее на Facebook, с некоторыми объектами временной шкалы, текстом, кнопкой «лайк» и датой размещения. Существует простой сервер NodeJS, который отвечает на запрос HTTP GET файлом JSON. Который анализируется, и для каждого объекта в массиве должен быть создан объект временной шкалы, как на Facebook.

На моей домашней странице я создаю динамический контент для объектов временной шкалы.

    ConstraintLayout container = activity.findViewById(R.id.container);
    container.removeAllViews();
    TextView nav_txt = activity.findViewById(R.id.nav_txt);
    nav_txt.setText("Home");
    swipeRefreshLayout = new SwipeRefreshLayout(activity);
    ScrollView scrollView = new ScrollView(activity);
    container.addView(swipeRefreshLayout);
    scrollView.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            ConstraintLayout.LayoutParams.MATCH_PARENT));
    linearLayout = new LinearLayout(activity);
    linearLayout.setOrientation(LinearLayout.VERTICAL);
    linearLayout.setId(R.id.linearLayout);
    swipeRefreshLayout.addView(scrollView);
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refreshData();
        }
    });
    scrollView.addView(linearLayout);

Это просто, представления не нуждаются в каких-либо ограничениях, потому что все имеют ту же высоту, что и родительский.

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

Мой timeline_message.xml выглядит так:

<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:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.constraint.ConstraintLayout
    android:id="@+id/timeline_msg"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:layout_marginTop="8dp"
    android:background="@color/backgroundColor"
    app:layout_constraintTop_toTopOf="parent">

    <Button
        android:id="@+id/like_btn"
        android:layout_width="90dp"
        android:layout_height="91dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:background="@color/colorPrimary"
        android:text="Like"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/username"
        android:layout_width="272dp"
        android:layout_height="55dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:gravity="center_vertical"
        android:text="text"
        android:textAlignment="center"
        android:textColor="@color/colorPrimary"
        android:textSize="20sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/like_btn"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/date"
        android:layout_width="91dp"
        android:layout_height="40dp"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:gravity="center_vertical"
        android:text="TextView"
        android:textAlignment="center"
        android:textColor="@color/colorPrimary"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.003"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/username"
        app:layout_constraintVertical_bias="0.0" />
</android.support.constraint.ConstraintLayout>

И я пытаюсь схватить объект + дети вот так:

    LinearLayout linearLayout = activity.findViewById(R.id.linearLayout);
    ConstraintLayout timelineMsg = activity.findViewById(R.id.timeline_msg);
    linearLayout.addView(timelineMsg);

Но ничего не происходит. Возможен ли такой подход? Или вам нужно написать весь этот код вручную с помощью layoutparams и ограничений e.t.c.?

1 Ответ

0 голосов
/ 19 апреля 2019

Вы близки, вы просто что-то забыли

Если вы хотите использовать макет timeline_message.xml, вам нужно его надуть до

Пример:

  LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

Тогдавы можете использовать ваш инфлятор для надувания вида

  View view = inflater.inflate(R.layout.timeline_message, null);

Теперь вы можете использовать свой взгляд для нахождения вашего элемента

 ConstraintLayout timelineMsg = view.findViewById(R.id.timeline_msg);

Для завершения вы можете добавить свой вид надувания в свой контейнер с помощью

 linearLayout.addView(view);
...