Android Parcelable readStringArray() java.lang.RuntimeException: Nougat 上的数组长度错误
Android Parcelable readStringArray() java.lang.RuntimeException: bad array lengths on Nougat
所以我正在开发的应用程序 运行 出现了问题,该应用程序在 Android 7 及更高版本上 仅 崩溃。从 logcat 来看,错误似乎发生在我的 parcelable class.
上
这里是崩溃发生的地方(有parcelable的class):
public class LookupCriteriaBean implements Parcelable, Serializable {
private String lookupCode;
private String lookupField;
private String lookupDisplayName;
private String lookupSearchValue;
public LookupCriteriaBean(){
}
public LookupCriteriaBean(String s) {
if (s == null || "".equals(s.trim()))
throw new IllegalArgumentException("Invalid lookup criteria setting from server!");
int idx = 0;
String[] arrS = Tool.split(s, Global.DELIMETER_DATA);
lookupCode = arrS[idx++];
lookupField = arrS[idx++];
lookupDisplayName = arrS[idx++];
}
public LookupCriteriaBean(Parcel in) {
String[] arrS = new String[LookupCriteriaBean.class.getFields().length];
in.readStringArray(arrS);
int idx = 0;
lookupCode = arrS[idx++];
lookupField = arrS[idx++];
lookupDisplayName = arrS[idx++];
}
public String getLookupCode() {
return lookupCode;
}
public void setLookupCode(String lookupCode) {
this.lookupCode = lookupCode;
}
public String getLookupField() {
return lookupField;
}
public void setLookupField(String lookupField) {
this.lookupField = lookupField;
}
public String getLookupDisplayName() {
return lookupDisplayName;
}
public void setLookupDisplayName(String lookupDisplayName) {
this.lookupDisplayName = lookupDisplayName;
}
public String toString() {
return lookupDisplayName;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] { lookupCode, lookupField, lookupDisplayName });
}
public static final Parcelable.Creator<LookupCriteriaBean> CREATOR = new Parcelable.Creator<LookupCriteriaBean>() {
public LookupCriteriaBean createFromParcel(Parcel source) {
return new LookupCriteriaBean(source);
}
public LookupCriteriaBean[] newArray(int size) {
return new LookupCriteriaBean[size];
}
};
public String getLookupSearchValue() {
return lookupSearchValue;
}
public void setLookupSearchValue(String lookupSearchValue) {
this.lookupSearchValue = lookupSearchValue;
}
}
触发崩溃的行是in.readStringArray(arrS);
问题是崩溃只发生在 android 7 及更高版本上,它不会发生在我测试过的任何其他设备上,我不知道是什么原因造成的,因为该应用程序在所有设备上都运行良好除了牛轧糖设备。
这里是 logcat 输出:
E/AndroidRuntime( 3868): FATAL EXCEPTION: main
E/AndroidRuntime( 3868): Process: com.adins.msmfif, PID: 3868
E/AndroidRuntime( 3868): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adins.msmfif/com.adins.msm.LookupActivity}: java.lang.RuntimeException: bad array lengths
E/AndroidRuntime( 3868): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
E/AndroidRuntime( 3868): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
E/AndroidRuntime( 3868): at android.app.ActivityThread.-wrap12(ActivityThread.java)
E/AndroidRuntime( 3868): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
E/AndroidRuntime( 3868): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 3868): at android.os.Looper.loop(Looper.java:154)
E/AndroidRuntime( 3868): at android.app.ActivityThread.main(ActivityThread.java:6077)
E/AndroidRuntime( 3868): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 3868): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
E/AndroidRuntime( 3868): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
E/AndroidRuntime( 3868): Caused by: java.lang.RuntimeException: bad array lengths
E/AndroidRuntime( 3868): at android.os.Parcel.readStringArray(Parcel.java:1125)
E/AndroidRuntime( 3868): at com.adins.msm.model.LookupCriteriaBean.<init>(LookupCriteriaBean.java:33)
E/AndroidRuntime( 3868): at com.adins.msm.model.LookupCriteriaBean.createFromParcel(LookupCriteriaBean.java:80)
E/AndroidRuntime( 3868): at com.adins.msm.model.LookupCriteriaBean.createFromParcel(LookupCriteriaBean.java:1)
E/AndroidRuntime( 3868): at android.os.Parcel.readParcelable(Parcel.java:2470)
E/AndroidRuntime( 3868): at android.os.Parcel.readValue(Parcel.java:2364)
E/AndroidRuntime( 3868): at android.os.Parcel.readListInternal(Parcel.java:2778)
E/AndroidRuntime( 3868): at android.os.Parcel.readArrayList(Parcel.java:2035)
E/AndroidRuntime( 3868): at android.os.Parcel.readValue(Parcel.java:2385)
E/AndroidRuntime( 3868): at android.os.Parcel.readArrayMapInternal(Parcel.java:2717)
E/AndroidRuntime( 3868): at android.os.BaseBundle.unparcel(BaseBundle.java:269)
E/AndroidRuntime( 3868): at android.os.Bundle.getParcelableArrayList(Bundle.java:886)
E/AndroidRuntime( 3868): at com.adins.msm.LookupActivity.initialize(LookupActivity.java:59)
E/AndroidRuntime( 3868): at com.adins.msm.LookupActivity.onCreate(LookupActivity.java:49)
E/AndroidRuntime( 3868): at android.app.Activity.performCreate(Activity.java:6662)
E/AndroidRuntime( 3868): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
E/AndroidRuntime( 3868): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
感谢任何帮助
这是我的 activity 的代码,其中包含触发错误的按钮
public class LookupActivity extends Activity implements OnClickListener {
private ArrayAdapter<LookupCriteriaBean> listAdapter;
private String lovType;
public final LayoutParams defLayout = new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
private QuestionBean bean = null;
private LinearLayout questionContainer;
private int totalCriteia = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lookup);
initialize();
//---change to portrait mode---
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
private void initialize() {
setClickListener();
Bundle extras = getIntent().getExtras();
ArrayList<LookupCriteriaBean> list = extras.getParcelableArrayList(
Global.BUND_KEY_LOV_CRITERIA);
listAdapter = new ArrayAdapter<LookupCriteriaBean>(this,
android.R.layout.simple_spinner_item, list);
listAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bean = DynamicSurveyActivity.getQuestionInFocus();
lovType = bean.getAnswerType();
if(bean.getTextMaxLength()!=0){
totalCriteia = bean.getTextMaxLength();
}
questionContainer = (LinearLayout) findViewById(R.id.sub_search_bar);
questionContainer.setOrientation(LinearLayout.VERTICAL);
for (int i = 0; i < totalCriteia; i++) {
ViewGroup view = generateDropdownDesc(this,listAdapter, i);
questionContainer.addView(view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
}
}
private void setClickListener() {
Button btnSearch = (Button) findViewById(R.id.search_button);
btnSearch.setOnClickListener(this);
}
public void onClick(View v) {
Button btn = (Button) v;
int id = btn.getId();
if (R.id.search_button == id) {
String lookupSearchValue = this.getSearchValue().trim();
// if (this.validateSearchValue(lookupSearchValue)) {
LookupCriteriaBean lookupCriteriaBean[] = new LookupCriteriaBean[totalCriteia];
for (int i = 0; i < totalCriteia; i++) {
LinearLayout qContainer = (LinearLayout) questionContainer.getChildAt(i);
Spinner spinnerCriteria = (Spinner) qContainer.getChildAt(0);
int posSpinner = spinnerCriteria.getSelectedItemPosition();
EditText editText = (EditText) qContainer.getChildAt(1);
LookupCriteriaBean beanCriteria = listAdapter.getItem(posSpinner);
beanCriteria.setLookupSearchValue(editText.getText().toString().trim());
lookupCriteriaBean[i] = beanCriteria;
}
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put(Global.MAP_KEY_LOOKUP_CRITERIA, mergeLookupCriteriaBean(lookupCriteriaBean));
if (Global.AT_LOV.equals(lovType)) {
new LookupResultTask(this, getString(R.string.progressWait))
.execute(paramMap);
}
else if (Global.AT_LOV_W_FILTER.equals(lovType)) {
LookupManager lookupManager = new LookupManager();
QuestionBean qBean = DynamicSurveyActivity.getQuestionInFocus();
List<QuestionBean> listOfQuestion = DynamicSurveyActivity.getListOfQuestion();
lookupManager.setFilterValue(listOfQuestion, qBean);
paramMap.put(Global.MAP_KEY_LOOKUP_FILTER, qBean.getLovFilters());
new LookupResultTask(this, getString(R.string.progressWait))
.execute();
}
// }
}
}
private String getSearchValue() {
String value = "";
for (int i = 0; i < totalCriteia; i++) {
LinearLayout qContainer = (LinearLayout) questionContainer.getChildAt(i);
EditText editText = (EditText) qContainer.getChildAt(1);
value = value+editText.getText().toString().trim();
}
return value;
}
private boolean validateSearchValue(String searchValue) {
boolean valid = true;
List<String> errMessage = new ArrayList<String>();
if ("".equals(searchValue)) {
errMessage.add(getString(R.string.lovHint) + " " + getString(R.string.msgRequired));
}
if (errMessage.size() > 0) {
valid = false;
String[] msg = (String[]) errMessage.toArray(new String[errMessage.size()]);
String alert = Tool.implode(msg, "\n");
Toast.makeText(this, alert, Toast.LENGTH_LONG).show();
}
return valid;
}
public LinearLayout generateDropdownDesc(Activity activity,
ArrayAdapter<LookupCriteriaBean> listAdapter, int pos) {
LinearLayout container = new LinearLayout(activity);
container.setOrientation(LinearLayout.VERTICAL);
int totalOption = listAdapter.getCount();
final String prompt = getString(R.string.lovCriteria);
Spinner spinner = new Spinner(activity);
EditText desc = new EditText(activity);
desc.setHint(string.lovHint);
spinner.setAdapter(listAdapter);
spinner.setPrompt(prompt);
if (pos < totalOption) {
spinner.setSelection(pos);
} else {
int tempPos = (pos%totalOption);
spinner.setSelection(tempPos);
}
container.addView(spinner, defLayout);
container.addView(desc, defLayout);
return container;
}
private LookupCriteriaBean mergeLookupCriteriaBean(LookupCriteriaBean[] lookupCriteriaBeanArray) {
LookupCriteriaBean lookupCriteriaBean = new LookupCriteriaBean();
lookupCriteriaBean.setLookupCode(lookupCriteriaBeanArray[0].getLookupCode());
lookupCriteriaBean.setLookupDisplayName(lookupCriteriaBeanArray[0].getLookupDisplayName());
lookupCriteriaBean.setLookupField(lookupCriteriaBeanArray[0].getLookupField());
lookupCriteriaBean.setLookupSearchValue(lookupCriteriaBeanArray[0].getLookupSearchValue());
if (lookupCriteriaBeanArray.length > 1) {
for (int i = 1; i < lookupCriteriaBeanArray.length; i++) {
String code = lookupCriteriaBean.getLookupCode();
String field = lookupCriteriaBean.getLookupField();
String searchValue = lookupCriteriaBean.getLookupSearchValue();
lookupCriteriaBean.setLookupCode(code
+ Global.DELIMETER_SUBSUBDATA
+ lookupCriteriaBeanArray[i].getLookupCode());
lookupCriteriaBean.setLookupField(field
+ Global.DELIMETER_SUBSUBDATA
+ lookupCriteriaBeanArray[i].getLookupField());
lookupCriteriaBean.setLookupSearchValue(searchValue
+ Global.DELIMETER_SUBSUBDATA
+ lookupCriteriaBeanArray[i].getLookupSearchValue());
}
}
return lookupCriteriaBean;
}
R.id.search_button 按钮在 android 7 及更高版本上按下时崩溃
嗯...所以我尝试了各种方法,甚至重写了代码,但这个问题仍然存在,可能是牛轧糖中的其他东西导致了这个问题,有什么想法吗?
小提示!
您可以使用以下库,以简化 parcelable 的使用。
https://github.com/codepath/android_guides/wiki/Using-Parceler
如果您勾选 www.parcelabler.com,这可能是一个解决方案
public class LookupCriteriaBean implements Parcelable, Serializable {
private String lookupCode;
private String lookupField;
private String lookupDisplayName;
private String lookupSearchValue;
public String getLookupSearchValue() {
return lookupSearchValue;
}
public void setLookupSearchValue(String lookupSearchValue) {
this.lookupSearchValue = lookupSearchValue;
}
public String getLookupCode() {
return lookupCode;
}
public void setLookupCode(String lookupCode) {
this.lookupCode = lookupCode;
}
public String getLookupField() {
return lookupField;
}
public void setLookupField(String lookupField) {
this.lookupField = lookupField;
}
public String getLookupDisplayName() {
return lookupDisplayName;
}
public void setLookupDisplayName(String lookupDisplayName) {
this.lookupDisplayName = lookupDisplayName;
}
public String toString() {
return lookupDisplayName;
}
//
// Here is the implementation of parcelable
//
protected LookupCriteriaBean(Parcel in) {
lookupCode = in.readString();
lookupField = in.readString();
lookupDisplayName = in.readString();
lookupSearchValue = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(lookupCode);
dest.writeString(lookupField);
dest.writeString(lookupDisplayName);
dest.writeString(lookupSearchValue);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<LookupCriteriaBean> CREATOR = new Parcelable.Creator<LookupCriteriaBean>() {
@Override
public LookupCriteriaBean createFromParcel(Parcel in) {
return new LookupCriteriaBean(in);
}
@Override
public LookupCriteriaBean[] newArray(int size) {
return new LookupCriteriaBean[size];
}
};
}
在重写我的代码几次并引用其他具有相同问题的答案后,拆分字符串数组来分隔字符串解决了这个问题,尽管我仍然不知道为什么 getStringArray(arrS)
只会崩溃android 7 岁及以上。
我确实想知道为什么我的代码仍然可以在较低版本上正常运行。
所以将所有字段分开 和 以正确的顺序访问它们然后就可以了。
这是我的固定代码:
---------------snip---------------------------------
public LookupCriteriaBean(Parcel in) {
lookupCode = in.readString();
lookupField = in.readString();
lookupDisplayName = in.readString();
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(lookupCode);
dest.writeString(lookupField);
dest.writeString(lookupDisplayName);
}
-----------------snip--------------------------------
所以我正在开发的应用程序 运行 出现了问题,该应用程序在 Android 7 及更高版本上 仅 崩溃。从 logcat 来看,错误似乎发生在我的 parcelable class.
上这里是崩溃发生的地方(有parcelable的class):
public class LookupCriteriaBean implements Parcelable, Serializable {
private String lookupCode;
private String lookupField;
private String lookupDisplayName;
private String lookupSearchValue;
public LookupCriteriaBean(){
}
public LookupCriteriaBean(String s) {
if (s == null || "".equals(s.trim()))
throw new IllegalArgumentException("Invalid lookup criteria setting from server!");
int idx = 0;
String[] arrS = Tool.split(s, Global.DELIMETER_DATA);
lookupCode = arrS[idx++];
lookupField = arrS[idx++];
lookupDisplayName = arrS[idx++];
}
public LookupCriteriaBean(Parcel in) {
String[] arrS = new String[LookupCriteriaBean.class.getFields().length];
in.readStringArray(arrS);
int idx = 0;
lookupCode = arrS[idx++];
lookupField = arrS[idx++];
lookupDisplayName = arrS[idx++];
}
public String getLookupCode() {
return lookupCode;
}
public void setLookupCode(String lookupCode) {
this.lookupCode = lookupCode;
}
public String getLookupField() {
return lookupField;
}
public void setLookupField(String lookupField) {
this.lookupField = lookupField;
}
public String getLookupDisplayName() {
return lookupDisplayName;
}
public void setLookupDisplayName(String lookupDisplayName) {
this.lookupDisplayName = lookupDisplayName;
}
public String toString() {
return lookupDisplayName;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] { lookupCode, lookupField, lookupDisplayName });
}
public static final Parcelable.Creator<LookupCriteriaBean> CREATOR = new Parcelable.Creator<LookupCriteriaBean>() {
public LookupCriteriaBean createFromParcel(Parcel source) {
return new LookupCriteriaBean(source);
}
public LookupCriteriaBean[] newArray(int size) {
return new LookupCriteriaBean[size];
}
};
public String getLookupSearchValue() {
return lookupSearchValue;
}
public void setLookupSearchValue(String lookupSearchValue) {
this.lookupSearchValue = lookupSearchValue;
}
}
触发崩溃的行是in.readStringArray(arrS);
问题是崩溃只发生在 android 7 及更高版本上,它不会发生在我测试过的任何其他设备上,我不知道是什么原因造成的,因为该应用程序在所有设备上都运行良好除了牛轧糖设备。
这里是 logcat 输出:
E/AndroidRuntime( 3868): FATAL EXCEPTION: main
E/AndroidRuntime( 3868): Process: com.adins.msmfif, PID: 3868
E/AndroidRuntime( 3868): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adins.msmfif/com.adins.msm.LookupActivity}: java.lang.RuntimeException: bad array lengths
E/AndroidRuntime( 3868): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
E/AndroidRuntime( 3868): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
E/AndroidRuntime( 3868): at android.app.ActivityThread.-wrap12(ActivityThread.java)
E/AndroidRuntime( 3868): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
E/AndroidRuntime( 3868): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 3868): at android.os.Looper.loop(Looper.java:154)
E/AndroidRuntime( 3868): at android.app.ActivityThread.main(ActivityThread.java:6077)
E/AndroidRuntime( 3868): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 3868): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
E/AndroidRuntime( 3868): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
E/AndroidRuntime( 3868): Caused by: java.lang.RuntimeException: bad array lengths
E/AndroidRuntime( 3868): at android.os.Parcel.readStringArray(Parcel.java:1125)
E/AndroidRuntime( 3868): at com.adins.msm.model.LookupCriteriaBean.<init>(LookupCriteriaBean.java:33)
E/AndroidRuntime( 3868): at com.adins.msm.model.LookupCriteriaBean.createFromParcel(LookupCriteriaBean.java:80)
E/AndroidRuntime( 3868): at com.adins.msm.model.LookupCriteriaBean.createFromParcel(LookupCriteriaBean.java:1)
E/AndroidRuntime( 3868): at android.os.Parcel.readParcelable(Parcel.java:2470)
E/AndroidRuntime( 3868): at android.os.Parcel.readValue(Parcel.java:2364)
E/AndroidRuntime( 3868): at android.os.Parcel.readListInternal(Parcel.java:2778)
E/AndroidRuntime( 3868): at android.os.Parcel.readArrayList(Parcel.java:2035)
E/AndroidRuntime( 3868): at android.os.Parcel.readValue(Parcel.java:2385)
E/AndroidRuntime( 3868): at android.os.Parcel.readArrayMapInternal(Parcel.java:2717)
E/AndroidRuntime( 3868): at android.os.BaseBundle.unparcel(BaseBundle.java:269)
E/AndroidRuntime( 3868): at android.os.Bundle.getParcelableArrayList(Bundle.java:886)
E/AndroidRuntime( 3868): at com.adins.msm.LookupActivity.initialize(LookupActivity.java:59)
E/AndroidRuntime( 3868): at com.adins.msm.LookupActivity.onCreate(LookupActivity.java:49)
E/AndroidRuntime( 3868): at android.app.Activity.performCreate(Activity.java:6662)
E/AndroidRuntime( 3868): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
E/AndroidRuntime( 3868): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
感谢任何帮助
这是我的 activity 的代码,其中包含触发错误的按钮
public class LookupActivity extends Activity implements OnClickListener {
private ArrayAdapter<LookupCriteriaBean> listAdapter;
private String lovType;
public final LayoutParams defLayout = new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
private QuestionBean bean = null;
private LinearLayout questionContainer;
private int totalCriteia = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lookup);
initialize();
//---change to portrait mode---
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
private void initialize() {
setClickListener();
Bundle extras = getIntent().getExtras();
ArrayList<LookupCriteriaBean> list = extras.getParcelableArrayList(
Global.BUND_KEY_LOV_CRITERIA);
listAdapter = new ArrayAdapter<LookupCriteriaBean>(this,
android.R.layout.simple_spinner_item, list);
listAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
bean = DynamicSurveyActivity.getQuestionInFocus();
lovType = bean.getAnswerType();
if(bean.getTextMaxLength()!=0){
totalCriteia = bean.getTextMaxLength();
}
questionContainer = (LinearLayout) findViewById(R.id.sub_search_bar);
questionContainer.setOrientation(LinearLayout.VERTICAL);
for (int i = 0; i < totalCriteia; i++) {
ViewGroup view = generateDropdownDesc(this,listAdapter, i);
questionContainer.addView(view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
}
}
private void setClickListener() {
Button btnSearch = (Button) findViewById(R.id.search_button);
btnSearch.setOnClickListener(this);
}
public void onClick(View v) {
Button btn = (Button) v;
int id = btn.getId();
if (R.id.search_button == id) {
String lookupSearchValue = this.getSearchValue().trim();
// if (this.validateSearchValue(lookupSearchValue)) {
LookupCriteriaBean lookupCriteriaBean[] = new LookupCriteriaBean[totalCriteia];
for (int i = 0; i < totalCriteia; i++) {
LinearLayout qContainer = (LinearLayout) questionContainer.getChildAt(i);
Spinner spinnerCriteria = (Spinner) qContainer.getChildAt(0);
int posSpinner = spinnerCriteria.getSelectedItemPosition();
EditText editText = (EditText) qContainer.getChildAt(1);
LookupCriteriaBean beanCriteria = listAdapter.getItem(posSpinner);
beanCriteria.setLookupSearchValue(editText.getText().toString().trim());
lookupCriteriaBean[i] = beanCriteria;
}
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put(Global.MAP_KEY_LOOKUP_CRITERIA, mergeLookupCriteriaBean(lookupCriteriaBean));
if (Global.AT_LOV.equals(lovType)) {
new LookupResultTask(this, getString(R.string.progressWait))
.execute(paramMap);
}
else if (Global.AT_LOV_W_FILTER.equals(lovType)) {
LookupManager lookupManager = new LookupManager();
QuestionBean qBean = DynamicSurveyActivity.getQuestionInFocus();
List<QuestionBean> listOfQuestion = DynamicSurveyActivity.getListOfQuestion();
lookupManager.setFilterValue(listOfQuestion, qBean);
paramMap.put(Global.MAP_KEY_LOOKUP_FILTER, qBean.getLovFilters());
new LookupResultTask(this, getString(R.string.progressWait))
.execute();
}
// }
}
}
private String getSearchValue() {
String value = "";
for (int i = 0; i < totalCriteia; i++) {
LinearLayout qContainer = (LinearLayout) questionContainer.getChildAt(i);
EditText editText = (EditText) qContainer.getChildAt(1);
value = value+editText.getText().toString().trim();
}
return value;
}
private boolean validateSearchValue(String searchValue) {
boolean valid = true;
List<String> errMessage = new ArrayList<String>();
if ("".equals(searchValue)) {
errMessage.add(getString(R.string.lovHint) + " " + getString(R.string.msgRequired));
}
if (errMessage.size() > 0) {
valid = false;
String[] msg = (String[]) errMessage.toArray(new String[errMessage.size()]);
String alert = Tool.implode(msg, "\n");
Toast.makeText(this, alert, Toast.LENGTH_LONG).show();
}
return valid;
}
public LinearLayout generateDropdownDesc(Activity activity,
ArrayAdapter<LookupCriteriaBean> listAdapter, int pos) {
LinearLayout container = new LinearLayout(activity);
container.setOrientation(LinearLayout.VERTICAL);
int totalOption = listAdapter.getCount();
final String prompt = getString(R.string.lovCriteria);
Spinner spinner = new Spinner(activity);
EditText desc = new EditText(activity);
desc.setHint(string.lovHint);
spinner.setAdapter(listAdapter);
spinner.setPrompt(prompt);
if (pos < totalOption) {
spinner.setSelection(pos);
} else {
int tempPos = (pos%totalOption);
spinner.setSelection(tempPos);
}
container.addView(spinner, defLayout);
container.addView(desc, defLayout);
return container;
}
private LookupCriteriaBean mergeLookupCriteriaBean(LookupCriteriaBean[] lookupCriteriaBeanArray) {
LookupCriteriaBean lookupCriteriaBean = new LookupCriteriaBean();
lookupCriteriaBean.setLookupCode(lookupCriteriaBeanArray[0].getLookupCode());
lookupCriteriaBean.setLookupDisplayName(lookupCriteriaBeanArray[0].getLookupDisplayName());
lookupCriteriaBean.setLookupField(lookupCriteriaBeanArray[0].getLookupField());
lookupCriteriaBean.setLookupSearchValue(lookupCriteriaBeanArray[0].getLookupSearchValue());
if (lookupCriteriaBeanArray.length > 1) {
for (int i = 1; i < lookupCriteriaBeanArray.length; i++) {
String code = lookupCriteriaBean.getLookupCode();
String field = lookupCriteriaBean.getLookupField();
String searchValue = lookupCriteriaBean.getLookupSearchValue();
lookupCriteriaBean.setLookupCode(code
+ Global.DELIMETER_SUBSUBDATA
+ lookupCriteriaBeanArray[i].getLookupCode());
lookupCriteriaBean.setLookupField(field
+ Global.DELIMETER_SUBSUBDATA
+ lookupCriteriaBeanArray[i].getLookupField());
lookupCriteriaBean.setLookupSearchValue(searchValue
+ Global.DELIMETER_SUBSUBDATA
+ lookupCriteriaBeanArray[i].getLookupSearchValue());
}
}
return lookupCriteriaBean;
}
R.id.search_button 按钮在 android 7 及更高版本上按下时崩溃
嗯...所以我尝试了各种方法,甚至重写了代码,但这个问题仍然存在,可能是牛轧糖中的其他东西导致了这个问题,有什么想法吗?
小提示!
您可以使用以下库,以简化 parcelable 的使用。
https://github.com/codepath/android_guides/wiki/Using-Parceler
如果您勾选 www.parcelabler.com,这可能是一个解决方案
public class LookupCriteriaBean implements Parcelable, Serializable {
private String lookupCode;
private String lookupField;
private String lookupDisplayName;
private String lookupSearchValue;
public String getLookupSearchValue() {
return lookupSearchValue;
}
public void setLookupSearchValue(String lookupSearchValue) {
this.lookupSearchValue = lookupSearchValue;
}
public String getLookupCode() {
return lookupCode;
}
public void setLookupCode(String lookupCode) {
this.lookupCode = lookupCode;
}
public String getLookupField() {
return lookupField;
}
public void setLookupField(String lookupField) {
this.lookupField = lookupField;
}
public String getLookupDisplayName() {
return lookupDisplayName;
}
public void setLookupDisplayName(String lookupDisplayName) {
this.lookupDisplayName = lookupDisplayName;
}
public String toString() {
return lookupDisplayName;
}
//
// Here is the implementation of parcelable
//
protected LookupCriteriaBean(Parcel in) {
lookupCode = in.readString();
lookupField = in.readString();
lookupDisplayName = in.readString();
lookupSearchValue = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(lookupCode);
dest.writeString(lookupField);
dest.writeString(lookupDisplayName);
dest.writeString(lookupSearchValue);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<LookupCriteriaBean> CREATOR = new Parcelable.Creator<LookupCriteriaBean>() {
@Override
public LookupCriteriaBean createFromParcel(Parcel in) {
return new LookupCriteriaBean(in);
}
@Override
public LookupCriteriaBean[] newArray(int size) {
return new LookupCriteriaBean[size];
}
};
}
在重写我的代码几次并引用其他具有相同问题的答案后,拆分字符串数组来分隔字符串解决了这个问题,尽管我仍然不知道为什么 getStringArray(arrS)
只会崩溃android 7 岁及以上。
我确实想知道为什么我的代码仍然可以在较低版本上正常运行。
所以将所有字段分开 和 以正确的顺序访问它们然后就可以了。
这是我的固定代码:
---------------snip---------------------------------
public LookupCriteriaBean(Parcel in) {
lookupCode = in.readString();
lookupField = in.readString();
lookupDisplayName = in.readString();
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(lookupCode);
dest.writeString(lookupField);
dest.writeString(lookupDisplayName);
}
-----------------snip--------------------------------