简体   繁体   中英

why is onResume crashing my app on start up?

I am trying to save the state of my checkbox using SharedPreferences. I thought I had the code correct as it is not showing up any errors. I checked the LogCat for the cause and apparently there is something wrong with the 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());
}

There is also a ListView in this fragment, which I have put above because it is rather long. I have tried removing the onResume, the app starts up but when I click on a checkbox and move to another fragment (from navigation drawer) it crashes. Both crashes has the same thing in common.

onResume crash because of...

mCheckBox.setChecked(load());

When onResume is removed the crash happens because of onPause (specific line below) when switching between fragments...

save(mCheckBox.isChecked());

any ideas? Thanks!

EDIT As requested - the following

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>

EDIT 2

This is where I got the SharedPreferences code from originally. How to save the state of an Android CheckBox when the users exits the application?

The checkbox is null as it is not assigned to any view. Try this in your oncreate view. Make sure you have a checkbox in your xml file named lBox1:

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

This is because CheckBox lBox1 is undefined. In your onCreate() add the following line:

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

This should solve your problem.

onResume does not mean what you think it means.

It gets called at the beginning of the lifecycle as well. The only thing it's resuming is the main UI thread.

So it calls your load() method before it calls your save(...) method the first time you run your application.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM