动态编辑布局并保存

时间:2018-02-22 14:19:13

标签: android layout

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

enter image description here

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

2 个答案:

答案 0 :(得分:1)

您可以使用Below class在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;
        }

答案 1 :(得分:1)

您可以在SQLite database中保存状态。

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

P.S。对不起我的英文