As the title suggests , the app is a simple crud app which keeps crashing after adding a card to it. The data is registered in the database(firebase) and the code is uploaded below along with the error.
FATAL EXCEPTION: main
Process: com.example.cryptoapp, PID: 19360
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ProgressBar.setVisibility(int)' on a null object reference
at com.example.cryptoapp.LoginActivity$2.onClick(LoginActivity.java:53)
The code for the login screen is as follows:
package com.example.cryptoapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
public class LoginActivity extends AppCompatActivity {
private TextInputEditText userNameEdt, pwdEdt;
private Button loginBtn;
private ProgressBar loadingPB;
private TextView registerTV;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
userNameEdt = findViewById(R.id.idEdtUserName);
pwdEdt = findViewById(R.id.idEdtPwd);
loginBtn = findViewById(R.id.idBtnLogin);
registerTV = findViewById(R.id.idTVRegister);
mAuth = FirebaseAuth.getInstance();
loadingPB = findViewById(R.id.idPBLoading);
registerTV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(LoginActivity.this, RegistrationActivity.class);
startActivity(i);
}
});
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadingPB.setVisibility(View.VISIBLE);
String userName = userNameEdt.getText().toString();
String pwd = pwdEdt.getText().toString();
if (TextUtils.isEmpty(userName) && TextUtils.isEmpty(pwd)) {
Toast.makeText(LoginActivity.this, "Please enter your details", Toast.LENGTH_SHORT).show();
return;
} else {
mAuth.signInWithEmailAndPassword(userName, pwd).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
loadingPB.setVisibility(View.GONE);
Toast.makeText(LoginActivity.this, "Login Successful", Toast.LENGTH_SHORT).show();
Intent i = new Intent(LoginActivity.this, MainActivity.class);
startActivity(i);
finish();
} else {
loadingPB.setVisibility(View.GONE);
Toast.makeText(LoginActivity.this, "Please Enter valid UserID and Password", Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
}
@Override
protected void onStart() {
super.onStart();
FirebaseUser user = mAuth.getCurrentUser();
if (user != null) {
Intent i = new Intent(LoginActivity.this, MainActivity.class);
startActivity(i);
this.finish();
}
}
}
I'll provide the code for the main screen as well just for reference:
package com.example.cryptoapp;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.ChildEventListener;
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.squareup.picasso.Picasso;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements CryptoRVAdapter.CryptoClickInterface{
private RecyclerView cryptoRV;
private ProgressBar loadingPB;
private FloatingActionButton addFAB;
private FirebaseDatabase firebaseDatabase;
private DatabaseReference databaseReference;
private ArrayList<CryptoRVModal> cryptoRVModalArrayList ;
private CryptoRVAdapter cryptoRVAdapter;
private RelativeLayout bottomSheetRL;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cryptoRV = findViewById(R.id.idRVCryptoes);
loadingPB = findViewById(R.id.idPBLoading);
addFAB = findViewById(R.id.idAddFAB);
firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference = firebaseDatabase.getReference("Cryptoes");
cryptoRVModalArrayList = new ArrayList<>();
bottomSheetRL = findViewById(R.id.idRLBSheet);
mAuth = FirebaseAuth.getInstance();
cryptoRVAdapter = new CryptoRVAdapter(cryptoRVModalArrayList,this,this);
cryptoRV.setLayoutManager(new LinearLayoutManager(this));
cryptoRV.setAdapter(cryptoRVAdapter);
addFAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,AddCryptoActivity.class));
}
});
getAllCryptos();
}
private void getAllCryptos(){
cryptoRVModalArrayList.clear();
databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
loadingPB.setVisibility(View.GONE);
cryptoRVModalArrayList.add(snapshot.getValue(CryptoRVModal.class));
cryptoRVAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
loadingPB.setVisibility(View.GONE);
cryptoRVAdapter.notifyDataSetChanged();
}
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {
loadingPB.setVisibility(View.GONE);
cryptoRVAdapter.notifyDataSetChanged();
}
@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
loadingPB.setVisibility(View.GONE);
cryptoRVAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
@Override
public void onCryptoClick(int position) {
displayBottomSheet(cryptoRVModalArrayList.get(position));
}
private void displayBottomSheet(CryptoRVModal cryptoRVModal) {
final BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this);
View layout = LayoutInflater.from(this).inflate(R.layout.bottom_sheet_dialog,bottomSheetRL);
bottomSheetDialog.setContentView(layout);
bottomSheetDialog.setCancelable(false);
bottomSheetDialog.setCanceledOnTouchOutside(true);
bottomSheetDialog.show();
TextView cryptoNameTV = layout.findViewById(R.id.idTVCryptoName);
TextView cryptoDescTV = layout.findViewById(R.id.idTVDescription);
TextView cryptoPriceTV = layout.findViewById(R.id.idTVPrice);
ImageView cryptoIV = layout.findViewById(R.id.idIVCrypto);
Button editBtn = layout.findViewById(R.id.idBtnEdit);
Button viewDetailsBtn = layout.findViewById(R.id.idBtnViewDetails);
cryptoNameTV.setText(cryptoRVModal.getCryptoName());
cryptoDescTV.setText(cryptoRVModal.getCryptoDescription());
cryptoPriceTV.setText("Rs." + cryptoRVModal.getCryptoPrice());
Picasso.get().load(cryptoRVModal.getCryptoImg()).into(cryptoIV);
editBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, EditCryptoActivity.class);
i.putExtra("crypto", cryptoRVModal);
startActivity(i);
}
});
viewDetailsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(cryptoRVModal.getCryptoLink()));
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
switch (id){
case R.id.idLogOut:
Toast.makeText(this, "User is Logged Out Successfully", Toast.LENGTH_SHORT).show();
mAuth.signOut();
Intent i = new Intent(MainActivity.this, LoginActivity.class);
startActivity(i);
this.finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Would really appreciate an input on this!!!