0

I'm trying to edit the layout of my app dynamically, or better, there is an button, if I click the last button there will be two buttons, like this:

enter image description here

but if I exit from the app, and re-opening it, there will be just the "ADD" button, I know that I have to save the layout state. I tried to use sharedPreferences, but with SharedPreference's Editor I can only save simple type of variable, not array, how can I do? Is correct saving the state in onPause() method?

X_Wen
  • 21
  • 5

2 Answers2

1

You can used Below class for saving array in 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;
    }
}

You can save values or class object like below

To save value(object)

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

To Retrieve value(object)

 public YourClass getObject() {
            YourClass object;
            try {
                 object= (YourClass) ObjectSerializer.deserialize(mPrefs.getString("key",""));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return object;
        }
Nikunj Peerbits
  • 785
  • 4
  • 12
1

You can save state in SQLite database.

Create data class to hold button informations.
Then create your SQLiteOpenHelper class and tables by your data class.
When activity created load data from sqlite and prepare your layout.
Store layout state in onPause method of activity.

P.S. Sorry for my English