Android布局中登录按钮渲染异常及点击崩溃问题求助
登录页面按钮样式异常及点击崩溃问题排查
问题背景
我创建了一个包含Google登录和邮箱登录按钮的登录页面,但遇到两个问题:
- 按钮样式不符合预期:实际渲染为下拉选择器样式,预期是标准FirebaseUI登录按钮样式
- 点击任一按钮触发崩溃,报错:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.IBinder android.view.View.getApplicationWindowToken()' on a null object reference
我已确认按钮视图不为空,相关代码如下:
布局代码
<com.firebase.ui.auth.ui.phone.CountryListSpinner android:id="@+id/signInButton" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/FirebaseUI.Button.AccountChooser.GoogleButton" android:text="@string/fui_sign_in_with_google" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" /> <com.firebase.ui.auth.ui.phone.CountryListSpinner android:id="@+id/emailSignInButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/signInButton" android:layout_centerHorizontal="true" style="@style/FirebaseUI.Button.AccountChooser.EmailButton" android:text="@string/fui_sign_in_with_email" tools:ignore="UnusedIds" />
Activity代码(onCreate部分)
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); crashlytics = FirebaseCrashlytics.getInstance(); context = getApplicationContext(); try { setContentView(R.layout.activity_login); } catch (RuntimeException ex) { Toast.makeText(this, getString(R.string.install_from_google_play), Toast.LENGTH_LONG).show(); crashlytics.log("Crash on setContentView() in LoginActivity.java: " + ex.getLocalizedMessage()); return; } Trace myTrace = FirebasePerformance.getInstance().newTrace("test_trace"); myTrace.start(); settings = getSharedPreferences(OPENCOMMENTS_SETTINGS, Context.MODE_PRIVATE); editor = settings.edit(); // Views findViewById(R.id.signInButton).setOnClickListener(this); findViewById(R.id.emailSignInButton).setOnClickListener(this); }
项目Gradle配置
buildscript { repositories { jcenter() google() } dependencies { classpath 'com.android.tools.build:gradle:7.4.0-alpha07' classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath 'com.google.firebase:perf-plugin:1.4.2' } } allprojects { repositories { jcenter() google() } } task clean(type: Delete) { delete rootProject.buildDir }
问题原因及解决方案
1. 核心问题:控件类型错误
你在布局中使用的com.firebase.ui.auth.ui.phone.CountryListSpinner是手机号登录场景下选择国家代码的下拉选择控件,并非登录按钮。这个控件本身的UI结构就是下拉选择器,即使你设置了登录按钮的样式,也无法覆盖它的原生样式,这就是按钮显示异常的原因。
同时,该控件的点击逻辑依赖内部未初始化的视图组件,点击时会触发空指针异常,导致崩溃。
2. 修正方案
将布局中的CountryListSpinner替换为正确的按钮控件,推荐两种方式:
方式一:使用普通Button + FirebaseUI样式
<!-- Google登录按钮 --> <Button android:id="@+id/signInButton" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/FirebaseUI.Button.AccountChooser.GoogleButton" android:text="@string/fui_sign_in_with_google" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" /> <!-- 邮箱登录按钮 --> <Button android:id="@+id/emailSignInButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/signInButton" android:layout_centerHorizontal="true" style="@style/FirebaseUI.Button.AccountChooser.EmailButton" android:text="@string/fui_sign_in_with_email" tools:ignore="UnusedIds" />
方式二:使用Google官方SignInButton(仅Google登录)
<com.google.android.gms.common.SignInButton android:id="@+id/signInButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginBottom="20dp" /> <!-- 邮箱登录仍用Button --> <Button android:id="@+id/emailSignInButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/signInButton" android:layout_centerHorizontal="true" style="@style/FirebaseUI.Button.AccountChooser.EmailButton" android:text="@string/fui_sign_in_with_email" tools:ignore="UnusedIds" />
3. 额外检查
确保模块级build.gradle中已正确引入FirebaseUI Auth依赖,版本需与其他Firebase依赖兼容(示例版本):
implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
内容的提问来源于stack exchange,提问作者FractalBob
相关产品推荐
相关产品推荐

