引言
我有一个绘图活动,从我打开DialogFragment
的调色板中选择颜色。
嚼食
我第一次打开DialogFragment
时,我将bnColor对象设置为静态,并给它第一个按钮的值,因此,在调色板中,第一个按钮将显示为已选中,这是我的颜色会油漆。
但是如果我然后在调色板中选择另一种颜色,下次再次进入调色板时,我希望这种新颜色显示为选中状态。取而代之的是,第一种颜色始终处于选中状态。
我知道这是因为每次我输入DialogFragment
时,bnColor对象都为null,因此它始终是第一个颜色的值。为了解决这个问题,我需要做一些事情,比如保存bnColor对象的最后一个状态,所以当我进入dialogFragment时,它会检查是否是第一次,它是否为null,或者我之前输入过并具有之前的值保存。
但我从来没有做过这样的事情,我不知道怎么做。
这是dialogFragment上的相关代码:
private ImageButton bnColor;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(R.layout.palette, null, false);
if (bnColor == null) {
LinearLayout drawLayout = (LinearLayout) view.findViewById(R.id.paint_colors);
bnColor = (ImageButton) drawLayout.getChildAt(0);
bnColor.setImageDrawable(getResources().getDrawable(R.drawable.button_pressed));
}
答案 0 :(得分:0)
为什么不序列化bnColor object
本身以获得其最后状态?
转到here,您将在源代码中获得一个名为CustomSharedPreference
的文件,只需下载并将其复制到您身边并保存对象,就像保存任何其他首选项对象一样
CustomSharedPreference mPrefs = new CustomSharedPreference( getApplicationContext());
OR
CustomSharedPreference mPrefs = new CustomSharedPreference( "prefsName",Context.MODE_PRIVATE, getApplicationContext());
//Save your Object
mPrefs.putObject("object", new Object());
//Retrieve it and store it
Object o = (Object)mPrefs.getObject("object", null);
注意: 该视图不可序列化,因此您可以创建一个像implements Serializable
类这样的自定义ImageButton类,也可以创建一个自定义的ImageButton类。 MyImageButton
应该已经实现了Serializable
接口
public class MyImageButton extends ImageButton implements Serializable {
public MyImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
并在XML中使用它
<com.example.MyImageButton
android:id="@+id/MyimageButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon" />
答案 1 :(得分:0)
我以这种方式保存状态。
public class MyDialogFragment extends DialogFragment {
//this is the default value, set when the dialog is created
private String myValue = "any initial String";
private TextEdit myTextEdit;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//construct the dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
ViewGroup myView = (ViewGroup)inflater.inflate(R.layout.my_view, null);
builder.setView(myView);
//find the view and set the value
myTextEdit = (TextView)myView.findViewById(R.id.my_text_edit);
myTextEdit.setText(myValue);
return builder.create();
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
//when the dialog is dismissed, save the users input and overwrite the initial value
myValue = myTextEdit.getText();
}
答案 2 :(得分:-1)
你可以做这样的事情
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(R.layout.palette, null, false);
ImageButton bnColor;
if(bnColor == null)
{
LinearLayout drawLayout = (LinearLayout) view.findViewById(R.id.paint_colors);
if(savedInstanceState!=null)
bnColor= (ImageButton) getResources().getLayout(savedInstanceState.getInt("color"));
else
bnColor = (ImageButton) drawLayout.getChildAt(0);
bnColor.setImageDrawable(getResources().getDrawable(R.drawable.button_pressed));
}
int value= bnColor.getId();
savedInstanceState.putInt("color", value);
onSaveInstanceState(savedInstanceState);
}