J'ai un champ de date qui est très bien présenté sur les appareils LTR (Android 7.1.1)
Le problème est que sur les appareils RTL, le contenu du champ de date est reflété
Ainsi, sur les appareils américains, la date apparaîtra normalement: 14/03/2019
Sur les appareils Android RTL, la date apparaîtra comme suit: 2019/14/03
Code pour le TextView contenant la valeur:
<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">
Je règle la date comme ceci:
Date currentDate = Calendar.getInstance().getTime(); inspectionDateEdit.setDate(currentDate);
Quelle sera la bonne façon de résoudre ce problème?
MISE À JOUR strong>
La balise parent fragment_detail.xml ressemble à ceci:
<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>
7 Réponses :
Vous pouvez essayer de définir la direction de la mise en page comme ltr
pour le DateEditText dans le fichier xml.
J'ai android: textDirection = "locale", donc la direction de la mise en page est définie par la locale.
Je dis que vous devriez remplacer la direction de cette DateEditText particulière par ltr, de sorte qu'elle soit toujours ltr, quelle que soit la locale.
Vous avez dit que vous avez android: textDirection = "locale"
mais cela n'est pas affiché dans votre question. Est-ce pour la mise en page parent?
Vous pouvez simplement mettre en forme la date sous la forme que vous voulez et ne vous inquiétez pas, comme ceci:
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); String dateFormat = format.format(YourDate);
Essayez simplement le code ci-dessous avec les deux localisations. J'ai essayé avec la localisation et cela fonctionne très bien.
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(); }
Mise à jour:
Comme vous l'avez dit, si vous utilisez inspectionDateEdit comme DatePicker, vous pouvez l'utiliser comme:
SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy", Locale.US); Date currentDate = Calendar.getInstance().getTime(); String currnetDateString = df.format(currentDate); yourTextView.setText(currnetDateString);
inspectionDateEdit est un sélecteur de date
Rumit, pourquoi Locale.US et non Device Locale?
@ user648026 Parce que c'est ce qui cause le problème. Locale.US
conservera la date en anglais et formatée. Si nous avons les paramètres régionaux de l'appareil c'est-à-dire Locale.getDefault ()
, cela prendra automatiquement les paramètres régionaux par défaut. et le transforme en 2019/14/03 .
le formatage à l'aide de SimpleDateFormat fonctionne bien .. mais l'affichage n'est pas correct .... il reflète la date ....
L'avez-vous vérifié avec TextView
également? essayez mon code supérieur à TextView
et vérifiez.
En raison de l'attribut android: textDirection = "locale"
du parent (qui peut même être la valeur par défaut, lorsque vous avez défini android: supportsRtl = "true"
dans le Manifest.xml
- et pourrait donc être omis), il faut définir la direction du texte pour le nœud enfant imbriqué - afin qu'il n'hérite pas de la valeur du parent; cela fonctionne au moins pour un EditText
, lors du forçage de la mise en page RTL
sur un appareil 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"/>
Peut-être que android: drawableEnd
devrait être android: drawableRight
, afin qu'il ne soit pas affecté (cela dépend de , s'il est prévu de le retourner de l'autre côté, que ce soit ou non).
Bien que la source du problème soit correcte, je suggérerais une valeur différente pour textDirection ... "anyRtl" par exemple.
@Raanan anyRtl est exactement ce qui n'est pas prévu (du moins comment j'ai compris le problème). Malheureusement, je n'ai pas trouvé de documentation pour le composant com.xerox.printerinspection.controls.DateEditText
... car la définition d'une chaîne de format de date inversée pourrait également être une option.
Je ne suis pas d'accord, j'ai posté mon raisonnement dans Answer.
@Raanan comment devrait-il être mieux que de forcer LTR
? il n'y aura pas de caractères RTL
... ou les langues RTL
ont-elles des formats de date différents (opposés à ceux attendus dans l'OP)? Nous verrons quel est le résultat préféré ... même si, certes, ma compréhension est limitée aux chiffres arabes.
Oui, certaines langues RTL ont des formats de date qui n'utilisent pas de lettres latines comme le farsi et ne sont pas LTR. en.wikipedia.org/wiki/Date_and_time_notation_in_Iran
@Raanan pour une solution appropriée, de tels cas spéciaux doivent être pris en compte ... alors que l'on peut encore fournir des chaînes de format avec des ressources de chaîne.
OMI, l'utilisation de paramètres de direction sensibles au contenu comme je l'ai suggéré devrait gérer la plupart des cas particuliers. Et aussi quelques cas simples comme mélanger du texte RTL et LTR dans la même page.
@Raanan cela pourrait simplement dépendre, qui formate ce support com.xerox.printerinspection.controls.DateEditText
... il semble être une bibliothèque propriétaire, qui ne semble pas être disponible publiquement.
Je suis d'accord. Ma suggestion est une solution de niveau supérieur aux problèmes de direction du texte de mise en page RTL
. Je ne l'ai pas non plus testé pour ce cas spécifique, qui pourrait nécessiter votre solution.
Je suggère d'essayer de changer le parent android: textDirection
vers anyRTL
:
"
anyRtl
- La direction du paragraphe est RTL si elle contient un caractère RTL fort, sinon c'est LTR si elle contient des caractères LTR forts. S'il n'y en a aucun, la direction du paragraphe est la direction de disposition résolue de la vue. "
La raison est que si vous définissez la direction du texte sur une LTR ou un RTL spécifique directement ou par les paramètres régionaux de l'appareil (comme vous l'avez fait), vous risquez de rencontrer le même problème lorsque vous essayez d'ajouter un texte LTR au milieu d'une page RTL ou vice versa . c'est-à-dire un commentaire en anglais au milieu d'une page RTL complète.
Une meilleure approche IMO est d'utiliser anyRTL
qui décidera par le contenu quelle est la bonne direction.
Pour votre cas particulier, une date en chiffres latins est toujours LTR.
Vous pouvez utiliser ce formulaire
SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
Premièrement, identifiez si le sens de la mise en page est de droite à gauche ou non.
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);
si c'est le cas, puis inversez simplement le format de date vous-même,
boolean isRightToLeft = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL;
Vous voulez donc le même 14/03/2019 pour la localisation. correct?
oui, idem 14/03/2019 à la fois pour la localisation ou au moins pour pouvoir contrôler le format.
pourriez-vous s'il vous plaît poster le code pour
inspectionDateEdit.setDate (currentDate) ;.