2016-09-12 24 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