2016-09-12 4 views
1

Hallo, ich bin neu in Android-Entwicklung. Ich versuche eine Liste zu erstellen, die 4 Eingabefelder und ein Foto benötigt.Drawable ist nicht Serialisierung Ausnahme

Die Liste sollte in dem internen Speicher gespeichert werden, aber ich bin immer diese Fehlermeldung:

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

Person Bean-Klasse verfügt über 4 String-Variablen und eine Drawable. Danke für jede Hilfe.

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 } 

Antwort

0

Die ersten Off-Beans werden in Android nicht verwendet. Vielleicht hast du es nur so genannt, weil du es gewöhnt bist, aber wenn du tatsächlich versuchst, Bohnen in Android zu machen, schlage ich vor, dass du dich von diesem Konzept ganz mental wegbewegst.

Zweitens sind Zeichnungsobjekte nicht serialisierbar. Wenn Sie versuchen, ein Objekt über die serialisierbare Schnittstelle in eine Datei zu serialisieren, kann es kein Drawable enthalten, oder Sie müssen angepasste Serialisierungsfunktionen schreiben.

+0

Nein ich nenne es nur PersonBean Wenn ich Drawable nicht benutzen kann, dann was soll ich verwenden, ich bin neu – Alex

+1

Sie sollten nicht blindlings davon ausgehen, dass alles auf die Festplatte serialisiert werden kann. Was Sie stattdessen verwenden sollten - wahrscheinlich ein Dateisystem Pfad, wo das Bild zu finden ist. Oder ein Asset-Pfad. Eine Ressourcen-ID wäre gefährlich, da sie in verschiedenen Versionen möglicherweise nicht stabil sind. Eine Server-URL, wo das Bild heruntergeladen werden soll, wäre ebenfalls akzeptabel. –

+0

Sie meinen ich muss etwas mit ByteArray tun, um Bild zu speichern? – Alex

Verwandte Themen