2017-07-25 55 views
-4

我正在製作一個應用程序,在應用程序關閉並再次打開時,我必須保存動態創建的Android.Widget.Button對象及其屬性(如ID)。
這些按鈕保存在ArrayList中。將Android.Widget.Button轉換爲JSON

我的想法是將我的按鈕對象轉換爲JSON並將它們保存在SharedPreference中。

我現在的問題是,如果在計算器發現我不能轉換按鈕爲JSON,我用下面這段代碼,:

(因爲我是用一個新的鈕釦對象選拔賽)

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

它與String-Object或Integer-Object一起使用,但不與Button-Object一起使用。

有人可以幫助我嗎?

+0

告訴我你想要做什麼? –

+1

無法直接將按鈕作爲JsonObject存儲/轉換。 –

+0

我想將我的按鈕對象轉換爲Json,所以我可以在應用程序關閉時更容易地存儲它們 –

回答

1

如果您動態創建按鈕,這意味着您可能會爲它們設置一個顏色,一個文本......。 所以當你想保存它們時,你只需要知道你有多少個按鈕以及你爲它們設置了哪些自定義屬性。

所以你可以這樣做: 你管理2個列表,一個是按鈕,另一個是他們的自定義屬性。 爲了更容易,您可以使用自定義ButtonBuilder來管理屬性。 每次你想要一個新的按鈕,你創建一個新的ButtonBuilder,你設置屬性,你生成的按鈕,你將建設者和按鈕存儲在2個分離的列表。然後,您可以將構建器列表存儲在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; 
    } 
}