Схема ограничения - видимость группы не работает внутри динамического модуля
Кто-нибудь испытывал проблемы с ConstraintLayout
видимость группы? я использую ConstraintLayout
1.1.3 и я устанавливаю видимость группы в обоих XML
макет и код Java. Но это не меняет статус видимости. Это всегда видно.
Это файл макета
<?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:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_message_icon_activity_dictionary"
android:layout_width="@dimen/message_icon_width"
android:layout_height="@dimen/message_icon_height"
android:layout_marginBottom="@dimen/message_text_view_margin_top"
android:contentDescription="@string/app_name"
android:src="@drawable/icon_error"
app:layout_constraintBottom_toTopOf="@+id/tv_message_activity_dictionary"
app:layout_constraintEnd_toEndOf="@id/tv_message_activity_dictionary"
app:layout_constraintStart_toStartOf="@id/tv_message_activity_dictionary" />
<TextView
android:id="@+id/tv_message_activity_dictionary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginStart="20dp"
android:gravity="center"
android:textColor="@color/black"
android:textSize="@dimen/medium_text_size"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="@string/msg_no_internet" />
<Button
android:id="@+id/btn_try_again_activity_dictionary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/try_again_button_margin_top"
android:background="@drawable/rounded_button"
android:minHeight="30dp"
android:minWidth="@dimen/try_again_button_width"
android:padding="10dp"
android:text="@string/btn_try_again"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="@dimen/text_size_5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_message_activity_dictionary" />
<android.support.constraint.Group
android:id="@+id/group_component_activity_dictionary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="btn_try_again_activity_dictionary,tv_message_activity_dictionary,iv_message_icon_activity_dictionary" />
</android.support.constraint.ConstraintLayout>
Что может быть причиной этого?
ОБНОВИТЬ:
Я забыл упомянуть, что я использую этот макет внутри динамического модуля. Также я проверил это с помощью базового модуля, и он работает как положено, но не в динамическом модуле. Итак, наконец, я выяснил причину проблемы. Кроме того, когда я отлаживал код и оценивал это выражение (group.getVisibility == View.GONE), это давало мне значение ИСТИНА (хотя представления внутри группы все еще видны)
Любое предложение приветствуется.
7 ответов
Нашел исправление для этой проблемы, и я надеюсь, что это сэкономит время для кого-то еще. Странно, но причина этой проблемы - использование ConstraintLayout - Group внутри динамического модуля.
Итак, исправление в коде Java, как только вы получили ссылку на группу, установите идентификаторы ссылок с помощью массива int, как показано ниже:
Group group = findViewById(R.id.group);
group.setReferencedIds(new int[]{R.id.btn_try_again_activity_dictionary, R.id.tv_message_activity_dictionary, R.id.iv_message_icon_activity_dictionary});
После этого все работает как положено. Поэтому нет необходимости устанавливать видимость отдельных представлений в группе.
Не забывайте, что вы можете использовать
androidx.constraintlayout.widget.Group
только если родительский вид
constraintlayout
если родитель, то это не сработает, тогда вы можете попробовать этот ответ , в котором говорится, что вы добавляете необходимые представления внутри
FrameLayout
или же
LinearLayout
затем установите видимость подчиненного родительского представления.
У меня была такая же проблема с использованием ConstraintLayout v1.1.3
. Я устанавливал видимость группы в XML, но это не сработало.
Как ConstraintLayout v2.0.0
уже находится на стадии бета-тестирования, я перешел с v1.1.3
к v2.0.0-beta2
(проверьте последнюю версию), и проблема больше не возникает. Теперь я могу без проблем изменить видимость группы из XML или кода.
У меня такая же проблема, хотя я использую 2.0.0-beta8.group.visibility = View.GONE/VISIBLE
не работает но
group.isGone = true/false
работает
Я должен добавить, в чем была моя проблема - я по ошибке не поставил
Group
виджет внутри
ConstraintLayout
и не мог понять, почему он работает в одном макете и не работает в другом. К счастью, я не тратил на это много времени, но эта ошибка все еще может произойти.
Это будет исправлено с помощью ConstraintLayout
2.0.2
.
https://androidstudio.googleblog.com/2020/10/constraintlayout-202.html
Вам необходимо использовать атрибут isGone для групп в макете ограничений, и группы будут правильно работать с родительским макетом в качестве макета ограничений.