在RTL设备上更改日期格式?

时间:2019-03-23 01:40:03

标签: android right-to-left

我有一个在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">

7 个答案:

答案 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"/>

screenshot

可能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更改为anyRTLhttps://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);