将Android.Widget.Button转换为JSON

时间:2017-07-25 11:05:02

标签: java android json serialization

我正在创建一个应用程序,当应用程序关闭并再次打开时,我必须保存动态创建的Android.Widget.Button-Objects及其属性,如ID。 这些按钮保存在ArrayList中。

我的想法是将我的Button-Objects转换为JSON并将它们保存在SharedPreference中。

我的问题现在是我无法将按钮转换为JSON,我正在使用以下代码,如果在stackoverflow上找到:

(对于试用我正在使用新的按钮对象)

Button btn = new Button(this); 
Gson gson = new Gson(); 
String json = gson.toJson(btn);

它使用String-Object或Integer-Object但不使用Button-Object。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

如果您动态创建按钮,则意味着您可能会为它们设置颜色,文本...... 因此,当您想要保存它们时,您只需要知道您拥有多少按钮以及您为每个按钮设置的自定义属性。

所以你可以这样做: 您可以管理2个列表,一个包含按钮,另一个包含自定义属性。 为了使其更容易,您可以使用自定义ButtonBuilder来管理属性。 每次需要一个新按钮时,您都可以创建一个新的ButtonBuilder,设置属性,生成按钮,并将构建器和按钮存储在两个单独的列表中。然后,您可以在SharedPrefs中存储构建器列表,并在下次打开应用程序时从此列表中重新生成按钮。

List<ButtonBuilder> mBuilders = new ArrayList<>();
List<Button> mButtons = new ArrayList<>();

/**
 * Display a new button
 */
public void addButton(/* List of parameters*/) {
    ButtonBuilder builder = new ButtonBuilder()
            .setBgColor(myColor)
            .setText(myText);

    Button button = builder.build(context);

    mBuilders.add(builder);
    mButtons.add(button);

    // ... Display the button
}

/**
 * Call this method when you need to regenerate the buttons
 */
public void regenerateButtonsOnStart() {
    // Get from shared preferences
    mBuilders = getBuildersFromSharedPrefs();

    Button btn;
    for (ButtonBuilder builder : mBuilders) {
        btn = builder.build(context);
        mButtons.add(btn);

        // ... Display the button
    }

}

/**
 * Custom button builder
 */

public class ButtonBuilder {
    private int mBgColor;
    private String mText;
    // ... whatever you want


    public ButtonBuilder() {
    }

    public ButtonBuilder setBgColor(int bgColor) {
        this.mBgColor = bgColor;
        return this;
    }

    public ButtonBuilder setText(String text) {
        this.mText = text;
        return this;
    }

    public Button build(Context context) {
        Button btn = new Button(context);
        btn.setText(mText);
        btn.setBackgroundColor(mBgColor);

        return btn;
    }
}