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

50few1ms  于 2024-01-04  发布在  Android
关注(0)|答案(1)|浏览(202)

我在Gridlayout中的元素有问题,无法正常加载。如果我的Android应用程序的主题与手机系统不同,则元素不可见。
我有正常的网格布局:

  1. <GridLayout
  2. android:id="@+id/gridLayoutMainPage"
  3. android:layout_width="wrap_content"
  4. android:layout_height="0dp"
  5. android:layout_gravity="center"
  6. android:layout_marginStart="5dp"
  7. android:layout_marginEnd="5dp"
  8. android:alignmentMode="alignMargins"
  9. android:columnCount="2"
  10. app:layout_constraintBottom_toBottomOf="parent"
  11. app:layout_constraintEnd_toEndOf="parent"
  12. app:layout_constraintHorizontal_bias="0.5"
  13. app:layout_constraintStart_toStartOf="parent"
  14. app:layout_constraintTop_toBottomOf="@+id/view5"
  15. app:layout_constraintVertical_bias="0.5" />

字符串
和函数,采取listo的对象(持有有关每个元素的信息),并通过和创建一个卡,并将其添加到布局:

  1. fun generateCards(cards : List<CardDataHolder>, gridLayout: GridLayout) {
  2. for (card in cards) {
  3. val cardview: View = LayoutInflater.from(context)
  4. .inflate(R.layout.item_main_page_cardview, gridLayout, false)
  5. val params = GridLayout.LayoutParams()
  6. params.width = GridLayout.LayoutParams.WRAP_CONTENT;
  7. params.height = GridLayout.LayoutParams.WRAP_CONTENT;
  8. params.setMargins(10, 25, 10, 25);
  9. cardview.layoutParams = params;
  10. cardview.findViewById<TextView>(R.id.title_card_main_page).text = card.title
  11. cardview.findViewById<ImageView>(R.id.icon_card_main_page).setImageResource(card.icon)
  12. cardview.setOnClickListener(View.OnClickListener {
  13. switchFragment(card.fragment)
  14. card.fragment.view?.invalidate()
  15. })
  16. gridLayout.addView(cardview);
  17. }
  18. }


但如果应用程序主题是相同的电话系统主题(光/光或暗/暗)它工作正常,但否则它不显示任何东西.只是静态内容,如文本视图和图像视图中定义的xml文件.但gridlayout是不是充满了卡.
有人能帮我吗?我在重新验证后试了一些,但是我弄不明白。谢谢
我试图在更改后重新验证视图,因为我猜首先应用程序使用默认的系统主题启动,然后它交换了主题。所以我尝试在交换重新验证后,并将主题交换函数移到末尾,以便在所有元素初始化后发生,但是,它甚至在代码的开始或结束时都不起作用。
Correct state (app and system theme is the same)
bad state (app and system theme are different)

kjthegm6

kjthegm61#

我发现了发生了什么。当应用程序启动时,系统颜色主题被应用于它。然后值被初始化并呈现视图。但是如果系统颜色主题与应用程序主题不同,则有一个步骤,应用程序主题被“硬”设置为其主题而不是系统。当执行此步骤时,片段再次呈现,但这次值没有传递到它们中,因为这只发生在初始化中,所以结果是:
使用正确的值呈现片段,然后重新呈现,但垃圾收集器丢失了值,然后用户没有看到正确的视图。
解决方案:在声明片段时不手动传递数据,但在创建时自动将数据提取到片段中的功能,因此即使我创建了新示例,它也会提取正确的数据。

相关问题