我被抛出了我的布尔数组的异常,我不知道为什么会发生这种情况 . 我浏览了一些网站以获得针对此类问题的推荐或解决方案,但我没有找到任何内容 .
这就是我问SO的原因,因为我没有找到解决这个典型代码同样问题的问题 . 我坐了大约5个小时来实现SharedPreference .
这是我在 PreferenceClass
上运行的代码 . 我正在尝试从用户保存Multichoice输入 . 点击 musicPreference
后,应用程序崩溃,我被迫关闭它 .
boolean[] isSelectedMusic;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.main_settings);
musikPreference = findPreference(getString(R.string.pref_music_key));
listMusicName = getResources().getStringArray(R.array.music);
listMusicId = getResources().getStringArray(R.array.music_values);
isSelectedMusik = new boolean[listMusikName.length];
/*
TODO Guck wie sich der Input ändert je nachdem kann man sagen wie man es ändert
*/
if ((Arrays.equals(getStoredMusik("storedSelectedMusik"), isSelectedMusik))==false) {
isSelectedMusik = getStoredMusik("storedSelectedMusik");
}
musikPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
AlertDialog.Builder musik_dialog_builder = new AlertDialog.Builder(getActivity());
musik_dialog_builder.setTitle(R.string.pref_title_musik);
musik_dialog_builder.setMultiChoiceItems(listMusikName, isSelectedMusik, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int position, boolean is_selected) {
if (is_selected) {
userMusik.add(position);
System.out.println("Position des Items: +" + position);
} else {
userMusik.remove((Integer.valueOf(position)));
}
}
});
musik_dialog_builder.setCancelable(false);
musik_dialog_builder.setPositiveButton(R.string.ok_label, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
String musik = "";
for (int i = 0; i < userMusik.size(); i++) {
musik = musik + listMusikName[userMusik.get(i)];
System.out.println("Z.100 - Z.106\n" +
"item: " + musik + "\n" +
"i: " + i + "\n" +
"id:" + listMusikId[i] + "\n");
userMusikID.add(listMusikId[i]);
userMusikName.add(listMusikName[i]);
isSelectedMusik[i] = true;
if (i != userMusik.size() - 1) {
musik = musik + ", ";
System.out.println("Z.108 - Z.112\n" +
"item: " + musik + "\n" +
"i: " + i + "\n");
}
}
setMusik(musik);
storeSelectedMusik(isSelectedMusik,"storedSelectedMusik");
}
});
private void storeSelectedMusik(boolean[] isSelectedMusikList, String arrayName) {
SharedPreferences mSharedPreferences = this.getActivity().getSharedPreferences("DataOfSelectedMusik", 0);
SharedPreferences.Editor mEditor = mSharedPreferences.edit();
mEditor.putInt(arrayName + "_size", isSelectedMusikList.length);
for (int i = 0; i < isSelectedMusikList.length; i++) {
mEditor.putBoolean(arrayName + "_" + i, isSelectedMusikList[i]);
}
mEditor.apply();
}
private boolean[] getStoredMusik(String arrayName) {
SharedPreferences mSharedPreferences = this.getActivity().getSharedPreferences("DataOfSelectedMusik", 0);
int size = mSharedPreferences.getInt(arrayName + "_size", 0);
boolean[] isSelectedMusikArray = new boolean[size];
for (int i = 0; i < size; i++) {
isSelectedMusikArray[i] = mSharedPreferences.getBoolean(arrayName + "_" + i, false);
}
return isSelectedMusikArray;
}
这是我在Logcat上获得的异常 .
07-19 05:41:56.048 4769-4769 / cren.example.com.musiclover E / AndroidRuntime:FATAL EXCEPTION:main进程:cren.example.com.musiclover,PID:4769 java.lang.ArrayIndexOutOfBoundsException:length = 0 ; index = 0 at com.android.internal.app.AlertController $ AlertParams $ 1.getView(AlertController.java:1101)at android.widget.AbsListView.obtainView(AbsListView.java:2366)at android.widget.ListView.measureHeightOfChildren(ListView .java:1408)在android.view.measure.View中的android.view.List( . View.java:23169)上的android.widget.ListView.onMeasure(ListView.java:1315) . (ViewGroup.java:6749)在android.widget.FrameLayout.onMeasure(FrameLayout.java:185)的android.view.View.measure(View.java:23169)at com.android.internal.widget.AlertDialogLayout.tryOnMeasure(AlertDialogLayout.java:144)at at com.android.internal.widget.AlertDialogLayout.onMeasure(AlertDialogLayout.java:69)在android.view.vision.measure(View.java:23169)的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)在android上.widget.FrameLayout.onMeasure(FrameLayout.java:185)在android.view.vision.measure(View.java:23169)的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)在android上.widget.FrameLayout.onMeasure(FrameLayout.java:185)在android.view.measure.View.measure(View.java:23169)的android.view.measure.View.Stillgins(ViewGroup.java:6749)处于android.widget.FrameLayout . onMeasure(FrameLayout.java:185)位于android.view.View.RedImpl.performMeasure的android.view.View.measure(View.java:23169)的com.android.internal.policy.DecorView.onMeasure(DecorView.java:716) (ViewRootImpl.java:2719)位于android.view.ViewRootImpl.exeTraversals(ViewRootImpl.java:1856)的android.view.ViewRootImpl.mplHversal上的android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1545)(ViewRootImpl.java:1567) 1460)在Android.view.Chore上的android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:7184)以及android.view.Choreographer.Callbackss(Choreographer.java:761)中的android.view.Choreographer $ CallbackRecord.run(Choreographer.java:949) )android.view.Hand上的android.view.Choreographer.doFrame(Choreographer.java:696)android.view.Hand上的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:935) ler.handleCallback(Handler.java:873)位于android.app.AtoT.Thread.main(ActivityThread)的android.os.Handler.dispatchMessage(Handler.java:99)android.os.Looper.loop(Looper.java:193) .java:6669)位于com.android.internal.os.ZygoteInit的com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)的java.lang.reflect.Method.invoke(Native Method) . 主要(ZygoteInit.java:858)
1 回答
表示您的数组实际上是空的 . 您正在尝试获取空数组的第一个元素 .
我没有立即从你的stacktrace中看到哪一行抛出异常,但是有几个
array[index]
调用它可能发生 . 在这里,例如:您确认不超过
userMusik
的大小,但不检查您尝试从listMusikId
和listMusikName
检索的元素是否存在 .