Java 检查字符串变量是否已修改,如果未修改,则检查Toast。但是吐司总是出现
我试图实现一些逻辑,以测试Java 检查字符串变量是否已修改,如果未修改,则检查Toast。但是吐司总是出现,java,android,string,firebase,Java,Android,String,Firebase,我试图实现一些逻辑,以测试字符串变量是否被修改,但这些逻辑有一点问题。因此,在EditProfileActivity中,用户可以选择更改自己的姓名、用户名和简历。唯一的问题是,当他们输入EditProfileActivity时,如果用户名没有更改,那么当用户单击复选标记保存更改时,它会检查用户名是否已经存在于数据库中。如果是这样的话,就会出现一条消息,表明该用户名已经存在,您可以选择另一个用户名 问题是,如果用户没有更改任何内容,并单击复选标记,则会弹出Toast消息,因为用户没有更改的用户名显
字符串
变量是否被修改,但这些逻辑有一点问题。因此,在EditProfileActivity
中,用户可以选择更改自己的姓名、用户名和简历。唯一的问题是,当他们输入EditProfileActivity
时,如果用户名没有更改,那么当用户单击复选标记保存更改时,它会检查用户名是否已经存在于数据库中。如果是这样的话,就会出现一条消息,表明该用户名已经存在,您可以选择另一个用户名
问题是,如果用户没有更改任何内容,并单击复选标记,则会弹出Toast消息
,因为用户没有更改的用户名显然存在于数据库中
我如何更改代码或实现逻辑,以便即使用户单击复选标记,并且用户名未更改,也不会弹出Toast消息
,只显示活动finish()代码>
我尝试在updateProfile()中实现另一个条件方法,检查原始用户名是否与最终用户名相同,但不起作用。。。我很确定这就是我必须添加另一个条件来检查它是否是相同的用户名的地方。这是我添加的逻辑,但不起作用:
&&!mUsername.getText().toString().toLowerCase().equals(mUsername.toLowerCase())
EditProfileActivity
public class EditProfileActivity extends AppCompatActivity {
ImageView mClose, mCheckmark, mImageProfile;
TextView mChangePhoto;
MaterialEditText mName, mUsername, mBio;
private String mUsername1;
FirebaseUser mFirebaseUser;
private Uri mImageUri;
StorageReference mStorageReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_profile);
mClose = findViewById(R.id.close);
mCheckmark = findViewById(R.id.post_checkmark);
mImageProfile = findViewById(R.id.image_profile);
mChangePhoto = findViewById(R.id.text_view_change_profile_picture);
mName = findViewById(R.id.fullname);
mUsername = findViewById(R.id.username);
mBio = findViewById(R.id.bio);
mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
mStorageReference = FirebaseStorage.getInstance().getReference("uploads");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(mFirebaseUser.getUid());
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
if (user != null) {
mName.setText(user.getFullname());
mUsername.setText(user.getUsername().toLowerCase());
mBio.setText(user.getBio());
Glide.with(getApplicationContext()).load(user.getImageurl()).into(mImageProfile);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
mClose.setOnClickListener(v -> new AlertDialog.Builder(EditProfileActivity.this)
.setTitle("Exit without saving changes?")
.setPositiveButton("Yes", (dialog, which) -> {
finish();
}).setNegativeButton("No", null).show());
mChangePhoto.setOnClickListener(v -> CropImage.activity()
.setAspectRatio(1, 1)
.setCropShape(CropImageView.CropShape.OVAL)
.start(EditProfileActivity.this));
mImageProfile.setOnClickListener(v -> CropImage.activity()
.setAspectRatio(1, 1)
.setCropShape(CropImageView.CropShape.OVAL)
.start(EditProfileActivity.this));
mCheckmark.setOnClickListener(v -> {
String str_name = mName.getText().toString();
String str_username = mUsername.getText().toString();
String str_bio = mBio.getText().toString();
if (TextUtils.isEmpty(str_username) || TextUtils.isEmpty(str_bio) || TextUtils.isEmpty(str_name)) {
Toast.makeText(this, "Please fill in all fields", Toast.LENGTH_SHORT).show();
} else if (str_username.length() > 20) {
Toast.makeText(this, "Username cannot contain more than 20 characters", Toast.LENGTH_SHORT).show();
} else {
updateProfile(mName.getText().toString(), mUsername.getText().toString().toLowerCase(), mBio.getText().toString());
}
});
}
private void updateProfile(String fullname, String username, String bio) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(mFirebaseUser.getUid());
mUsername1 = username.replaceAll("\\s+", "");
mUsername1 = username.replaceAll("[^\\w]", "");
DatabaseReference reference1 = FirebaseDatabase.getInstance().getReference("Users");
reference1.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
boolean ifUserNameExists = false;
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
User user = snapshot.getValue(User.class);
if (user != null) {
if (user.getUsername().equals(mUsername1.toLowerCase())) {
Toast.makeText(EditProfileActivity.this, "That username has already been taken. Try another", Toast.LENGTH_SHORT).show();
ifUserNameExists = true;
}
}
}
if (!ifUserNameExists) {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("fullname", fullname);
hashMap.put("username", mUsername1.toLowerCase());
hashMap.put("bio", bio);
reference.updateChildren(hashMap);
Toast.makeText(EditProfileActivity.this, "Username has been changed", Toast.LENGTH_LONG).show();
finish();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
这个解决方案对你有用吗
private User user;
从数据库中提取用户时,保存用户:
user = dataSnapshot.getValue(User.class);
在调用updateProfile()之前,检查username是否等于user.username
if(!user.username.equals(mUsername.getText().toString())){
updateProfile(mName.getText().toString(),
mUsername.getText().toString().toLowerCase(), mBio.getText().toString());
}
这样,您就不会对Firebase进行不必要的调用。这是一种可行的逻辑
当用户输入EditProfileActivity
时,您可能希望将从db检索到的用户信息保存到本地变量中。当用户单击复选标记保存更改时,您只需将用户输入与本地变量进行比较。如果它们不匹配,这意味着用户已经更改了他们的个人资料信息。请发布一个数据库结构的屏幕截图以及您正在更改的值。@Dharmaraj好的,就发布它。如下所示Users>uniqueId>username、name等
。我正在检查的值是username,我觉得若该字段的大小写处理不正确,这可能是一个问题。你能添加日志语句并检查这些值是否相同吗?@Dharmaraj谢谢你的帮助。下面的答案很好!酷。处理弦的情况可能会很痛苦:这不管用。它总是更改用户名,并且不会检查数据库中是否存在其他用户的用户名。嗯,这是为了防止在用户未更改用户名时调用Firebase。我认为您需要将toLowerCase()添加到if语句中。如果(!user.username.equals(mUsername.getText().toString().toLowerCase())不起作用,请尝试添加日志并进行调试,看看有什么不同。好的,这是有效的。如果用户名未更改,则没有Toast消息。。。谢谢嘿,伙计,我刚注意到其他字段有问题。EditProfile有Name、Username和Bio,您帮助我实现的代码现在只侦听用户名是否有更改,但我还需要它侦听Name和Bio的更改。因此,我尝试将代码更改为上面更新的部分,但没有成功。仍然只侦听用户名的更改。我如何解决这个问题?例如,如果我更改了密码,只是想更改个人信息而不是用户名,然后单击复选标记,它什么也不做。名字也一样。它只监听用户名,我实现了代码试图修复它,但没有起作用……我应该将它们保存为字符串变量还是其他什么?因为按照我现在的方式,从数据库中调用的数据填充了EditText空间。我是否应该将变量添加到字符串变量中?实际上,在复选标记的onClickListener中,我有String str_username=mUsername.getText().toString()代码>。我应该将新用户名与此用户名进行比较吗?
if(!user.username.equals(mUsername.getText().toString())){
updateProfile(mName.getText().toString(),
mUsername.getText().toString().toLowerCase(), mBio.getText().toString());
}