2017-07-17 44 views
0

在我的活动中,我有一个字段是一个按钮。它的值始终是在活动中动态创建的LinearLayout中当前选定的按钮。我希望此字段始终指向当前选中的按钮,但是,如果我选择一个按钮然后更改配置,则该字段不再指向所选按钮。我可以做什么以便我可以在配置更改中保存此值? 这里是我的代码:如何在配置更改中保存按钮?

Activity.java

public class Activity extends AppCompatActivity { 
    Button myButton; 
    LinearLayout myLayout; 

    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     for (int i = 0; i < 2; i++) { 
      LinearLayout row = new LinearLayout(this); 
      LayoutParams rowParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1f); 
      row.setLayoutParams(rowParams); 
      for (int j = 0; j < 2; j++) { 
       final Button button = new Button(this); 
       button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         setMyButton(button); 
        } 
       }); 
      } 
      row.addView(button); 
     } 
     myLayout.addView(row); 
    } 

    public void setMyButton(Button button) { 
     myButton = button; 
    } 
} 

我已经调查使用一些savedInstanceState方法,但他们都没有一个按钮,只有整数和布尔值。 我该怎么做才能在配置更改时保留myButton的值?

+0

你可以保存所有按钮的数组当你产生这些然后只保存数组中的数组索引(一个int)。 – Henry

+0

谢谢!这对我很好。 –

回答

0

只要你有一定的方法可以使用onSaveInstanceState()识别你想保存的按钮;你不必保存按钮本身。

通常情况下,您可以使用按钮的id用于此目的,但由于您在运行时动态创建按钮(而不是将它们放入XML布局中),我建议使用按钮的tag

将按钮的标签保存在onSaveInstanceState()中,然后当您创建按钮时,如果您创建了具有相同标签的按钮,请将其保存为myButton

onSaveInstanceState()

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("myButtonTag", myButton != null ? (String) myButton.getTag() : null); 
} 

截至onCreate()顶部:

String myButtonTag = null; 

    if (savedInstanceState != null) { 
     myButtonTag = savedInstanceState.getString("myButtonTag"); 
    } 

里面你内心for循环:

  final Button button = new Button(this); 
      String tag = i + "," + j; 
      button.setTag(tag); 

      if (tag.equals(myButtonTag)) { 
       myButton = button; 
      }