为什么onResume在启动时崩溃我的应用程序?

时间:2014-06-17 15:54:25

标签: android android-fragments checkbox sharedpreferences

我正在尝试使用SharedPreferences保存我的复选框的状态。我以为我的代码是正确的,因为它没有显示任何错误。我检查了LogCat的原因,显然onResume有问题。

SuikodenFragment.java

public class SuikodenFragment extends Fragment implements OnItemClickListener {
public static final String suikodenprefs = "SuikodenPrefs" ;
ListView listView;
ArrayAdapter<Model> adapter;
List<Model> list = new ArrayList<Model>();

@Override
public  View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
    // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.suikoden_main_activity1, container, false);
    listView = (ListView) view.findViewById(R.id.my_list);
    adapter = new SuikodenListAdapter(getActivity(),getModel());
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);
    //CheckBox lBox1 = (CheckBox) view.findViewById(R.id.check);

    return view;
}

@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
    TextView label = (TextView) v.getTag(R.id.label);
CheckBox checkbox = (CheckBox) v.getTag(R.id.check);
Toast.makeText(v.getContext(), label.getText().toString()+" "+isCheckedOrNot(checkbox), Toast.LENGTH_LONG).show();
}

private String isCheckedOrNot(CheckBox checkbox) {
    if(checkbox.isChecked())
    return "is checked";
    else
    return "is not checked";
}

private void save(final boolean isChecked) {
    SharedPreferences settings = getActivity().getSharedPreferences(suikodenprefs, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean("check", isChecked);
    editor.commit();
}

private boolean load() { 
    SharedPreferences settings = getActivity().getSharedPreferences(suikodenprefs, 0);
    return settings.getBoolean("check", false);
}

@Override
public void onPause() {
    super.onPause();
    save(mCheckBox.isChecked());
}

@Override
public void onResume() {
    super.onResume();
    mCheckBox.setChecked(load());
}

这个片段中还有一个ListView,我上面已经提到了它,因为它很长。我已经尝试删除onResume,应用程序启动但当我点击一个复选框并移动到另一个片段(从导航抽屉)它崩溃。两次崩溃都有相同的共同点。

onResume由于...而崩溃

mCheckBox.setChecked(load());

当删除onResume时,由于onPause(下面的特定行)在片段之间切换时发生崩溃...

save(mCheckBox.isChecked());

任何想法?谢谢!

编辑按要求 - 以下

suikoden_activity_main1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
android:id="@+id/my_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

suikoden_row_1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dip"
android:text="@+id/label"
android:textSize="25sp" >
</TextView>

<CheckBox
android:id="@+id/check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false" >
</CheckBox>

编辑2

这是我从最初获得SharedPreferences代码的地方。 How to save the state of an Android CheckBox when the users exits the application?

3 个答案:

答案 0 :(得分:0)

该复选框为null,因为它未分配给任何视图。在您的oncreate视图中尝试此操作。确保在xml文件中有一个名为lBox1的复选框:

lBox1 = view.findViewById(R.id.check);//be sure to reference correct layout or you will get class cast exception

答案 1 :(得分:0)

这是因为CheckBox lBox1未定义。 在onCreate()添加以下行:

lBox1 = (CheckBox) findViewById(R.id.check);

这可以解决您的问题。

答案 2 :(得分:0)

onResume并不意味着你的意思。

它也会在生命周期的开始时调用。它唯一恢复的是主UI线程。

因此,在第一次运行应用程序时调用save(...)方法之前调用load()方法。