外卖APP登录按钮失效及未使用导入问题求助
外卖APP登录问题解决方案
一、清理未使用导入语句
以下导入属于未使用状态,直接删除即可(灰色标识说明代码中未引用,不会影响功能,但会增加冗余):
import com.dataflair.fooddeliveryapp.MainActivity;import com.google.firebase.database.DataSnapshot;import com.google.firebase.database.DatabaseError;import com.google.firebase.database.ValueEventListener;import com.google.firebase.database.annotations.NotNull;
二、登录按钮无响应核心修复
1. 按钮类型匹配问题
代码中原本用Button声明登录按钮,但如果布局文件里用的是Google官方的SignInButton(布局代码为<com.google.android.gms.common.SignInButton .../>),会导致findViewById返回null,点击事件无法绑定,最终按钮无响应。
修复方式:
将按钮声明改为SignInButton:
// 替换原Button声明 SignInButton signInButton;
初始化时对应转换类型:
signInButton = (SignInButton) findViewById(R.id.GoogleSignInBtn);
2. 布局ID匹配检查
代码中pinCodeEdittxt = (EditText) findViewById(R.id.PinCodeExitText);的PinCodeExitText大概率是笔误,布局中应为PinCodeEditText,需修正为一致的ID,否则EditText会为null,点击按钮时触发空指针异常,表现为无响应。
3. 完善异常与失败提示
当前代码缺少失败场景的用户反馈与资源释放,比如Google登录失败、Firebase认证失败、数据库写入失败时,用户无法得知问题所在,进度条也可能一直显示。
添加修复代码:
- 在Google登录请求失败时添加提示:
if (googleSignInAccountTask.isSuccessful()) { // 原有成功逻辑... } else { Toast.makeText(getApplicationContext(), "Google登录请求失败", Toast.LENGTH_SHORT).show(); }
- 在Firebase认证失败时关闭进度条并提示:
firebaseAuth.signInWithCredential(authCredential).addOnCompleteListener(this, task -> { if (task.isSuccessful()) { // 原有成功逻辑... } else { progressBar.cancel(); Toast.makeText(getApplicationContext(), "登录失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } });
- 在异常捕获块中关闭进度条:
catch (ApiException e) { e.printStackTrace(); progressBar.cancel(); Toast.makeText(getApplicationContext(), "登录异常:" + e.getMessage(), Toast.LENGTH_SHORT).show(); }
三、优化后的完整代码
package com.dataflair.fooddeliveryapp.Activities; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.dataflair.fooddeliveryapp.R; import com.google.android.gms.auth.api.signin.GoogleSignIn; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInClient; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.common.SignInButton; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import java.util.HashMap; public class LoginActivity extends AppCompatActivity { GoogleSignInClient mSignInClient; FirebaseAuth firebaseAuth; ProgressDialog progressBar; SignInButton signInButton; EditText phoneNumberEditTxt, addressEditTxt, cityNameEditTxt, pinCodeEdittxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); //Firebase Authentication firebaseAuth = FirebaseAuth.getInstance(); //Progress bar progressBar = new ProgressDialog(this); progressBar.setTitle("Please Wait..."); progressBar.setMessage("We are setting Everything for you..."); progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); //Assigning the address of the android materials cityNameEditTxt = findViewById(R.id.CityEditText); phoneNumberEditTxt = findViewById(R.id.PhoneNumberEditText); // 修正布局ID为正确的PinCodeEditText pinCodeEdittxt = findViewById(R.id.PinCodeEditText); addressEditTxt = findViewById(R.id.AddressEditText); signInButton = findViewById(R.id.GoogleSignInBtn); //Google Signin Options to get gmail and performed gmail login GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("319466083877-4cdnl01r8q8p84nqgtcp42tv8cn0dq12.apps.googleusercontent.com") .requestEmail() .build(); mSignInClient = GoogleSignIn.getClient(getApplicationContext(), googleSignInOptions); //Implementing OnClickListener to perform Login action signInButton.setOnClickListener(view -> { //Getting user details from the edit text String phoneNumber = phoneNumberEditTxt.getText().toString(); String cityName = cityNameEditTxt.getText().toString(); String pinCode = pinCodeEdittxt.getText().toString(); String address = addressEditTxt.getText().toString(); //Checking all the fields are filled or not if (phoneNumber.isEmpty() || cityName.isEmpty() || pinCode.isEmpty() || address.isEmpty()) { Toast.makeText(getApplicationContext(), "请填写所有信息", Toast.LENGTH_SHORT).show(); } else { //Showing all Gmails Intent intent = mSignInClient.getSignInIntent(); startActivityForResult(intent, 100); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100) { Task<GoogleSignInAccount> googleSignInAccountTask = GoogleSignIn.getSignedInAccountFromIntent(data); if (googleSignInAccountTask.isSuccessful()) { progressBar.show(); try { GoogleSignInAccount googleSignInAccount = googleSignInAccountTask.getResult(ApiException.class); if (googleSignInAccount != null) { AuthCredential authCredential = GoogleAuthProvider.getCredential(googleSignInAccount.getIdToken(), null); firebaseAuth.signInWithCredential(authCredential).addOnCompleteListener(this, task -> { if (task.isSuccessful()) { FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference().child("users"); //Hashmap to store the userdetails and setting it to firebase HashMap<String, Object> user_details = new HashMap<>(); //Accessing the user details from gmail String id = googleSignInAccount.getId(); String name = googleSignInAccount.getDisplayName(); String mail = googleSignInAccount.getEmail(); String pic = googleSignInAccount.getPhotoUrl() != null ? googleSignInAccount.getPhotoUrl().toString() : ""; String phoneNumber = phoneNumberEditTxt.getText().toString(); String cityName = cityNameEditTxt.getText().toString(); String pinCode = pinCodeEdittxt.getText().toString(); String address = addressEditTxt.getText().toString(); user_details.put("id", id); user_details.put("name", name); user_details.put("mail", mail); user_details.put("profilepic", pic); user_details.put("role", "empty"); user_details.put("phoneNumber", phoneNumber); user_details.put("cityName", cityName); user_details.put("pinCode", pinCode); user_details.put("address", address); //updating the user details in firebase myRef.child(id).updateChildren(user_details).addOnCompleteListener(task1 -> { progressBar.cancel(); if (task1.isSuccessful()) { //navigating to the user role activity after user successfully registers Intent intent = new Intent(getApplicationContext(), UserRoleActivity.class); //Clears older activities and tasks intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } else { Toast.makeText(getApplicationContext(), "用户信息保存失败:" + task1.getException().getMessage(), Toast.LENGTH_SHORT).show(); } }); } else { progressBar.cancel(); Toast.makeText(getApplicationContext(), "Firebase认证失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } }); } } catch (ApiException e) { e.printStackTrace(); progressBar.cancel(); Toast.makeText(getApplicationContext(), "登录异常:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getApplicationContext(), "Google登录请求失败", Toast.LENGTH_SHORT).show(); } } } }
内容的提问来源于stack exchange,提问作者trina
相关产品推荐
相关产品推荐

