You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android布局中登录按钮渲染异常及点击崩溃问题求助

登录页面按钮样式异常及点击崩溃问题排查

问题背景

我创建了一个包含Google登录和邮箱登录按钮的登录页面,但遇到两个问题:

  1. 按钮样式不符合预期:实际渲染为下拉选择器样式,预期是标准FirebaseUI登录按钮样式
  2. 点击任一按钮触发崩溃,报错:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:52:03