如何保存和加载 Android activity 的预设?

How to save and load presets of Android activity?

我有一个由多个容器(更具体地说是 FrameLayouts)组成的 Activity 以显示片段。这些片段实际上是音频效果,所以一旦我选择了一些片段显示在它们相应的容器中并调整了它们的旋钮(典型的吉他效果器),我想保存并加载它们的预设。

换句话说,我想把我的Activity的视图(有哪个效果器在哪个容器里的数据,旋钮是什么值等等)保存到一个文件,然后加载文件.加载时,我希望 Activity 切换到我保存在文件中的视图。

我做了保存和加载的界面,但是我找不到保存和加载我的视图的方法。我发现了很多保存和加载方向变化视图的例子,但没有一个保存和加载文件的例子。

这是我保存和加载的代码片段,可惜它不起作用。实际上,这只是我 "mushed" 通过我在互联网上找到的一些边际说明所做的,也许我不能离答案更远:

public void save_file (Object file, String fileName, Context context)  {
    try {
        FileOutputStream fos = context.openFileOutput(fileName, context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(MainActivity.this);
        oos.writeObject(file);
        oos.flush();
        oos.close();
        fos.close();
        if (fileName != null) {
            Toast.makeText(context, "Save successful", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(context, "Enter name", Toast.LENGTH_LONG).show();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static MainActivity load_file(String fileName, Context context) {

    MainActivity Main = null;
    try {
        FileInputStream fis = context.openFileInput(fileName);
        ObjectInputStream is = new ObjectInputStream(fis);
        Main = (MainActivity) is.readObject();
        is.close();
        fis.close();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return Main;
}

我也不知道如何将视图切换到加载的视图。谢谢你的帮助。

所以现在看起来您所做的只是在 load_file 中创建 MainActivity 的新实例,但这对您没有任何好处。在 Android 中,您无需处理创建 Activity 类 的实例,系统会为您完成。

在我看来,对于你正在尝试做的事情,你应该使用共享首选项来存储关于你的视图的信息,然后在 onCreate 方法中使用所有正确的值重新呈现视图主要Activity。如果您不熟悉 SharedPreferences,可以在此处查看文档:http://developer.android.com/reference/android/content/SharedPreferences.html

基本上,它只是像您已经在做的那样写入文件,但进行了一些抽象以便更方便。你想在 MainActivity 中有一个名为 mPrefs 的字段,像这样在 onCreate 中初始化它:

mPrefs = getSharedPreferences(<unique name here>, Context.MODE_PRIVATE);

例如,假设用户将吉他旋钮的张力调整为 6(我想象它被存储为一个 int)

SharedPreferences.Editor editor = mPrefs.edit();
//you should actually store the key string "guitar_knob_1" as a static final global variable rather than hard-coding
editor.putInt("guitar_knob_1", 6);
editor.commit();

现在,回到 onCreate,你可以有这样的东西:

if(mPrefs.getInt("guitar_knob_1", -1) != -1) { //-1 is the value we get if nothing is stored there
  //set the knob to the value we read
}

对我来说,按照您的要求进行操作的方法是存储与每个 FrameLayout 关联的视图名称的字符串,然后编写一些函数以在 onCreate 中呈现正确的视图.您实际上并不需要 "save" 视图,只需保存与它们关联的所有值并在 activity 打开时正确重建它们。希望对您有所帮助!