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

外卖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:55:23