简体   繁体   中英

Error while passing a model from an activity to another

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM