0

メインのアクティビティがあり、listItem を押すと、インテントによって新しいアクティビティが起動されます。この新しいアクティビティのテーマはダイアログです(つまり、2 番目のアクティビティがメイン アクティビティの上に浮かんでいるように見えます)。

この新しいアクティビティでは、EditTexts にデータを入力し、そのデータを使用してカスタム オブジェクトを作成し、内部ストレージに保存しようとします。

ファイルを作成していないようです。他のアクティビティで他のオブジェクトと同じ構造を使用していて、正しく機能しているため、なぜ機能しないのかよくわかりません。これは、このアクティビティのテーマが Dialogであるという事実と関係があるに違いないと私に思わせるものです。カスタム オブジェクト クラスは明らかに Serializable を実装しており、Android マニフェストにすべてのアクセス許可があります。おそらく、問題は保存メソッド()に渡すコンテキストに関連しているgetApplicationContext()可能性があります。

これは、ダイアログ テーマのアクティビティです。

package es.lagoacunado.lagoacunadoconsutores;

import java.io.File;

import utilidades.SeriaPreferencias;
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.EditText;
import clases.Preferencia;

public class Preferencias extends Activity {

    EditText ftpDir, ftpUser, ftpPass;
    Button btnGuardar, btnCancelar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.preferencias);

        this.setFinishOnTouchOutside(false);

        ftpDir = (EditText) findViewById(R.id.ftpDIR);
        ftpUser = (EditText) findViewById(R.id.ftpUSER);
        ftpPass = (EditText) findViewById(R.id.ftpPASS);
        btnGuardar = (Button) findViewById(R.id.btnGuardar);
        btnCancelar = (Button) findViewById(R.id.btnCancelar);

        File filePref = new File("preferencias.dat");
        if (filePref.exists()) {
            /*
             * ftpDir.setText(SeriaPreferencias.cargarPreferencias(
             * getApplicationContext()).getDirFTP());
             * ftpUser.setText(SeriaPreferencias.cargarPreferencias(
             * getApplicationContext()).getUsrFTP());
             * ftpPass.setText(SeriaPreferencias.cargarPreferencias(
             * getApplicationContext()).getPssFTP());
             */
            Preferencia loadPref = SeriaPreferencias
                    .cargarPreferencias(getApplicationContext());
            ftpDir.setText(loadPref.getDirFTP());
            ftpUser.setText(loadPref.getUsrFTP());
            ftpPass.setText(loadPref.getPssFTP());
        }

        btnGuardar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                String dir, usr, pss;
                dir = ftpDir.getText().toString();
                usr = ftpUser.getText().toString();
                pss = ftpPass.getText().toString();

                //Log.d("PRUEBA Guardar Preferencias", "dir= "+dir+" -- user= "+usr+" -- pss= "+pss);

                Preferencia pref = new Preferencia(dir, usr, pss);
                // METHOD THAT SAVES THE OBJECT pref
                SeriaPreferencias.guardarPreferencias(getApplicationContext(),
                        pref);

                File prueba = new File("preferencias.dat");
                if(prueba.exists()){
                    Log.d("-->PRUEBA", "EL ARCHIVO EXISTE");
                }

                finish();
            }
        });

        btnCancelar.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

}

これは、保存および読み込みメソッドを持つクラスです。

package utilidades;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.content.Context;
import android.util.Log;
import clases.Preferencia;

public class SeriaPreferencias {

    private static String FICHERO = "preferencias.dat";

    public static void guardarPreferencias(Context context, Preferencia prefs) {

        try {
            FileOutputStream fos = context.openFileOutput(FICHERO,
                    Context.MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            oos.writeObject(prefs);

            oos.close();
            fos.close();

        } catch (Exception e) {
            Log.e("MiCV", e.getMessage(), e);
        }
    }

    public static Preferencia cargarPreferencias(Context context) {
        Preferencia prefs = null;

        try {

            FileInputStream fis = context.openFileInput(FICHERO);
            ObjectInputStream ois = new ObjectInputStream(fis);

            prefs = (Preferencia) ois.readObject();

            ois.close();
            fis.close();

        } catch (Exception e) {
            Log.e("MiCV", e.getMessage(), e);
        }

        return prefs;
    }

}

これがカスタム オブジェクト クラスです。

package clases;

import java.io.Serializable;

public class Preferencia implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private String dirFTP, usrFTP, pssFTP;

    public Preferencia() {

    }

    public Preferencia(String dirFTP, String usrFTP, String pssFTP) {
        this.dirFTP = dirFTP;
        this.usrFTP = usrFTP;
        this.pssFTP = pssFTP;
    }

    public String getDirFTP() {
        return dirFTP;
    }

    public void setDirFTP(String dirFTP) {
        this.dirFTP = dirFTP;
    }

    public String getUsrFTP() {
        return usrFTP;
    }

    public void setUsrFTP(String usrFTP) {
        this.usrFTP = usrFTP;
    }

    public String getPssFTP() {
        return pssFTP;
    }

    public void setPssFTP(String pssFTP) {
        this.pssFTP = pssFTP;
    }

}
4

1 に答える 1

0
 File filePref = new File("preferencias.dat");

ファイル名のみを指定し、ディレクトリを指定しないと、現在の作業ディレクトリ内のファイルが参照されますが、これはファイルシステムのルート ディレクトリである可能性が高く、不適切な場所であるだけでなく、アプリケーションから書き込み可能ではありません。

Context.openFileOuput(filename) を使用して FileOutputStream を開くか作成する場合、ファイル名は内部ストレージのアプリのプライベート ディレクトリ内の場所を参照します。

onCreate() メソッドの実行中または実行後に、Activity クラスまたはその他の有効なコンテキスト内から、アプリケーションのプライベート ストレージ領域内の同じファイルを指すファイル オブジェクトを作成するには、次を使用できます。

File filePref = new File(getFilesDir(), "preferencias.dat");

Context.getFilesDir() は、Context.openFileOutput() が使用するのと同じプライベート フォルダーの場所を参照するためです。

于 2014-05-13T15:23:21.390 に答える