Сериализация объекта, содержащего Drawable Android Java - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь сохранить ArrayList<Plant> (myPlantList) в файл с помощью этого метода.

public static void savePlants(Context c){
    try {
        FileOutputStream fOS = c.openFileOutput("plantArrList", c.MODE_PRIVATE);
        ObjectOutputStream oOS = new ObjectOutputStream(fOS);
        oOS.writeObject(myPlantList);
        oOS.close();
        fOS.close();
    } catch (IOException io) {
        io.printStackTrace();
    }
}

Я получаю сообщение об ошибке (это не приводит к сбою приложения) java.io.NotSerializableException: android.graphics.drawable.BitmapDrawable. Можно с уверенностью предположить, что BitmapDrawable, на который он ссылается, это Plant.image. Как мне сериализовать это ArrayList<Plant>, включая изображения растений. Я читал о сжатии BitMapDrawables с помощью метода .compress, но я не понимаю, как я мог бы сделать это для каждого Plant, сохраняя при этом файл ArrayList<Plant> в 1.

Вот соответствующая часть класса Plant.

public class Plant implements Serializable{
    private String name;
    private String date;
    private Drawable image;
    private String waterFrequency;

    public Plant(String n, Drawable i, String wF){
        this.name = n;
        Date time = Calendar.getInstance().getTime();
        this.date = MyApplication.gson.toJson(time);
        this.image = i;
        this.waterFrequency = wF;
    }
}

РЕДАКТИРОВАТЬ: Drawable получается из камеры. Снимок сделан с помощью камеры и сохранен как Drawable в newPlant Activity (ниже).

public class newPlant extends AppCompatActivity implements OnClickListener {

    private ImageButton plantCam;
    private FloatingActionButton savePlant;
    private EditText newPlantName;
    private EditText newPlantWF;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newplant);
        plantCam = (ImageButton)findViewById(R.id.newPlantImage);
        savePlant = (FloatingActionButton)findViewById(R.id.savePlant);
        newPlantName = findViewById(R.id.newPlantName);
        newPlantWF = findViewById(R.id.newPlantWF);
        plantCam.setOnClickListener(this);
        savePlant.setOnClickListener(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
            Bitmap bitmap = (Bitmap)data.getExtras().get("data");
        plantCam.setImageBitmap(bitmap);
    }

    public void onClick(View v){
        switch(v.getId()){
            case R.id.newPlantImage:{
                Log.d("plantCam", "clicked");
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent,0);
                break;
            }case R.id.savePlant:{
                Log.d("SavePlant", "clicked");
                Plant temp = new Plant(newPlantName.getText().toString(), plantCam.getDrawable(), newPlantWF.getText().toString());
                Log.d("plantBeingAdded", temp.toString());
                MyApplication.myPlantList.add(temp);
                MyApplication.savePlants(this);
                Log.d("SavePlant", "finished saving plant" + MyApplication.myPlantList.toString() + " end list");
                finish();
                break;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...