- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在开发一个简单的项目,该项目包含一个包含在 Web View 中的网站,并带有少量交互,以提高网站本身与 Android 移动设备之间的交互性。
由于网站包含用户生日的日期输入字段,我希望实现一个与所有设备兼容的微调器格式的日期选择器。我尝试实现以下解决方案:
`<style name="MyAppTheme" parent="android:Theme.Material">
<item name="android:dialogTheme">@style/MyDialogTheme</item>
<item name="android:datePickerStyle">@style/MyDatePicker</item>
</style>
<style name="MyDialogTheme" parent="android:Theme.Material.Dialog">
<item name="android:datePickerStyle">@style/MyDatePicker</item>
</style>
<style name="MyDatePicker" parent="android:Widget.Material.DatePicker">
<item name="android:datePickerMode">spinner</item>
</style>`
如图: Datepicker dialog without calendar visualization in lollipop [spinner mode]?
但是,正如答案所指出的那样,由于以下已知错误,此解决方案不适用于 Android 7.0 Nougat/API 24:https://issuetracker.google.com/issues/37119315
在做一些研究时,我遇到了一些建议的解决方案,例如:
https://gist.github.com/uqmessias/d9a8dc624af935f344dfa2e8928490ec
https://gist.github.com/lognaturel/232395ee1079ff9e4b1b8e7096c3afaf
DatePickerDialog Holo styling failed on Android 7 Nougat
但就我而言,它们似乎都不适用于搭载 Android 7.0 的设备或任何其他设备。
我在 Android 开发方面经验不足,所以我想知道是什么导致了这个问题,我该如何解决它,因为一些解决方案一直维护到最近,几乎丢弃了它们可能已经过时的东西。
我是否需要实现我发布的代码中未指出且我不知道的内容?
是不是 datepicker 元素是直接从 Web View 而不是从应用程序本身调用的,这使得这些解决方案对我来说毫无用处吗?如果是这样,是否有任何解决方法?
最佳答案
我遇到了同样的问题(用户不想逐月向后滚动 40 年来查找他们的出生年份,而且大多数人不知道您只需单击 android 日期选择器中的年份即可滚动经过多年)。像你一样,我无法让微调器普遍工作,所以我想出了(在 SO 和 Google 的帮助下)如何让它在年份选择模式下启动。
我的 DatePickerDialogFragment
的代码粘贴在下面。
public class DatePickerDialogFragment extends DialogFragment {
private DatePickerDialog.OnDateSetListener listener = null;
void setListener(DatePickerDialog.OnDateSetListener listener) {
this.listener = listener;
}
private static final String START_IN_YEARS = "com.myapp.picker.START_IN_YEARS";
private static final String YEAR = "com.myapp.picker.YEAR";
private static final String MONTH = "com.myapp.picker.MONTH";
private static final String DAY_OF_MONTH = "com.myapp.picker.DAY_OF_MONTH";
public static DatePickerDialogFragment newInstance(boolean startInYears, Calendar c) {
DatePickerDialogFragment f = new DatePickerDialogFragment();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
Bundle args = new Bundle();
args.putBoolean(START_IN_YEARS, startInYears);
args.putInt(YEAR, year);
args.putInt(MONTH, month);
args.putInt(DAY_OF_MONTH, day);
f.setArguments(args);
return f;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle args = getArguments();
DatePickerDialog dpd = null;
if( listener != null && args != null) {
boolean startInYears = args.getBoolean(START_IN_YEARS);
Context context = getActivity();
boolean requireSpinnerMode = isBrokenSamsungDevice();
if (requireSpinnerMode) {
context = new ContextThemeWrapper(context, android.R.style.Theme_Holo_Light_Dialog);
}
int year = args.getInt(YEAR);
int month = args.getInt(MONTH);
int day = args.getInt(DAY_OF_MONTH);
dpd = new DatePickerDialog(context, listener, year, month, day);
if (startInYears && !requireSpinnerMode) {
boolean canOpenYearView = openYearView(dpd.getDatePicker());
if (!canOpenYearView) {
context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Light_Dialog);
dpd = new DatePickerDialog(context, listener, year, month, day);
}
}
}
else {
setShowsDialog(false);
dismissAllowingStateLoss();
}
return dpd;
}
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;
}
private static boolean openYearView(DatePicker datePicker) {
if( isBrokenSamsungDevice() ) {
return false;
}
View v = datePicker.findViewById(Resources.getSystem().getIdentifier("date_picker_header_year", "id", "android"));
if( v != null ) {
v.performClick();
}
else {
try {
Field mDelegateField = datePicker.getClass().getDeclaredField("mDelegate");
mDelegateField.setAccessible(true);
Object delegate = mDelegateField.get(datePicker);
Method setCurrentViewMethod = delegate.getClass().getDeclaredMethod("setCurrentView", int.class);
setCurrentViewMethod.setAccessible(true);
setCurrentViewMethod.invoke(delegate, 1);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
}
Activity 中的代码(成员变量和 onCreate
中的内容)启动它(并在旋转时保留它)看起来像这样:
// Class member variables
private Calendar myCalendar = Calendar.getInstance();
private boolean birthday_is_set = false;
// this next part is in onCreate
// set the calendar date to a saved date if applicable
// and change birthday_is_set if they had saved a birthday
final DatePickerDialog.OnDateSetListener birthdayListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
// I save the date in a calendar, replace this
// with whatever you want to do with the selected date
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
birthday_is_set = true;
updateBirthdayLabel();
}
};
if (savedInstanceState != null) {
DatePickerDialogFragment dpf;
dpf = (DatePickerDialogFragment) getFragmentManager().findFragmentByTag("birthdayDatePicker");
if (dpf != null) {
// on rotation the listener will be referring to the old Activity,
// so we have to reset it here to act on the current Activity
dpf.setListener(birthdayListener);
}
}
birthdayDatePicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Your logic may vary here. I chose not to start it in year
// mode if they've already selected a date.
boolean startInYears = !birthday_is_set;
DatePickerDialogFragment dpf = DatePickerDialogFragment.newInstance(startInYears, myCalendar);
dpf.setListener(birthdayListener);
dpf.show(getFragmentManager(), "birthdayDatePicker");
}
});
这包括让它以年模式启动的黑客攻击,以及对特定年份三星设备上一些随机日期选择器故障的修复。这个版本几个月来一直在运行,没有崩溃,也没有用户对 API 15+ 的投诉。
编辑:更新 openYearView 以在 Android 10 上运行
关于java - 如何在 Android 7.0 的微调器模式下修复 DatePickerDialog?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51448575/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!