这是我的登录活动代码。
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
final EditText username = (EditText) findViewById(R.id.txtUsername);
final EditText password = (EditText) findViewById(R.id.txtRegisPassword);
final Bundle extras = getIntent().getExtras();
Button login = (Button) findViewById(R.id.btnLogin);
Button registerNow = (Button) findViewById(R.id.btnRegisterNow);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ArrayList<String> data = (ArrayList<String>) extras.getSerializable("array_list"); //this code always null at starter
if(extras!=null) {
if (username.getText().toString().length() == 0 || password.getText().toString().length() == 0) {
Toast.makeText(LoginActivity.this, "Username and Password must be filled!", Toast.LENGTH_SHORT).show();
} else if (!data.contains(username.getText().toString()) || !data.contains(password.getText().toString())) {
Toast.makeText(LoginActivity.this, "Username and Password must be registered!", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(LoginActivity.this, MainMenu.class);
startActivity(intent);
}
}
}
});
registerNow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
}
}
这是我的注册表单代码。
public class RegisterActivity extends AppCompatActivity {
ArrayList<String> addArray = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
final EditText Username = (EditText) findViewById(R.id.txtRegisUsername);
final EditText Password = (EditText) findViewById(R.id.txtRegisPassword);
final EditText ConfirmPassword = (EditText) findViewById(R.id.txtConfirmPassword);
final EditText FullName = (EditText) findViewById(R.id.txtRegisFullName);
final EditText PhoneNumber = (EditText) findViewById(R.id.txtRegisPhone);
final EditText DateOfBirth = (EditText) findViewById(R.id.txtRegisDateOfBirth);
final EditText Address = (EditText) findViewById(R.id.txtRegisAddress);
final RadioGroup rdGroup = (RadioGroup) findViewById(R.id.radioGroup);
RadioButton rdMale = (RadioButton) findViewById(R.id.rdMale);
RadioButton rdFemale = (RadioButton) findViewById(R.id.rdFemale);
Button Register = (Button) findViewById(R.id.btnRegister);
Button LoginNow = (Button) findViewById(R.id.btnLoginNow);
Register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Username.getText().toString().length()==0 || Password.getText().toString().length()==0 ||
ConfirmPassword.getText().toString().length()==0 || FullName.getText().toString().length()==0 ||
PhoneNumber.getText().toString().length()==0 || DateOfBirth.getText().toString().length()==0 ||
Address.getText().toString().length()==0){
Toast.makeText(RegisterActivity.this, "All fields must be filled!", Toast.LENGTH_SHORT).show();
}else if(Username.getText().toString().length()<5 || Username.getText().toString().length()>20){
Toast.makeText(RegisterActivity.this, "Username must be between 5 and 20 characters.", Toast.LENGTH_SHORT).show();
}else if(Password.getText().toString().length()<5 || Password.getText().toString().length()>20){
Toast.makeText(RegisterActivity.this, "Password must be between 5 and 20 characters.", Toast.LENGTH_SHORT).show();
}else if(!ConfirmPassword.getText().toString().equals(Password.getText().toString())){
Toast.makeText(RegisterActivity.this, "Confirm Password must be match with Password.", Toast.LENGTH_SHORT).show();
}else if(!Address.getText().toString().endsWith(" Street")){
Toast.makeText(RegisterActivity.this, "Address must be ends with “Street”.", Toast.LENGTH_SHORT).show();
}else if(addArray.contains(Username.getText().toString())){
Toast.makeText(RegisterActivity.this, "Username already registered.", Toast.LENGTH_SHORT).show();
}else{
addArray.add(Username.getText().toString());
addArray.add(Password.getText().toString());
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(RegisterActivity.this, android.R.layout.simple_list_item_1, addArray);
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
intent.putExtra("array_list", addArray);
startActivity(intent);
}
}
});
LoginNow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
}
});
}
}
请帮助我,我正在尝试一切,但无法解决我的问题。"我的登录表单总是被迫关闭,因为注册表单中的值在开始时仍然为空",但是如果我先注册用户数据,登录表单工作正常。
您需要检查您的捆绑包是否为 null,然后使用它。其次,你应该使用 getStringArrayList 而不是 getSerializable,如下所示:
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(extras!=null) {
ArrayList<String> data = extras.getStringArrayList("array_list"); // use getStringArrayList instead of getSerializable
if (username.getText().toString().length() == 0 || password.getText().toString().length() == 0) {
Toast.makeText(LoginActivity.this, "Username and Password must be filled!", Toast.LENGTH_SHORT).show();
} else if (!data.contains(username.getText().toString()) || !data.contains(password.getText().toString())) {
Toast.makeText(LoginActivity.this, "Username and Password must be registered!", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(LoginActivity.this, MainMenu.class);
startActivity(intent);
}
}
}
});
我已经根据我的调试报告检查了您的代码,您的列表对象在恢复列表时变为空。您也可以尝试@Suraj Makhija 代码。否则我告诉你要解决此问题,您可以采用2种方式。
i( 您可以使用ArrayList<CharSequence>()
而不是ArrayList<String>()
这是最简单的原因,因为它不需要任何其他类型转换即可再次获取它,您在此处所做的会导致 NullPointerException 有时。
ArrayList<String> data = (ArrayList<String>) extras.getSerializable("array_list");
有两种方法可以设置数据和从意图获取数据 -->
// dataList type is ArrayList<CharSequence>()
intent.putCharSequenceArrayListExtra(KEY,dataList)
intent.getCharSequenceArrayExtra(KEY)//in return you will get list here
ii( 第二个是作为建议,我会告诉你使用带有 getter 和 setter 的建模数组列表,它会帮助你更多,而不是简单的字符串类型数组列表。
例:
public class KeyValueModel implements Parcelable {
String mKey,mValue;
protected KeyValueModel(Parcel in) {
mKey = in.readString();
mValue = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mKey);
dest.writeString(mValue);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<KeyValueModel> CREATOR = new Creator<KeyValueModel>() {
@Override
public KeyValueModel createFromParcel(Parcel in) {
return new KeyValueModel(in);
}
@Override
public KeyValueModel[] newArray(int size) {
return new KeyValueModel[size];
}
};
public String getmKey() {
return mKey;
}
public void setmKey(String mKey) {
this.mKey = mKey;
}
public String getmValue() {
return mValue;
}
public void setmValue(String mValue) {
this.mValue = mValue;
}
}
<</div>
div class="one_answers"> 所以,这是我的解决方案,并且有效.. 希望能帮助其他人
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(extras!=null) { //this is for if i've register an account before (aka not null again after register).
ArrayList<String> data = extras.getStringArrayList("array_list");
if (username.getText().toString().length() == 0 || password.getText().toString().length() == 0) {
Toast.makeText(LoginActivity.this, "Username and Password must be filled!", Toast.LENGTH_SHORT).show();
} else if (!data.contains(username.getText().toString()) || !data.contains(password.getText().toString())) {
Toast.makeText(LoginActivity.this, "Username and Password must be registered!", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(LoginActivity.this, MainMenu.class);
startActivity(intent);
}
} else { //this for null condition
ArrayList<String> nullData = new ArrayList<String>();
nullData.add(username.getText().toString());
nullData.add(password.getText().toString());
if (username.getText().toString().length() == 0 || password.getText().toString().length() == 0) {
Toast.makeText(LoginActivity.this, "Username and Password must be filled!", Toast.LENGTH_SHORT).show();
} else if (!nullData.equals(null)){
Toast.makeText(LoginActivity.this, "Username and Password must be registered!", Toast.LENGTH_SHORT).show();
}
}
}
});