Изменение формата даты на устройствах RTL? - PullRequest
4 голосов
/ 23 марта 2019

У меня есть поле даты, которое отлично отображается на устройствах LTR (android 7.1.1)
Проблема в том, что на устройствах RTL содержимое поля даты зеркально отражается

Так что на устройствах в США дата будетотображаются нормально: 03/14/2019
На устройствах с ОС RTL дата будет выглядеть следующим образом: 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);

Каким будет правильный способ решения этой проблемы?

ОБНОВЛЕНИЕ

Родительский тег frag_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 ]

5 голосов
/ 01 апреля 2019

Из-за родительского атрибута 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, чтобы оно не было затронуто (это зависит от того, намерено ли оно перевернуть его на другую сторону, независимо от того, или нет).

2 голосов
/ 02 апреля 2019

Во-первых, определите, является ли направление макета справа налево или нет.

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);

Во время выполнения os затем отразит ваш yyyy/dd/MM до MM/dd/yyyy

1 голос
/ 02 апреля 2019

Вы можете использовать эту форму

SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
1 голос
/ 26 марта 2019

Вы можете просто отформатировать дату в форме, которую хотите, и не беспокоиться об этом, например:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
String dateFormat = format.format(YourDate);
0 голосов
/ 01 апреля 2019

Я бы предложил попробовать изменить родительский элемент android:textDirection на anyRTL:

"anyRtl - Направление абзаца RTL, если оно содержитлюбой сильный символ RTL, в противном случае это LTR, если он содержит любые сильные символы LTR. Если их нет, то направление абзаца является разрешенным направлением макета представления. "

Причина в том, что вы установилиНаправление текста на конкретный LTR или RTL напрямую или по локали устройства (как вы это сделали) вы можете столкнуться с той же проблемой при попытке добавить текст LTR в середине страницы RTL или наоборот.т.е. комментарий на английском языке в середине полной страницы RTL.Лучшим подходом IMO является использование anyRTL, которое по содержанию будет определять, в каком направлении идти.

Для вашего конкретного случая Дата в латинских цифрах всегда равна LTR.

0 голосов
/ 27 марта 2019

Просто попробуйте ниже код с обеих локализаций. Я пробовал как с локализацией, и она отлично работает.

SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
Date currentDate = Calendar.getInstance().getTime();
String currnetDateString = df.format(currentDate);
yourTextView.setText(currnetDateString);

Обновление:

Как вы сказали, если вы используете inspeDateEdit в качестве 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();
}
0 голосов
/ 26 марта 2019

Вы можете попробовать определить направление макета как ltr для DateEditText в xml-файле.

...