Ale*_*dre 42 crash android datepicker device
编辑:我检查过该问题仅在手机设置为"法语"时出现.
我目前正在构建自己的应用程序,在手机上使用DatePicker小部件时遇到问题(调试模式手机:三星S5).
错误收集是:java.util.IllegalFormatConversionException
我添加了有关logcat中收集的问题的更多详细信息:
02-20 10:37:18.255 13029-13029/avappmobile.mytasks E/AndroidRuntime? FATAL EXCEPTION: main
Process: avappmobile.mytasks, PID: 13029
java.util.IllegalFormatConversionException: %d can't format java.lang.String arguments
at java.util.Formatter.badArgumentType(Formatter.java:1489)
at java.util.Formatter.transformFromInteger(Formatter.java:1689)
at java.util.Formatter.transform(Formatter.java:1461)
at java.util.Formatter.doFormat(Formatter.java:1081)
at java.util.Formatter.format(Formatter.java:1042)
at java.util.Formatter.format(Formatter.java:1011)
at java.lang.String.format(String.java:1803)
at android.content.res.Resources.getString(Resources.java:1453)
at android.content.Context.getString(Context.java:397)
at android.widget.SimpleMonthView$MonthViewTouchHelper.getItemDescription(SimpleMonthView.java:684)
at android.widget.SimpleMonthView$MonthViewTouchHelper.onPopulateNodeForVirtualView(SimpleMonthView.java:628)
at com.android.internal.widget.ExploreByTouchHelper.createNodeForChild(ExploreByTouchHelper.java:377)
at com.android.internal.widget.ExploreByTouchHelper.createNode(ExploreByTouchHelper.java:316)
at com.android.internal.widget.ExploreByTouchHelper.access$100(ExploreByTouchHelper.java:50)
at com.android.internal.widget.ExploreByTouchHelper$ExploreByTouchNodeProvider.createAccessibilityNodeInfo(ExploreByTouchHelper.java:711)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfVirtualNode(AccessibilityInteractionController.java:1179)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1091)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:1087)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:888)
at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:155)
at android.view.AccessibilityInteractionController.access$400(AccessibilityInteractionController.java:53)
at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:1236)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5834)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
Run Code Online (Sandbox Code Playgroud)
这是我的DialogFragment代码:
public class DatePFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
DatePicker dp;
OnDatePickedListener mCallback;
Integer mLayoutId = null;
// Interface definition
public interface OnDatePickedListener {
public void onDatePicked(int textId, int year, int month, int day);
}
// make sure the Activity implement the OnDatePickedListener
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (OnDatePickedListener)activity;
}
catch (final ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnDatePickedListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
mCallback = (OnDatePickedListener)getActivity();
Calendar cal = Calendar.getInstance();
Bundle bundle = this.getArguments();
mLayoutId = bundle.getInt("layoutId");
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
View view = getActivity().getLayoutInflater().inflate(R.layout.datepfragment, null);
dp = (DatePicker) view.findViewById(R.id.datePicker);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(),this,year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
if (mCallback != null) {
// Use the date chosen by the user.
mCallback.onDatePicked(mLayoutId, year, monthOfYear+1, dayOfMonth);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是相关的xml布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/txtDPTitle"
android:id="@+id/txtDPTitle"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_marginTop="35dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btnDPValidate"
android:id="@+id/btnDPValidate"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="35dp" />
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/datePicker"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="0dp"
android:datePickerMode="spinner"
android:calendarViewShown="false"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
事实是我有两种问题(导致应用程序崩溃):
我看到其他线程如:DatePicker在三星与android 5.0崩溃
在这个线程中我没有得到足够的信息,因为给定的解决方案只允许显示日历的微调器视图,而且显示的微调器没有居中并呈现为我的(直接放在屏幕的顶部).
如果您需要更多详细信息,请询问我.
谢谢.亚历克斯.
mre*_*elt 93
这是他们的Lollipop UI实现中的三星错误.它会影响Galaxy S4,S5,Note 3以及更多设备.对我们来说,它发生在de_DE和de_AT语言上,但它似乎是一个影响多种语言的问题.
我通过强制三星设备使用Holo主题作为日期选择器来修复它.在我们的DatePickerFragment中:
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
/* calendar code here */
Context context = getActivity();
if (isBrokenSamsungDevice()) {
context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog);
}
return new DatePickerDialog(context, this, year, month, day);
}
private static boolean isBrokenSamsungDevice() {
return (Build.MANUFACTURER.equalsIgnoreCase("samsung")
&& isBetweenAndroidVersions(
Build.VERSION_CODES.LOLLIPOP,
Build.VERSION_CODES.LOLLIPOP_MR1));
}
private static boolean isBetweenAndroidVersions(int min, int max) {
return Build.VERSION.SDK_INT >= min && Build.VERSION.SDK_INT <= max;
}
Run Code Online (Sandbox Code Playgroud)
感谢三星,他们的用户将无法获得精美的材料设计日期选择器.
Raa*_*nan 19
我有一个可能的FIX PATCH,实际上让用户继续使用Lollipop库.
我只能通过在带有Android 5.0.1法语的S4上启用TalkBack来重现崩溃,似乎三星将整个日期传递给用于可访问性的项目选择字符串而不是日期编号.
基于@mreichelt包装上下文的解决方案,我们可以覆盖getString(id,args)函数并实际修复问题.
context = new ContextWrapper(getActivity()) {
private Resources wrappedResources;
@Override
public Resources getResources() {
Resources r = super.getResources();
if(wrappedResources == null) {
wrappedResources = new Resources(r.getAssets(), r.getDisplayMetrics(), r.getConfiguration()) {
@NonNull
@Override
public String getString(int id, Object... formatArgs) throws NotFoundException {
try {
return super.getString(id, formatArgs);
} catch (IllegalFormatConversionException ifce) {
Log.e("DatePickerDialogFix", "IllegalFormatConversionException Fixed!", ifce);
String template = super.getString(id);
template = template.replaceAll("%" + ifce.getConversion(), "%s");
return String.format(getConfiguration().locale, template, formatArgs);
}
}
};
}
return wrappedResources;
}
};
Run Code Online (Sandbox Code Playgroud)
因此,如果我们将此上下文提供给DatePickerDialog构造函数,它将解决该问题.
更新: 当页面包含日期输入字段时,此问题也出现在webview中,我发现解决这两个问题(对话框和webview)的最佳方法是覆盖Activity getResources函数,如下所示:
@Override
public Resources getResources() {
if (wrappedResources == null) {
wrappedResources = wrapResourcesFixDateDialogCrash(super.getResources());
}
return wrappedResources;
}
public Resources wrapResourcesFixDateDialogCrash(Resources r) {
return new Resources(r.getAssets(), r.getDisplayMetrics(), r.getConfiguration()) {
@NonNull
@Override
public String getString(int id, Object... formatArgs) throws NotFoundException {
try {
return super.getString(id, formatArgs);
} catch (IllegalFormatConversionException ifce) {
Log.i("DatePickerDialogFix", "IllegalFormatConversionException Fixed!", ifce);
String template = super.getString(id);
template = template.replaceAll("%" + ifce.getConversion(), "%s");
return String.format(getConfiguration().locale, template, formatArgs);
}
}
};
}
Run Code Online (Sandbox Code Playgroud)
注意:该解决方案包含缓存资源 - 这意味着如果您在应用程序中有事件更改资源(如语言更改),则可能需要更新缓存资源.
| 归档时间: |
|
| 查看次数: |
12963 次 |
| 最近记录: |