为什么不在 Activity return 用户键入的值中找到 findViewById()?

Why doesn't findViewById() in an Activity return the user typed value?

我正在创建一个 Android 应用程序,其中的场景是用户注册,单击 "Sign Up" 按钮后,该应用程序将数据发送到 REST API。

activity_sign_up_login.java

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/signUp"
        android:text="@string/sign_up"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/logIn"
        android:text="@string/log_in"
        app:layout_constraintStart_toEndOf="@+id/signUp" />

    <EditText
        android:id="@+id/password"
        android:inputType="textPassword"
        app:layout_constraintTop_toBottomOf="@+id/mobNum" />

    <EditText
        android:id="@+id/mobNum"
        app:layout_constraintTop_toBottomOf="@+id/countryCode" />


</android.support.constraint.ConstraintLayout>

SignUp.java

    public class SignUpLogIn extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            final ConnectionStatus connectionStatus = new ConnectionStatus(getApplicationContext());
            if(!connectionStatus.isOnline()){
                connectionStatus.displayMobileDataSettingsDialog(this, getApplicationContext());
            }
            setContentView(R.layout.activity_sign_up_log_in);


            final TextView mobNumberTextView = (TextView) findViewById(R.id.mobNum);
            final TextView passwordTextView = (TextView) findViewById(R.id.password);
            Button signUp = (Button) findViewById(R.id.signUp);


            final String mobNumber = mobNumberTextView.getText().toString();
            final String password = passwordTextView.getText().toString();

            signUp.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(!validateInputFields(mobNumber, password)){
                        Intent checkSignUpStatusIntent = new Intent(getApplicationContext(), CrossCheckSignUpService.class);
                        checkSignUpStatusIntent.putExtra("countryCode", countryCode);
                        checkSignUpStatusIntent.putExtra("confirmMobileNumber", mobNumber);
                        checkSignUpStatusIntent.putExtra("confirmPassword", password);
                        startService(checkSignUpStatusIntent);
                        connectionStatus.showProgress();
                    }
                }
            });
        }

private boolean validateInputFields(String mobNum, String password){
        StringBuffer errors = new StringBuffer();
        int count = 0;
        boolean hasError = false;
        if(mobNum == null || mobNum.isEmpty()){
            ++count;
            errors.append(count + ") Please enter your mobile number");
            errors.append('\n');
            hasError = true;
        }
        if(password == null || password.isEmpty()){
            //cEmail field is empty
            ++count;
            errors.append(count + ") Please enter a password");
            errors.append('\n');
            hasError = true;
        }
        if(hasError){
            Toast.makeText(this, errors.toString(), Toast.LENGTH_LONG).show();
            return true;
        }
        return false;
    }

在 onClick() 内部,尽管用户输入了值,但值为空。

  1. 这是为什么?
  2. 如何解决?

请在线回答。

PS:

我无法删除 final 上面的 textView 变量 .setOnClickListener

您需要从 onClick() 方法中获取 mobNumberpassword

    signUp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

    String mobNumber = mobNumberTextView.getText().toString();
    String password = passwordTextView.getText().toString();

            if(!validateInputFields(mobNumber, password)){
                Intent checkSignUpStatusIntent = new Intent(getApplicationContext(), CrossCheckSignUpService.class);
                checkSignUpStatusIntent.putExtra("countryCode", countryCode);
                checkSignUpStatusIntent.putExtra("confirmMobileNumber", mobNumber);
                checkSignUpStatusIntent.putExtra("confirmPassword", password);
                startService(checkSignUpStatusIntent);
                connectionStatus.showProgress();
            }
        }
    });

编辑

如果您像这样使用它们,则无需将变量声明为 final

  TextView mobNumberTextView = (TextView) findViewById(R.id.mobNum);
  TextView passwordTextView = (TextView) findViewById(R.id.password);

onClick()

里面
String mobNumber = mobNumberTextView.getText().toString();
String password = passwordTextView.getText().toString();

编辑 2

我刚发现你的问题。

在您的 validateInputFields 方法中,您传递了 2 个字符串,mobNum 和密码,在您的 if 语句中,您尝试将 2 个字符串传递给该方法,没关系 if(!validateInputFields(mobNumber, password))... 但是,您尝试传递的两个字符串通过该方法在您的 onClick() 之外,因此无法达到这些值,并且您的 validateInputFields() 方法无法正常工作。

编辑 3

我刚刚看到您的 xml

中有这 2 个编辑文本
 <EditText
        android:id="@+id/password"
        android:inputType="textPassword"
        app:layout_constraintTop_toBottomOf="@+id/mobNum" />

    <EditText
        android:id="@+id/mobNum"
        app:layout_constraintTop_toBottomOf="@+id/countryCode" />

但您的参考说明有两个 textView

 TextView mobNumberTextView = (TextView) findViewById(R.id.mobNum);
 TextView passwordTextView = (TextView) findViewById(R.id.password);

您应该向 xml 添加两个 textView,或者将 TextView mobNumb.... 更改为

EditText mobNumber...

像这样

 EditText mobNumberTextView = (EditText) findViewById(R.id.mobNum);
 EditText passwordTextView = (EditText) findViewById(R.id.password);

你必须在onClick之后获取值。

为什么?

findViewById 用于绑定您的视图,绑定后您立即调用 getText 这就是为什么它是空的。

用这个替换你的代码

    signUp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String mobNumber = mobNumberTextView.getText().toString();
            String password = passwordTextView.getText().toString();

            if(!validateInputFields(mobNumber, password)){
                Intent checkSignUpStatusIntent = new Intent(getApplicationContext(), CrossCheckSignUpService.class);
                checkSignUpStatusIntent.putExtra("countryCode", countryCode);
                checkSignUpStatusIntent.putExtra("confirmMobileNumber", mobNumber);
                checkSignUpStatusIntent.putExtra("confirmPassword", password);
                startService(checkSignUpStatusIntent);
                connectionStatus.showProgress();
            }
        }
    });

请从 onClickListener 中的 EditText 获取值

    signUp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final String mobNumber = mobNumberTextView.getText().toString();
            final String password = passwordTextView.getText().toString();
            if(!validateInputFields(mobNumber, password)){
                Intent checkSignUpStatusIntent = new Intent(getApplicationContext(), CrossCheckSignUpService.class);
                checkSignUpStatusIntent.putExtra("countryCode", countryCode);
                checkSignUpStatusIntent.putExtra("confirmMobileNumber", mobNumber);
                checkSignUpStatusIntent.putExtra("confirmPassword", password);
                startService(checkSignUpStatusIntent);
                connectionStatus.showProgress();
            }
        }
    });

您需要从 signUp.setOnClickListener

中的 edittext 获取值
    signUp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

             String mobNumber = mobNumberTextView.getText().toString();
             String password = passwordTextView.getText().toString();

            if(!validateInputFields(mobNumber, password)){
                Intent checkSignUpStatusIntent = new Intent(getApplicationContext(), CrossCheckSignUpService.class);
                checkSignUpStatusIntent.putExtra("countryCode", countryCode);
                checkSignUpStatusIntent.putExtra("confirmMobileNumber", mobNumber);
                checkSignUpStatusIntent.putExtra("confirmPassword", password);
                startService(checkSignUpStatusIntent);
                connectionStatus.showProgress();
            }
        }
    });