【问题标题】:Theme.MaterialComponents style ruins Firebase AuthUI layoutTheme.MaterialComponents 风格破坏 Firebase AuthUI 布局
【发布时间】: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 =&gt; ?android:attr/buttonStyle =&gt; @style/Widget.Material.Button,但设置@android:style/Widget.Material.Button 给出了相同的结果...... 有人知道如何找回图标吗?我不介意覆盖样式充气器,甚至使用实际样式 ID 而不是参考,但我找不到任何示例/解释这样做...请帮助

【问题讨论】:

  • 你试过在xml布局中改变父布局的主题吗?我想它可能对你有帮助!
  • 启动登录屏幕的 Activity 是我的 SplashActivity,我在清单中为其分配了以下主题:&lt;style name="AppTheme.Splash" parent="Theme.AppCompat.DayNight.NoActionBar"&gt; &lt;item name="android:windowBackground"&gt;@drawable/splash_drawable&lt;/item&gt; &lt;/style&gt; 与更改我的主要样式之前一样。按照您的建议,我也尝试在 xml 布局中设置它(这是您的意思吗?),但它是一样的 :(
  • 你是否在splash的activity xml布局中将主题设置为父布局?如果这不起作用,请尝试为材质组件制作不同的样式,并让父主题正常,并在需要的活动中使用材质主题。
  • 我的启动活动 xml 布局看起来像这样:&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;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"/&gt;,但它不起作用。我想不使用默认名称“AppTheme”作为我的实际应用程序主题会解决这个问题,但我试图避免这种情况。我会试试看是否有效。如果您有任何其他想法,请分享:)
  • 它确实修复了登录屏幕,但我仍然希望有一个更好的解决方案(因为我不喜欢“必须记住”来更改每个活动的主题,以保持统一的应用主题)。

标签: android kotlin firebase-authentication firebaseui material-components-android


【解决方案1】:

别担心它很简单,只需使用一个桥主题:

Theme.MaterialComponents.Bridge
Theme.MaterialComponents.Light.Bridge
Theme.MaterialComponents.NoActionBar.Bridge
Theme.MaterialComponents.Light.NoActionBar.Bridge
Theme.MaterialComponents.Light.DarkActionBar.Bridge

Bridge 主题继承自 AppCompat 主题,但也为您定义了新的 Material Components 主题属性。如果您使用桥接主题,则可以在不更改应用主题的情况下开始使用 Material Design 组件。 (来自文档)

看看:Get Started - Material design

您面临的是材料主题适用于所有按钮的默认色调的结果。如果需要,您可以使用 app:backgroundTint="none" 移除色调,按钮的原始背景将显示。

【讨论】:

  • 很抱歉花时间回到这里。更改为 Bridge 有效!但由于它是一个新应用程序,使用这个“后备”主题感觉很奇怪——我还没有足够的代码说“我不能将我的主题更改为从 Material Components 主题继承”......我想尝试您的其他解决方案,但我应该将app:backgroundTint="none" 放在哪里?我不拥有有问题的布局文件,因此无法将其添加到其中的按钮标签中。
猜你喜欢
  • 2021-12-10
  • 2020-08-27
  • 1970-01-01
  • 2013-04-07
  • 2011-09-22
  • 2019-08-06
  • 1970-01-01
  • 2013-12-06
  • 2018-11-28
相关资源
最近更新 更多