0

TextView の小さなグループで TableRow を作成してみたかったのですが、それぞれがプリミティブな String データを保持しています。これらの TableRows の ArrayList を保存し、正常に読み書きできれば、Android 画面でデータシートやグラフを作成する時間を大幅に短縮できるのではないかと考えました。

見てみると、View のサブクラスをたくさん作成し、それらすべてに Serializable を実装する必要があるように感じます。それは私の能力を完全に超えています。

私の主な質問は、TextView のグループを TableRow に格納し、TableRows でいっぱいの配列を作成し、それぞれを TableLayout に個別に追加することは可能ですか?

これまでのところ、ObjectOutputStream を使用してデータを保存する以上のことはできません。NotSerializableException、InvalidAccessException、IllegalAccessException、EOFException、IOException など、あらゆる種類のさまざまな例外をスローし続けるからです。

私のコンセプトがあまり良くない場合、どこでこれを再考する必要があるか尋ねてもよろしいですか? 何を変更し、データのグループをどのように保存する必要がありますか? 前もって感謝します。

これ以上苦労することなく、TableRows の ArrayList を試して保存するために使用するコードと、過去 12 時間ノンストップで取り組んできたすべての巨大なジャンボを次に示します。

package tt.tt;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class Test extends Activity implements OnClickListener, Serializable {

    private static final long serialVersionUID = 2466231508464769438L;

    public class Format implements Serializable {
        private static final long serialVersionUID = 1L;
        public String name;
        public long points;
        public int position;
    }

    List<Format> formats = new ArrayList<Format>();
    TableRow row;
    TableLayout layout;

    @Override
    public void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.table);
        layout = (TableLayout) this.findViewById(R.id.table);
        Button make = (Button) this.findViewById(R.id.make);
        make.setOnClickListener(this);
        Button retrieve = (Button) this.findViewById(R.id.retrieve);
        retrieve.setOnClickListener(this);
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.make:
                make();
                break;
            case R.id.retrieve:
                retrieve();
                break;
        }
    }

    public void make() {
        Random r = new Random();
        Format f = new Format();
        f.name = r.toString();
        f.points = r.nextLong();
        f.position = r.nextInt(10);
        formats.add(f);

        FileOutputStream out;
        try {
            out = this.openFileOutput("format", Activity.MODE_PRIVATE);
            ObjectOutputStream output = new ObjectOutputStream(new BufferedOutputStream(out));
            output.writeObject(formats);
            output.flush();
            output.close();
        }
        catch (FileNotFoundException e) {
            Log.d("Test", "Can't save data", e);
        }
        catch (IOException e) {
            Log.d("Test", "Can't save data", e);
        }

        TextView text = new TextView(this);
        text.setText(Integer.toString(f.position));
        row = new TableRow(this);
        row.addView(text, 0, TableRow.LayoutParams.WRAP_CONTENT);
        text = new TextView(this);
        text.setText(f.name);
        row.addView(text, 1, TableRow.LayoutParams.WRAP_CONTENT);
        text = new TextView(this);
        text.setText(Long.toString(f.points));
        row.addView(text, 2, TableRow.LayoutParams.WRAP_CONTENT);

        layout.addView(row);
    }

    public void retrieve() {
        layout.removeAllViews();
        FileInputStream in;
        try {
            in = this.openFileInput("format");
            ObjectInputStream input = new ObjectInputStream(new BufferedInputStream(in));
            List<Format> temp = (List<Format>) input.readObject();
            input.close();
        }
        catch (FileNotFoundException e) {
            Log.d("Test", "Can't load data", e);
        }
        catch (StreamCorruptedException e) {
            Log.d("Test", "Can't load data", e);
        }
        catch (IOException e) {
            Log.d("Test", "Can't load data", e);
        }
        catch (ClassNotFoundException e) {
            Log.d("Test", "Can't load data", e);
        }
    }

}

残念ながら、ここでこの行に到達すると:

output.writeObject(formats);

Logcat から取得したエラーをスローします。

09-22 14:50:43.658: D/Test(29362): Can't save data
09-22 14:50:43.658: D/Test(29362): java.io.NotSerializableException: android.widget.TableLayout
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
09-22 14:50:43.658: D/Test(29362):  at java.util.ArrayList.writeObject(ArrayList.java:644)
09-22 14:50:43.658: D/Test(29362):  at java.lang.reflect.Method.invokeNative(Native Method)
09-22 14:50:43.658: D/Test(29362):  at java.lang.reflect.Method.invoke(Method.java:511)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1053)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
09-22 14:50:43.658: D/Test(29362):  at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
09-22 14:50:43.658: D/Test(29362):  at tt.tt.Test.make(Test.java:75)
09-22 14:50:43.658: D/Test(29362):  at tt.tt.Test.onClick(Test.java:55)
09-22 14:50:43.658: D/Test(29362):  at android.view.View.performClick(View.java:3549)
09-22 14:50:43.658: D/Test(29362):  at android.view.View$PerformClick.run(View.java:14400)
09-22 14:50:43.658: D/Test(29362):  at android.os.Handler.handleCallback(Handler.java:605)
09-22 14:50:43.658: D/Test(29362):  at android.os.Handler.dispatchMessage(Handler.java:92)
09-22 14:50:43.658: D/Test(29362):  at android.os.Looper.loop(Looper.java:154)
09-22 14:50:43.658: D/Test(29362):  at android.app.ActivityThread.main(ActivityThread.java:4945)
09-22 14:50:43.658: D/Test(29362):  at java.lang.reflect.Method.invokeNative(Native Method)
09-22 14:50:43.658: D/Test(29362):  at java.lang.reflect.Method.invoke(Method.java:511)
09-22 14:50:43.658: D/Test(29362):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-22 14:50:43.658: D/Test(29362):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-22 14:50:43.658: D/Test(29362):  at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

長いStarcraft 2セッションの後、それを理解しました。このすべての問題に対する実際の解決策は、パブリック、プロテクト、またはプライベートに関係なく、ネストされたクラスにインターフェイスである Serializable を実装しないことです。

そのインターフェイスをネストされたクラスに実装すると、外部クラス (この場合は Activity クラス) の他の要素もシリアル化しようとします。もちろん、失敗します。シリアル化できないメンバーとインスタンスが非常に多いため、Activity クラスをシリアル化することはできません。これを行うと、これを機能させることは不可能です。

それで全部です。

package tt.tt;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class Test extends Activity implements OnClickListener {

    List<Format> formats = new ArrayList<Format>();
    TableRow row;
    TableLayout layout;

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.make:
                make();
                break;
            case R.id.retrieve:
                retrieve();
                break;
        }
    }

    @Override
    public void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.table);
        layout = (TableLayout) this.findViewById(R.id.table);
        Button make = (Button) this.findViewById(R.id.make);
        make.setOnClickListener(this);
        Button retrieve = (Button) this.findViewById(R.id.retrieve);
        retrieve.setOnClickListener(this);
    }

    public void make() {
        Random r = new Random();
        Format f = new Format();
        f.position = r.nextInt(10);
        f.name = r.toString();
        f.points = r.nextLong();
        formats.add(f);

        FileOutputStream out;
        try {
            out = this.openFileOutput("format", Activity.MODE_PRIVATE);
            ObjectOutputStream output = new ObjectOutputStream(new BufferedOutputStream(out));
            output.writeObject(formats);
            output.flush();
            output.close();
        }
        catch (FileNotFoundException e) {
            Log.d("Format", "Can't save data", e);
        }
        catch (IOException e) {
            Log.d("Format", "Can't save data", e);
        }
    }

    public void retrieve() {
        formats.clear();
        FileInputStream in;
        try {
            in = this.openFileInput("format");
            ObjectInputStream input = new ObjectInputStream(new BufferedInputStream(in));
            formats = (ArrayList<Format>) input.readObject();
            input.close();
        }
        catch (FileNotFoundException e) {
            Log.d("Format", "Can't load data", e);
        }
        catch (StreamCorruptedException e) {
            Log.d("Format", "Can't load data", e);
        }
        catch (IOException e) {
            Log.d("Format", "Can't load data", e);
        }
        catch (ClassNotFoundException e) {
            Log.d("Format", "Can't load data", e);
        }
        int count = 0;
        while (count < formats.size()) {
            Format f = formats.get(count);
            row = new TableRow(this);
            TextView temp = new TextView(this);
            TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f);
            temp.setText(Integer.toString(f.position));
            row.addView(temp, 0, params);
            temp = new TextView(this);
            temp.setText(f.name);
            row.addView(temp, 1, params);
            temp = new TextView(this);
            temp.setText(Long.toString(f.points));
            row.addView(temp, 2, params);
            layout.addView(row);
            count++;
        }
    }
}

そして Format クラス:

package tt.tt;

import java.io.Serializable;

public class Format implements Serializable {
    private static final long serialVersionUID = 1L;
    public String name;
    public long points;
    public int position;

    @Override
    public String toString() {
        return new StringBuilder().append(Integer.toString(position)).append("    ").append(name).append("     ").append(points).toString();
    }
}
于 2012-09-22T13:54:56.797 に答える