访问另一个活动的方法

时间:2019-06-21 23:10:21

标签: android

我有一个medicine_activity类

package com.example.shubhmgajra.medikit;

import android.content.Intent;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class Medicine_Activity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "Medicine_Activity";
    private Button btnAdd;
    private ListView listMeds;
    private AppDatabase db;
    private ArrayAdapter<MedicineRecord> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_medicine);
        btnAdd = findViewById(R.id.btnAdd);
        btnAdd.setOnClickListener(this);
        listMeds = findViewById(R.id.listMeds);
        listMeds.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                MedicineRecord medicineRecord = db.medicineRecordDao().findMedicineById(id + 1);
                Intent intent = new Intent(getApplicationContext(), MedicineInputActivity.class);
                startActivity(intent);
                MedicineInputActivity.getInstance().update(medicineRecord, true);
            }
        });

        db = AppDatabase.getInstance(getApplicationContext());
        FeedAdapter feedAdapter = new FeedAdapter(Medicine_Activity.this, R.layout.list_record, db.medicineRecordDao().loadAllRecords());
        listMeds.setAdapter(feedAdapter);
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this, MedicineInputActivity.class);
        startActivity(intent);
    }
}

在这种情况下,我试图调用另一个活动(即MedicineInputActivity)的update()方法

package com.example.shubhmgajra.medikit;

import android.content.Intent;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TimePicker;
import android.widget.Toast;

public class MedicineInputActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "MedicineInputActivity";
    static EditText dosage;
    static EditText medName;
    static TimePicker timePicker;
    static Button btnSave;
    Button btnInc;
    Button btnDec;
    private AppDatabase db;
    private static MedicineInputActivity instance;
    boolean isEdit;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_medicine_input);
        isEdit = false;
        instance = this;
        dosage = findViewById(R.id.dosage);
        dosage.setShowSoftInputOnFocus(false);
        dosage.setCursorVisible(false);
        medName = findViewById(R.id.medName);
        timePicker = findViewById(R.id.simpleTimePicker);
        btnInc = findViewById(R.id.btnInc);
        btnDec = findViewById(R.id.btnDec);

        btnInc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = dosage.getText().toString();
                int tempVal = Integer.parseInt(val);
                tempVal++;

                dosage.setText("" + tempVal);
            }
        });
        btnDec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String val = dosage.getText().toString();
                int tempVal = Integer.parseInt(val);
                if (tempVal > 0) {
                    tempVal--;

                }
                dosage.setText("" + tempVal);
            }
        });
        btnSave = findViewById(R.id.btnSave);
        btnSave.setOnClickListener(this);
        db = AppDatabase.getInstance(getApplicationContext());
    }

    @Override
    public void onClick(View v) {
        String name = medName.getText().toString();
        int min = timePicker.getMinute();
        int hour = timePicker.getHour();
        String val = dosage.getText().toString();
        int dose = Integer.parseInt(val);
        MedicineRecord medicineRecord = new MedicineRecord(name, dose, min, hour);

        if (validate(name)) {
            if (isEdit) {
                db.medicineRecordDao().updateRecord(medicineRecord);
            } else {
                db.medicineRecordDao().insertRecord(medicineRecord);
            }
            Intent intent = new Intent(this, Medicine_Activity.class);
            startActivity(intent);
        } else {
            Toast toast = Toast.makeText(getApplicationContext(), "Medicine name cannot be empty", Toast.LENGTH_SHORT);
            toast.show();
        }
    }

    private boolean validate(String name) {
        if (name.length() == 0) {
            return false;
        } else {
            return true;
        }

    }

    public static MedicineInputActivity getInstance() {
        return instance;
    }

    public void update(MedicineRecord medicineRecord, boolean isEdit) {
        this.isEdit = isEdit;
        dosage.setText(medicineRecord.getDosage());
        medName.setText(medicineRecord.getMedName());
        timePicker.setHour(medicineRecord.getHour());
        timePicker.setMinute(medicineRecord.getMinute());
    }
}

我想要实现的是,当用户点击列表项时,输入活动被加载,并且用户可以更新记录。除了在MedicineInputActivity中创建更新方法,然后在Medicine_Activity中获取MedicineInputActivity的实例并调用update之外,我无法找到一种优雅的解决方案。 我收到类似“尝试在空对象引用上调用虚拟方法'void com.example.shubhmgajra.medikit.MedicineInputActivity.update()”的错误。

1 个答案:

答案 0 :(得分:0)

用户完成记录更新后,可以将数据从第二个活动返回到第一个活动。您应该通过在第一个活动中调用startActivityForResult()而不是startActivity()来开始第二个活动。您还应该在第一个活动中覆盖onActivityResult()。您可以阅读更多here

更新:

我认为您希望将选定的药品详细信息从Medicine_Activity发送到MedicineInputActivity。在这种情况下,您可以通过将选定的药物对象绑定到意图来发送它,如下所示:

public class Medicine_Activity ... {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        listMeds.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                MedicineRecord medicineRecord = db.medicineRecordDao().findMedicineById(id + 1);
                Intent intent = new Intent(getApplicationContext(), MedicineInputActivity.class);
                intent.putExtra("selectedMedicine", medicineRecord);
                startActivity(intent);
                MedicineInputActivity.getInstance().update(medicineRecord, true);
            }
        });
        ...
    }
}

然后在MedicineInputActivity上,您应该这样做:

public class MedicineInputActivity ... {

    MedicineRecord selectedMedicineRecord;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        selectedMedicineRecord = (MedicineRecord) getIntent().getParcelableExtra("selectedMedicine");
        ...
    }
}

要执行此操作,您的MedicineRecord类应实现Parcelable接口。