为什么不在 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() 内部,尽管用户输入了值,但值为空。
- 这是为什么?
- 如何解决?
请在线回答。
PS:
我无法删除 final 上面的 textView 变量 .setOnClickListener
您需要从 onClick()
方法中获取 mobNumber
和 password
:
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();
}
}
});
我正在创建一个 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() 内部,尽管用户输入了值,但值为空。
- 这是为什么?
- 如何解决?
请在线回答。
PS:
我无法删除 final 上面的 textView 变量 .setOnClickListener
您需要从 onClick()
方法中获取 mobNumber
和 password
:
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();
}
}
});