【发布时间】:2021-01-16 02:34:09
【问题描述】:
我正在用 kotlin 编写我的第一个应用程序,并且正在使用 FirebaseAuth 和 AuthUI 进行身份验证。我的登录屏幕运行良好,看起来像:
现在我正在尝试将 AppTheme 的父级更改为“Theme.MaterialComponents.NoActionBar”(来自“Theme.AppCompat.NoActionBar”),但登录屏幕更改为:
我这样称呼登录屏幕:
startActivityForResult(
authUI.createSignInIntentBuilder()
.setAvailableProviders(providers)
.build(),
RC_SIGN_IN
)
我尝试在.build() 之前添加.setTheme(R.style.FirebaseUI),但它什么也没做。我还尝试.setTheme(R.style.AppTheme) 只是为了检查会发生什么,它将背景更改为深色主题,但按钮仍然是紫色并且没有图标。有可能解决这个问题吗?
请帮帮我
(也,不是很相关,但可能解决方案是相同的:AuthUI 默认使用 Google Smart Lock,我注意到它的对话框不受我设置为 AuthUI 的主题的影响。是否可以设置它到暗模式?)
谢谢!
编辑:
正如 Himanshu Choudhary 在 cmets 中建议的那样,为材质组件制作不同的样式,将父主题保留为 AppCompat 并在所有活动中使用材质主题,可以解决问题,但它代表布局预览中的问题(因为他们使用应用主题)。我找到了部分解决方案: 像这样制作新样式:
<style name="AppTheme.SignInScreen" parent="Theme.AppCompat.NoActionBar">
<item name="materialButtonStyle">?attr/buttonStyle</item>
</style>
并将其设置为带有.setTheme(R.style.AppTheme_SignInScreen) 结果的登录屏幕:
我通过查看AppCompatButton 类构造函数找到了?attr/buttonStyle。不幸的是,当我在该构造函数中设置调试点时,如果我将应用程序主题设置为AppCompat(defStyleAttr=2130903157) 或MaterialComponents(defStyleAttr=2130903586),我会得到不同的defStyleAttr。在使用AppCompat 应用程序主题时,我试图通过设置它并查看提示来找到它所引用的内容,我发现了这个:?attr/buttonStyle => ?android:attr/buttonStyle => @style/Widget.Material.Button,但设置@android:style/Widget.Material.Button 给出了相同的结果......
有人知道如何找回图标吗?我不介意覆盖样式充气器,甚至使用实际样式 ID 而不是参考,但我找不到任何示例/解释这样做...请帮助
【问题讨论】:
-
你试过在xml布局中改变父布局的主题吗?我想它可能对你有帮助!
-
启动登录屏幕的 Activity 是我的 SplashActivity,我在清单中为其分配了以下主题:
<style name="AppTheme.Splash" parent="Theme.AppCompat.DayNight.NoActionBar"> <item name="android:windowBackground">@drawable/splash_drawable</item> </style>与更改我的主要样式之前一样。按照您的建议,我也尝试在 xml 布局中设置它(这是您的意思吗?),但它是一样的 :( -
你是否在splash的activity xml布局中将主题设置为父布局?如果这不起作用,请尝试为材质组件制作不同的样式,并让父主题正常,并在需要的活动中使用材质主题。
-
我的启动活动 xml 布局看起来像这样:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:theme="@style/AppTheme.Splash" tools:context=".ui.SplashActivity"/>,但它不起作用。我想不使用默认名称“AppTheme”作为我的实际应用程序主题会解决这个问题,但我试图避免这种情况。我会试试看是否有效。如果您有任何其他想法,请分享:) -
它确实修复了登录屏幕,但我仍然希望有一个更好的解决方案(因为我不喜欢“必须记住”来更改每个活动的主题,以保持统一的应用主题)。
标签: android kotlin firebase-authentication firebaseui material-components-android