我有一个在LTR设备(android 7.1.1)上显示很好的日期字段
问题是,在RTL设备上,日期字段内容已镜像
因此,在美国设备上,日期将正常显示: 2019年3月14日
在RTL android设备上,日期将如下所示: 2019/14/03
包含值的TextView的代码:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/inspect_date"
android:textSize="18sp" />
<com.xerox.printerinspection.controls.DateEditText
android:id="@+id/edit_inspect_date"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/lightGray"
android:paddingStart="4dp"
android:paddingEnd="4dp"
android:drawableEnd="@android:drawable/ic_menu_my_calendar" />
</LinearLayout>
我正在这样设置日期:
Date currentDate = Calendar.getInstance().getTime();
inspectionDateEdit.setDate(currentDate);
解决此问题的正确方法是什么?
更新
父Fragment_detail.xml标记如下:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/lightGray"
android:textDirection="locale"
tools:context="com.xerox.MainActivity">
答案 0 :(得分:4)
由于父级的android:textDirection="locale"
属性(在android:supportsRtl="true"
中设置Manifest.xml
时甚至可能是默认值-因此可以省略),因此必须定义嵌套子节点的文本方向-因此它不会继承父节点的值;在EditText
设备上强制RTL
布局时,这至少对LTR
有效:
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/edit_inspect_date"
android:text="@string/edit_inspect_date"
android:textDirection="ltr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
可能android:drawableEnd
应该是android:drawableRight
,以使其不受影响(这取决于是否打算将其翻转到另一侧)。 / p>
答案 1 :(得分:2)
首先,确定布局方向是否为从右到左。
boolean isRightToLeft = TextUtilsCompat.getLayoutDirectionFromLocale(Locale
.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL;
如果是,那么就自己反转日期格式,
SimpleDateFormat format;
Date currentDate = Calendar.getInstance().getTime();
if(isRightToLeft){ //yup, use the mirrored date format
format = new SimpleDateFormat("yyyy/dd/MM");
}
else{ //use the regular date format
format = new SimpleDateFormat("MM/dd/yyyy");
}
currentDate.setTime(simpleDateFormat.parse(simpleDateFormat.format(currentDate)));
inspectionDateEdit.setDate(currentDate);
在运行时,操作系统随后会将您的yyyy/dd/MM
镜像到MM/dd/yyyy
答案 2 :(得分:0)
您可以尝试将xml文件中DateEditText的布局方向定义为ltr
。
答案 3 :(得分:0)
您只需将Date格式化为所需的格式,不必担心。
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String dateFormat = format.format(YourDate);
答案 4 :(得分:0)
只需尝试以下带有两种本地化的代码。我已经尝试过两种本地化,并且都可以正常工作。
SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
Date currentDate = Calendar.getInstance().getTime();
String currnetDateString = df.format(currentDate);
yourTextView.setText(currnetDateString);
更新:
您曾说过,如果您将InspectionDateEdit用作DatePicker,则可以像这样使用它:
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
Date currentDate = Calendar.getInstance().getTime();
String currnetDateString = sdf.format(currentDate);
try {
Date currentDate2 = sdf.parse(currnetDateString);
inspectionDateEdit.setDate(currentDate2);
} catch (ParseException e) {
e.printStackTrace();
}
答案 5 :(得分:0)
我建议尝试将父级android:textDirection
更改为anyRTL
。
https://developer.android.com/reference/android/view/View.html#attr_android:textDirection
“ anyRtl
-如果段落方向包含任何强RTL字符,则为RTL;如果段落包含任何强LTR字符,则为LTR。如果两者都不存在,则段落方向为视图的已解析布局方向。
“
原因是,如果您直接或通过设备区域设置将文本方向设置为特定的一个LTR或RTL(如您所做的那样),则尝试在RTL页面中间添加LTR文本时可能会遇到相同的问题,反之亦然。即在整个RTL页面的中间用英语发表评论。
IMO的一种更好的方法是使用anyRTL
,它将根据内容确定正确的方向。
对于您的特定情况,拉丁数字中的日期始终为LTR。
答案 6 :(得分:0)
您可以使用此表格
SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd", Locale.US);