2016-09-12 21 views
1

你好我是android开发新手。 我尝试制作一个需要4个输入字段和一张照片的列表。drawable是不可序列化的异常

名单应保存在内部存储,但我得到这个错误:

java.io.notserializableexception android.graphics.drawable.bitmapdrawable; 

人bean类有4个字符串变量和一个可绘制。 感谢您的帮助。

package com.example.awais_pc.savedataapp; 

import android.app.Dialog; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.Toast; 

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 
    ListView listview; 
    String fileName = "data.txt"; 
    ArrayList<PersonBean> personBeans ; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    listview = (ListView)findViewById(R.id.listView); 
     readDataInFile(); 

} 

    public void addRecord(View v){ 
     myDialog(); 
    } 
    public void myDialog(){ 
     final ImageButton imgbtn; 
     final EditText name,pass,email,phone; 
     final Dialog dialog = new Dialog(this); 
     dialog.setContentView(R.layout.mydialog); 
     dialog.setCancelable(false); 

     name = (EditText)dialog.findViewById(R.id.editTextName); 
     pass = (EditText)dialog.findViewById(R.id.editTextPassword); 
     email = (EditText)dialog.findViewById(R.id.editTextEmail); 
     phone = (EditText)dialog.findViewById(R.id.editTextPhone); 
      imgbtn = (ImageButton) dialog.findViewById(R.id.imageButton); 
     Button save = (Button) dialog.findViewById(R.id.buttonSubmit); 
     save.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       String nam = name.getText().toString(); 
       String pas = pass.getText().toString(); 
       String em = email.getText().toString(); 
       String ph = phone.getText().toString(); 
       Drawable dra = imgbtn.getDrawable(); 
       personBeans.add(new PersonBean(nam,pas,em,ph,dra)); 
       listview.setAdapter(new Mycustomlist(personBeans, MainActivity.this)); 

       dialog.dismiss(); 
      } 
     }); 
     dialog.show(); 
    } 

    private void writeDataInFile(){ 
     try { 
      FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE); 
      ObjectOutputStream oos = new ObjectOutputStream(fos); 
      oos.writeObject(personBeans); 
      oos.flush(); 
      oos.close(); 
      fos.close(); 
     } catch (Exception e) { 
      Toast.makeText(MainActivity.this, ""+e, Toast.LENGTH_SHORT).show(); 
      e.printStackTrace(); 
     } 

     listview.setAdapter(new Mycustomlist(personBeans, MainActivity.this)); 
    } // Write File 

    private void readDataInFile(){ 
     try { 
      FileInputStream fis = openFileInput(fileName); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
      personBeans = (ArrayList<PersonBean>)ois.readObject(); 
     } catch (Exception e) { 
      personBeans = new ArrayList<PersonBean>(); 
      Toast.makeText(MainActivity.this, ""+e, Toast.LENGTH_SHORT).show(); 
      e.printStackTrace(); 
     } 
     listview.setAdapter(new Mycustomlist(personBeans, MainActivity.this)); 

    }//Read File } 

回答

0

在Android中不使用首批豆。也许你只是这样命名的,因为你习惯这样做,但如果你真的想在Android中尝试bean,我建议你开始从心理上彻底摆脱这个概念。

其次,drawables是不可序列化的。如果你想通过可序列化的接口序列化一个对象到一个文件,它不能有一个Drawable,否则你将不得不编写自定义的序列化函数。

+0

不,我只是把它命名PersonBean 如果我不能使用Drawable那么我应该用什么来使用我新的 – Alex

+1

你不应该盲目地认为任何东西都可以被序列化到磁盘。你应该使用什么 - 可能是在哪里找到图像的文件系统路径。或资产路径。资源ID会很危险,因为它们在版本中可能不稳定。下载图像的服务器URL也是可以接受的。 –

+0

你的意思是我必须用ByteArray来存储图像吗? – Alex