如何解决为什么在从 ProductDetailsActivity 转移到 HomeActivity 时,LoginActivity 会出现一个 toast?
请帮我解决这个问题。我已经为此工作了好几天。
ProductsDetailActivity
package com.example.spree;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.cepheuen.elegantnumberbutton.view.ElegantNumberButton;
import com.example.spree.Models.Products;
import com.example.spree.Models.Users;
import com.example.spree.Prevalent.Prevalent;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import io.paperdb.Paper;
public class ProductsDetailActivity extends AppCompatActivity {
private Button addToCart;
private ImageView productDetailImage;
private ElegantNumberButton numberButton;
private TextView productNameDetail,productDescriptionDetail,productPriceDetail;
private String productID = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_products_detail);
productID = getIntent().getStringExtra("pid");
productDetailImage = findViewById(R.id.product_image_details);
productNameDetail = findViewById(R.id.product_name_details);
productDescriptionDetail = findViewById(R.id.product_description_details);
productPriceDetail = findViewById(R.id.product_price_details);
numberButton = findViewById(R.id.elegant_button);
addToCart = findViewById(R.id.product_cart);
getProductDetails(productID);
addToCart.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addToCartList();
}
});
}
private void addToCartList() {
String saveCurrentTime,saveCurrentDate;
Calendar callForDate = Calendar.getInstance();
SimpleDateFormat currentDate = new SimpleDateFormat("MMM-dd-yyyy");
saveCurrentDate = currentDate.format(callForDate.getTime());
SimpleDateFormat currentTime = new SimpleDateFormat(" HH:mm:s a");
saveCurrentTime = currentTime.format(callForDate.getTime());
final DatabaseReference cartListRef = FirebaseDatabase.getInstance()
.getReference().child("Cart List");
final HashMap<String,Object> cartMap = new HashMap<>();
cartMap.put("pid",productID);
cartMap.put("pname",productNameDetail.getText().toString());
cartMap.put("price",productPriceDetail.getText().toString());
cartMap.put("date",saveCurrentDate);
cartMap.put("time",saveCurrentTime);
cartMap.put("quantity",numberButton.getNumber());
cartMap.put("discount","");
cartListRef.child("User View").child(Prevalent.currentOnlineUser.getPhone())
.child("Products")
.child(productID)
.updateChildren(cartMap)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
cartListRef.child("Admin View").child(Prevalent.currentOnlineUser.getPhone())
.child("Products")
.child(productID)
.updateChildren(cartMap)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
Toast.makeText(ProductsDetailActivity.this,"Added to cart successfully.",Toast.LENGTH_SHORT).show();
Intent pIntent = new Intent(ProductsDetailActivity.this,HomeActivity.class);
startActivity(pIntent);
}
}
});
}
}
});
}
private void getProductDetails(String productID) {
DatabaseReference productReference = FirebaseDatabase.getInstance().getReference().child("Products");
productReference.child(productID).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()){
Products products = snapshot.getValue(Products.class);
productNameDetail.setText(products.getPname());
productPriceDetail.setText(products.getPrice());
productDescriptionDetail.setText(products.getDescription());
Picasso.get().load(products.getimage()).into(productDetailImage);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
家庭活动
package com.example.spree;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.spree.Models.Products;
import com.example.spree.Prevalent.Prevalent;
import com.example.spree.ViewHolder.ProductViewHolder;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Picasso;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.core.view.GravityCompat;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.linearlayoutmanager;
import androidx.recyclerview.widget.RecyclerView;
import de.hdodenhof.circleimageview.CircleImageView;
import io.paperdb.Paper;
public class HomeActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener
{
//private AppBarConfiguration mAppBarConfiguration;
private DatabaseReference productsRef;
private RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Paper.init(this);
productsRef = FirebaseDatabase.getInstance().getReference().child("Products");
Toolbar toolbar = findViewById(R.id.toolbar);
toolbar.setTitle("Home");
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view,"Replace with your own action",Snackbar.LENGTH_LONG)
.setAction("Action",null).show();
}
});
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this,drawer,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
View headerView = navigationView.getHeaderView(0);
TextView userNameTextView = headerView.findViewById(R.id.user_profile_name);
CircleImageView profileImageView = headerView.findViewById(R.id.profile_image);
userNameTextView.setText(Prevalent.currentOnlineUser.getName());
Picasso.get().load(Prevalent.currentOnlineUser.getimage()).placeholder(R.drawable.profile).into(profileImageView);
recyclerView = findViewById(R.id.recycler_menu);
recyclerView.setHasFixedSize(true);
layoutManager = new linearlayoutmanager(this);
recyclerView.setLayoutManager(layoutManager);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
// mAppBarConfiguration = new AppBarConfiguration.Builder(
// R.id.nav_home,R.id.nav_gallery,R.id.nav_slideshow)
// .setDrawerLayout(drawer)
// .build();
// NavController navController = Navigation.findNavController(this,R.id.nav_host_fragment);
// NavigationUI.setupActionBarWithNavController(this,navController,mAppBarConfiguration);
// NavigationUI.setupWithNavController(navigationView,navController);
}
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerOptions<Products> options = new FirebaseRecyclerOptions.Builder<Products>()
.setQuery(productsRef,Products.class)
.build();
FirebaseRecyclerAdapter<Products,ProductViewHolder> productAdapter =
new FirebaseRecyclerAdapter<Products,ProductViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull ProductViewHolder holder,int position,@NonNull final Products model) {
holder.textProductName.setText(model.getPname());
holder.textProductDescription.setText(model.getDescription());
holder.textProductPrice.setText("Price TK: " +model.getPrice()+"/-");
Picasso.get().load(model.getimage()).into(holder.imageView);
holder.itemView.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(HomeActivity.this,ProductsDetailActivity.class);
intent.putExtra("pid",model.getPid());
startActivity(intent);
}
});
}
@NonNull
@Override
public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_items_layout,parent,false);
ProductViewHolder holder = new ProductViewHolder(view);
return holder;
}
};
recyclerView.setAdapter(productAdapter);
productAdapter.startListening();
}
@Override
public void onBackpressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackpressed();
}
}
@Override
public boolean onoptionsItemSelected(MenuItem item)
{
int id = item.getItemId();
// if (id == R.id.nav_settings)
// {
// return true;
// }
return super.onoptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.home,menu);
return true;
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item)
{
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_cart)
{
}
else if (id == R.id.nav_orders)
{
}
else if (id == R.id.nav_category)
{
}
else if (id == R.id.nav_settings)
{
Intent intent = new Intent(HomeActivity.this,SettingsActivity.class);
startActivity(intent);
}
else if (id == R.id.nav_logout)
{
Paper.book().destroy();
Intent intent = new Intent(HomeActivity.this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
LoginActivity(从 ProductsDetailActivity 移动到 HomeActivity 时根本没有使用)
package com.example.spree;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.spree.Models.Users;
import com.example.spree.Prevalent.Prevalent;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.rey.material.widget.CheckBox;
import io.paperdb.Paper;
public class LoginActivity extends AppCompatActivity {
private EditText inputPhoneNumber,inputPassword;
private Button loginButton;
private ProgressDialog loadingDialog;
private String parentdbname = "Users";
private TextView adminLink,notAdminLink;
private CheckBox checkBoxRememberMe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
inputPhoneNumber = findViewById(R.id.login_phone_number_input);
inputPassword = findViewById(R.id.login_password_input);
loginButton = findViewById(R.id.login_btn);
loadingDialog = new ProgressDialog(this);
checkBoxRememberMe = (CheckBox) findViewById(R.id.remember_me_chkb);
Paper.init(this);
adminLink = findViewById(R.id.admin_panel_link);
notAdminLink = findViewById(R.id.not_admin_panel_link);
//onClickListeners
loginButton.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginUser();
}
});
adminLink.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginButton.setText("Login Admin");
adminLink.setVisibility(View.INVISIBLE);
notAdminLink.setVisibility(View.VISIBLE);
parentdbname = "Admins";
}
});
notAdminLink.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginButton.setText("Login");
notAdminLink.setVisibility(View.INVISIBLE);
adminLink.setVisibility(View.VISIBLE);
parentdbname = "Users";
}
});
}
private void loginUser() {
String phone = inputPhoneNumber.getText().toString();
String password = inputPassword.getText().toString();
if (TextUtils.isEmpty(phone)) {
Toast.makeText(this,"Please,enter your mobile number.",Toast.LENGTH_SHORT).show();
} else if (TextUtils.isEmpty(password)) {
Toast.makeText(this,enter your password.",Toast.LENGTH_SHORT).show();
} else {
loadingDialog.setTitle("Login Account");
loadingDialog.setMessage("Please,wait while we are checking the credentials.");
loadingDialog.setCanceledOnTouchOutside(false);
loadingDialog.show();
allowAccesstoUser(phone,password);
}
}
private void allowAccesstoUser(final String phone,final String password) {
if(checkBoxRememberMe.isChecked()){
Paper.book().write(Prevalent.userPhoneKey,phone);
Paper.book().write(Prevalent.userPassKey,password);
}
final DatabaseReference myRef;
myRef = FirebaseDatabase.getInstance().getReference();
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(snapshot.child(parentdbname).child(phone).exists()){
Users userData = snapshot.child(parentdbname).child(phone).getValue(Users.class);
if(userData.getPhone().equals(phone)){
if(userData.getpassword().equals(password)){
if(parentdbname.equals("Admins")){
Toast.makeText(LoginActivity.this,"Admin logged in successfully!",Toast.LENGTH_SHORT).show();
loadingDialog.dismiss();
Intent intent = new Intent(LoginActivity.this,AdminCategoryActivity.class);
startActivity(intent);
}
else if (parentdbname.equals("Users")) {
Toast.makeText(LoginActivity.this,"User logged in successfully!",HomeActivity.class);
Prevalent.currentOnlineUser = userData;
startActivity(intent);
}
}
else
{
Toast.makeText(LoginActivity.this,"Incorrect password",Toast.LENGTH_SHORT).show();
loadingDialog.dismiss();
}
}
}
else
{
Toast.makeText(LoginActivity.this,"Account with this "+phone+ " doesn't exist",Toast.LENGTH_SHORT).show();
loadingDialog.dismiss();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
所以基本上,当单击添加到购物车按钮时,它会将我带到 HomeActivty,但在显示“已成功添加到购物车”的吐司消息之前,它会显示“用户已成功登录”吐司两次。我的应用程序是否在返回 HomeActivity 时检查用户是否已登录(再次)?请帮忙
解决方法
如果有人看到我的问题一直想知道为什么?我找到了一个解决方案(耶!)。在我的 LoginActivity 中,我写了:
myRef.addValueEventListener(new ValueEventListener() {...
但我应该写:
myRef.addListenerForSingleValueEvent(new ValueEventListener() {...
因为 addValueEventListener() 一直在监听它所附加的查询或数据库引用。但是 addListenerForSingleValueEvent() 立即执行 onDataChange 方法,在执行该方法一次后,它停止侦听它所附加的参考位置。至此,问题解决。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。