So I'm following Coding with Mitch's tutorial on Firestore and I'm changing it to fit my personals needs. I'm building a TO-DO App (This is my first ever app/project) Right now, I'm trying to make a second activity in order to view, update and delete the selected task (This activity is ViewTaskActivity). I'm stuck when trying to pass the current task from the MainActivity to the ViewTaskActivity. When I try to call a method on the task variable, it gives me an error. Here's the code:
Task Model:
package dev.raphdl.firebasepractice.models;
imports ...
@IgnoreExtraProperties
public class Task implements Parcelable {
private String title;
private String content;
private @ServerTimestamp Date timestamp;
private String note_id;
public Task(String title, String content, Date timestamp, String note_id) {
this.title = title;
this.content = content;
this.timestamp = timestamp;
this.note_id = note_id;
}
public Task(){
}
private Task(Parcel in) {
title = in.readString();
content = in.readString();
note_id = in.readString();
}
public static final Creator<Task> CREATOR = new Creator<Task>() {
@Override
public Task createFromParcel(Parcel in) {
return new Task(in);
}
@Override
public Task[] newArray(int size) {
return new Task[size];
}
};
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getTimestamp() {
return timestamp;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
public String getNote_id() {
return note_id;
}
public void setNote_id(String note_id) {
this.note_id = note_id;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(title);
parcel.writeString(content);
parcel.writeString(note_id);
}
}
MainActivity
package dev.raphdl.firebasepractice;
imports ...
public class MainActivity extends AppCompatActivity implements
View.OnClickListener,
IMainActivity {
@Override
public void updateTask(final Task mTask) {
DocumentReference docRef = db
.collection("users")
.document(mAuth.getCurrentUser().getUid())
.collection("tasks")
.document(mTask.getNote_id());
docRef.update("title", mTask.getTitle(),"content", mTask.getContent()).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull com.google.android.gms.tasks.Task<Void> task) {
if(task.isSuccessful()){
makeSnackBarMessage("Updated Task");
mAdapter.updateTask(mTask);
} else {
makeSnackBarMessage("Update Failed, Check logs");
}
}
});
}
@Override
public void deleteTask(final Task mTask){
DocumentReference docRef = db
.collection("users")
.document(mAuth.getCurrentUser().getUid())
.collection("tasks")
.document(mTask.getNote_id());
docRef.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull com.google.android.gms.tasks.Task<Void> task) {
if (task.isSuccessful()){
makeSnackBarMessage("Task Deleted");
mAdapter.deleteTask(mTask);
} else {
makeSnackBarMessage("Failed to Delete, Check Logs");
}
}
});
}
@Override
public void onTaskSelected(Task mTask) {
viewTaskActivity(mTask);
}
private void viewTaskActivity(Task task) {
Intent intent = new Intent(this, ViewTaskActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("Task", task);
intent.putExtras(bundle);
startActivity(intent);
}
}
MainActivityInterface
package dev.raphdl.firebasepractice;
import dev.raphdl.firebasepractice.models.Task;
public interface IMainActivity {
void createNewTask(String title, String content);
void onTaskSelected(Task mTask);
void updateTask (Task mTask);
void deleteTask(Task mTask);
}
ViewTaskActivity
package dev.raphdl.firebasepractice;
imports ...
public class ViewTaskActivity extends AppCompatActivity implements View.OnClickListener {
private IMainActivity mIMainActivity;
private Task mTask;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_task);
Bundle bundle = getIntent().getExtras();
mTask = bundle.getParcelable("Task");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.save_text_view: {
String title = titleEditText.getText().toString();
String content = contentEditText.getText().toString();
if (mTask != null) {
Toast.makeText(this, "mTask Not NULL", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onClick: mTask Not NULL");
mTask.setTitle(title);
mTask.setContent(content);
//THIS IS THE LINE THAT TRIGGERS THE ERROR
mIMainActivity.updateTask(mTask);
mainActivity();
}else {
Log.d(TAG, "onClick: mTask NULL");
Toast.makeText(this, "mTask NULL", Toast.LENGTH_SHORT).show();
}
break;
}
case R.id.delete_text_view: {
mIMainActivity.deleteTask(mTask);
mainActivity();
break;
}
}
}
private void mainActivity() {
Intent intent = new Intent(this, MainActivity.class);
Toast.makeText(this, "MainActivity", Toast.LENGTH_SHORT).show();
startActivity(intent);
}
}
Finally, the error:
6072-6072/dev.raphdl.firebasepractice E/AndroidRuntime: FATAL EXCEPTION: main
Process: dev.raphdl.firebasepractice, PID: 6072
java.lang.NullPointerException: Attempt to invoke interface method 'void dev.raphdl.firebasepractice.IMainActivity.updateTask(dev.raphdl.firebasepractice.models.Task)' on a null object reference
at dev.raphdl.firebasepractice.ViewTaskActivity.onClick(ViewTaskActivity.java:68)
at android.view.View.performClick(View.java:6256)
at android.view.View$PerformClick.run(View.java:24697)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Sorry for the big blocks of code.
FYI: the app gives me the same error when trying to delete the task
I'm am still a beginner so this could be me just forgetting something.
Thank you for reading this
First understand the basic concepts of JAVA. You have to create object of the class which is implementing the interface. In your case MainActivity is implementing interface IMainActivity. So you need to initialize mIMainActivity with MainActivity object for ex:
IMainActivity mIMainActivity = new MainActivity();
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.