2014-06-17 487 views
0

我想使用SharedPreferences保存我的複選框的狀態。我以爲我的代碼是正確的,因爲它沒有顯示任何錯誤。我檢查了LogCat的原因,顯然onResume有問題。爲什麼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> 

EDIT 2

這是我從原來的拿到了SharedPreferences代碼。 How to save the state of an Android CheckBox when the users exits the application?

+0

'lBox1'可能爲null – Raghunandan

+0

請看'Activity'生命週期。 'onResume'在'onCreateView'之前被調用。發生'NullPointerException'是因爲lBox1沒有被初始化。 – Wakim

+0

@Wakim恰恰相反 –

回答

0

該複選框爲空,因爲它未分配給任何視圖。在你的創建視圖中試試這個。請確保你在你的XML文件名爲lBox1有一個複選框:

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

嘿,謝謝你的回答,我實施了該行,並出於某種原因,它說我不能從視圖轉換複選框 – theCreed

+0

@theCreed這個文件的內容R.layout.suikoden_main_activity1 –

+0

我已經更新了代碼。我會說,lBox1來自我在某處找到的教程。它可以改變成任何東西,即時消息不會被榨取。謝謝! – theCreed

0

這是因爲CheckBox lBox1是不確定的。 在你onCreate()添加以下行:

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

這應該解決您的問題。

+0

實現此代碼,它是說,lBox1本地變量的值不使用 – theCreed

+0

您已將此添加到onCreate()?也看到我剛剛編輯的編輯。 –

0

onResume並不意味着你的想法。

它在生命週期開始時也被調用。它唯一重新開始的是主UI線程。

因此,它在第一次運行應用程序時調用load()方法之前調用save(...)方法。

+0

好的,謝謝,我該怎麼改變它?我在onStart和onStop上交換了onResume和onPause ...並且它仍然在同一行上崩潰 – theCreed

+0

onPause()很好。不要改變它。當然不要使用onStop()。只要警惕onResume()被調用時不會創建sharedpreference。 –

+0

好的謝謝,我該如何防範呢?對不起,所有的問題,但即時通訊初學者,感謝您的耐心 – theCreed