【问题标题】:Edit layout dynamically and saving it动态编辑布局并保存
【发布时间】:2018-02-22 22:38:08
【问题描述】:

我正在尝试动态编辑我的应用程序的布局,或者更好的是,有一个按钮,如果我点击最后一个按钮会有两个按钮,如下所示:

但如果我退出应用程序并重新打开它,就会只有“添加”按钮,我知道我必须保存布局状态。 我尝试使用 sharedPreferences,但是使用 SharedPreference 的编辑器我只能保存简单类型的变量,而不是数组,我该怎么办? 在 onPause() 方法中保存状态是否正确?

【问题讨论】:

  • 看看 onSaveInstanceState 和 onRestoreInstanceState
  • @DroiDev 但这是在一个片段中:)
  • 那又怎样?你也可以在片段中做到这一点。例如stackoverflow.com/a/15914053/8200290
  • @DroiDev 我解决了这个问题,谢谢。

标签: android layout


【解决方案1】:

您可以使用以下类在 SharedPrefrences 中保存数组。

public class ObjectSerializer {

    public static String serialize(Serializable obj) throws IOException {
        if (obj == null) return "";
        ByteArrayOutputStream serialObj = new ByteArrayOutputStream();
        ObjectOutputStream objStream = new ObjectOutputStream(serialObj);
        objStream.writeObject(obj);
        objStream.close();
        return encodeBytes(serialObj.toByteArray());
    }

    public static Object deserialize(String str) throws IOException, ClassNotFoundException {
        if (str == null || str.length() == 0) return null;
        ByteArrayInputStream serialObj = new ByteArrayInputStream(decodeBytes(str));
        ObjectInputStream objStream = new ObjectInputStream(serialObj);
        return objStream.readObject();
    }

    private static String encodeBytes(byte[] bytes) {
        StringBuilder strBuf = new StringBuilder();

        for (byte aByte : bytes) {
            strBuf.append((char) (((aByte >> 4) & 0xF) + ((int) 'a')));
            strBuf.append((char) (((aByte) & 0xF) + ((int) 'a')));
        }

        return strBuf.toString();
    }

    private static byte[] decodeBytes(String str) {
        byte[] bytes = new byte[str.length() / 2];
        for (int i = 0; i < str.length(); i+=2) {
            char c = str.charAt(i);
            bytes[i/2] = (byte) ((c - 'a') << 4);
            c = str.charAt(i+1);
            bytes[i/2] += (c - 'a');
        }
        return bytes;
    }
}

您可以像下面这样保存值或类对象

保存值(对象)

 public void saveObject(YourClass classObject) {
        Editor edit = mPrefs.edit();
        try {
            edit.putString("key", ObjectSerializer.serialize(classObject)).apply();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

检索值(对象)

 public YourClass getObject() {
            YourClass object;
            try {
                 object= (YourClass) ObjectSerializer.deserialize(mPrefs.getString("key",""));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return object;
        }

【讨论】:

    【解决方案2】:

    您可以将状态保存在SQLite database

    创建数据类来保存按钮信息。
    然后通过您的数据类创建您的 SQLiteOpenHelper 类和表。
    当活动创建时,从 sqlite 加载数据并准备布局。
    在活动的 onPause 方法中存储布局状态。

    附:对不起我的英语

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2017-01-15
      相关资源
      最近更新 更多