(Android Studio)我的Bundle.getSerializable for login form在启动时为



这是我的登录活动代码。

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();
                }
            }
        }
    });

最新更新