Android集成Google登录时顶部黑条闪烁下滑问题求助
解决Google登录后状态栏黑条闪烁的问题
你遇到的这个状态栏黑条闪烁下滑的问题,大概率是Google登录界面返回时的窗口过渡动画冲突,或是GoogleApiClient自动管理机制引发的窗口状态异常。结合你的代码,我整理了几个可行的解决方案:
方案1:手动管理GoogleApiClient生命周期(替代enableAutoManage)
enableAutoManage虽能自动处理GoogleApiClient生命周期,但有时会触发不必要的窗口状态变更,进而导致状态栏异常。改成手动管理试试:
修改你的LoginActivity代码,移除enableAutoManage,在onStart和onStop中手动处理连接/断开逻辑:
class LoginActivity() : AppCompatActivity(), GoogleApiClient.OnConnectionFailedListener { var RC_SIGN_IN: Int = 0 lateinit var mSignInButton: TextView; lateinit var mMainLogoImage: ImageView; lateinit var gac: GoogleApiClient // 移至类级别变量 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) // 初始化视图 mSignInButton = findViewById(R.id.loginTextView); mMainLogoImage = findViewById(R.id.mainLogoImage); val gso: GoogleSignInOptions = GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build() gac = GoogleApiClient .Builder(this) // 移除enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build() mSignInButton.setOnClickListener { val signInIntent: Intent = Auth.GoogleSignInApi.getSignInIntent(gac) startActivityForResult(signInIntent, RC_SIGN_IN) } } // 添加手动生命周期管理 override fun onStart() { super.onStart() gac.connect() } override fun onStop() { super.onStop() if (gac.isConnected) { gac.disconnect() } } override fun onConnectionFailed(p0: ConnectionResult) {} override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == RC_SIGN_IN) { val result: GoogleSignInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data) handleSignInResult(result); } } private fun handleSignInResult(signInResult: GoogleSignInResult) { if(signInResult.isSuccess) { // val intent = Intent(this, MainActivity::class.java) //startActivity(intent) } else { Toast.makeText(this, "Failed to log in, please try again later.", Toast.LENGTH_LONG).show() } } }
方案2:调整Activity主题,避免全屏冲突
检查AndroidManifest.xml中LoginActivity的主题设置,确保未使用强制全屏或隐藏状态栏的主题(比如Theme.AppCompat.Light.NoActionBar.Fullscreen),如果有,替换为普通非全屏主题:
<activity android:name=".LoginActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar"> </activity>
若必须使用全屏,可在onCreate中手动设置状态栏透明,避免切换时的闪烁:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 配置状态栏 window.apply { clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN statusBarColor = Color.TRANSPARENT } setContentView(R.layout.activity_login) // ... 其他代码 }
方案3:禁用Google登录界面的过渡动画
启动Google登录Intent时禁用过渡动画,避免返回时的动画冲突:
mSignInButton.setOnClickListener { val signInIntent: Intent = Auth.GoogleSignInApi.getSignInIntent(gac) startActivityForResult(signInIntent, RC_SIGN_IN) // 禁用过渡动画 overridePendingTransition(0, 0) }
同时在登录成功跳转MainActivity时,可设置平缓的过渡动画:
private fun handleSignInResult(signInResult: GoogleSignInResult) { if(signInResult.isSuccess) { val intent = Intent(this, MainActivity::class.java) startActivity(intent) overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) finish() } else { Toast.makeText(this, "Failed to log in, please try again later.", Toast.LENGTH_LONG).show() } }
建议先尝试方案1,这是解决此类问题最常见的方法,因为enableAutoManage的自动生命周期管理有时会和应用窗口状态产生冲突。若无效,再结合方案2和3调整。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

