应用程序的主题与系统不同时显示网格布局的问题

问题描述 投票:0回答:1

我的 Gridlayout 元素有问题,无法正确加载。 如果我的 Android 应用程序的主题与手机系统的主题不同,则元素不可见。

我有正常的网格布局:

<GridLayout
        android:id="@+id/gridLayoutMainPage"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_gravity="center"
        android:layout_marginStart="5dp"
        android:layout_marginEnd="5dp"
        android:alignmentMode="alignMargins"
        android:columnCount="2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view5"
        app:layout_constraintVertical_bias="0.5" />

该函数获取对象列表(包含每个元素的信息),然后创建一张卡片并将其添加到布局中:

fun generateCards(cards : List<CardDataHolder>, gridLayout: GridLayout) {
        for (card in cards) {
            val cardview: View = LayoutInflater.from(context)
                .inflate(R.layout.item_main_page_cardview, gridLayout, false)
            val params = GridLayout.LayoutParams()
            params.width = GridLayout.LayoutParams.WRAP_CONTENT;
            params.height = GridLayout.LayoutParams.WRAP_CONTENT;
            params.setMargins(10, 25, 10, 25);
            cardview.layoutParams = params;
            cardview.findViewById<TextView>(R.id.title_card_main_page).text = card.title
            cardview.findViewById<ImageView>(R.id.icon_card_main_page).setImageResource(card.icon)

            cardview.setOnClickListener(View.OnClickListener {
                switchFragment(card.fragment)
                card.fragment.view?.invalidate()
            })

            gridLayout.addView(cardview);
        }
    }

但是如果应用程序主题与手机系统主题相同(浅色/浅色或深色/深色),它可以正常工作,但否则它不会显示任何内容。只是静态内容,例如在 xml 文件中定义的文本视图和图像视图。但网格布局没有被卡片填满。

有人可以帮我吗?重新验证后我尝试了一些,但我无法弄清楚。 谢谢

我尝试在更改后重新验证视图,因为我猜应用程序首先以默认系统主题启动,然后交换主题。所以我在交换重新验证后尝试,并将主题交换功能移到末尾,这样它就会在所有元素初始化后发生,但是,即使在代码的开头或结尾,它也不起作用。

Correct state (app and system theme is the same)

bad state (app and system theme are different)

android kotlin android-xml android-theme android-gridlayout
1个回答
0
投票

我知道发生了什么事。当应用程序启动时,系统颜色主题将应用于其上。但如果系统颜色主题与应用程序主题不同,则有一个步骤将应用程序主题“硬”设置为其主题而不是系统。当执行此步骤时,再次渲染片段,但这次没有将值传递给它们,因为这种情况仅在初始化时发生。所以结果是:

片段使用正确的值进行渲染,然后重新渲染,但垃圾收集器丢失了值,然后用户看不到正确的视图。

解决方案:在声明片段时不手动传递数据,而是在创建片段时提供自动将数据提取到片段中的功能,这样即使我创建新实例,它也会提取正确的数据。

© www.soinside.com 2019 - 2024. All rights reserved.