From 6aeb23aea1a80c42b9b324ffe8f27bb357274c50 Mon Sep 17 00:00:00 2001 From: chengjiansu Date: Thu, 13 Nov 2025 21:05:08 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E9=80=82=E9=85=8DRTL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hjq/language/demo/MainActivity.java | 19 +++++++++++++++++-- app/src/main/res/layout/activity_main.xml | 18 ++++++++++++++++-- app/src/main/res/values-ar/strings.xml | 9 +++++++++ library/src/main/AndroidManifest.xml | 5 ++++- .../com/hjq/language/ActivityLanguages.java | 11 +++++++++++ .../java/com/hjq/language/LanguagesUtils.java | 4 ++++ .../java/com/hjq/language/LocaleContract.java | 5 +++++ 7 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/values-ar/strings.xml diff --git a/app/src/main/java/com/hjq/language/demo/MainActivity.java b/app/src/main/java/com/hjq/language/demo/MainActivity.java index dc79a9f..4816183 100644 --- a/app/src/main/java/com/hjq/language/demo/MainActivity.java +++ b/app/src/main/java/com/hjq/language/demo/MainActivity.java @@ -3,6 +3,7 @@ import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; +import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -54,7 +55,7 @@ protected void onCreate(Bundle savedInstanceState) { getApplication().getResources().getString(R.string.current_language)); mSystemLanguageView = findViewById(R.id.tv_main_language_system); mSystemLanguageView.setText(MultiLanguages.getLanguageString(this, - MultiLanguages.getSystemLanguage(this), R.string.current_language)); + MultiLanguages.getSystemLanguage(this), R.string.current_language)); if (MultiLanguages.isSystemLanguage(this)) { radioGroup.check(R.id.rb_main_language_auto); @@ -66,6 +67,8 @@ protected void onCreate(Bundle savedInstanceState) { radioGroup.check(R.id.rb_main_language_tw); } else if (LocaleContract.getEnglishLocale().equals(locale)) { radioGroup.check(R.id.rb_main_language_en); + } else if (LocaleContract.getArabicLocale().equals(locale)) { + radioGroup.check(R.id.rb_main_language_ar); } else { radioGroup.check(R.id.rb_main_language_auto); } @@ -94,6 +97,9 @@ public void onCheckedChanged(RadioGroup group, int checkedId) { } else if (checkedId == R.id.rb_main_language_en) { // 英语 restart = MultiLanguages.setAppLanguage(this, LocaleContract.getEnglishLocale()); + } else if (checkedId == R.id.rb_main_language_ar) { + // 阿拉伯语 + restart = MultiLanguages.setAppLanguage(this, LocaleContract.getArabicLocale()); } if (restart) { @@ -130,7 +136,7 @@ public void onResume() { return; } mSystemLanguageView.setText(MultiLanguages.getLanguageString(this, - MultiLanguages.getSystemLanguage(this), R.string.current_language)); + MultiLanguages.getSystemLanguage(this), R.string.current_language)); } @Override @@ -189,6 +195,15 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { } return true; } + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + super.onPageStarted(view, url, favicon); + + if (LocaleContract.shouldRTL(MultiLanguages.getAppLanguage(view.getContext()))) { + // 水平滚动条滚动到最右边 + view.scrollTo(view.getWidth(), 0); + } + } } /** diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 97c9296..d65cd7b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -48,6 +48,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dp" + android:layout_marginStart="15dp" android:text="简体" /> + + @@ -100,7 +112,8 @@ android:id="@+id/tv_main_language_application" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="20dp" /> + android:layout_marginLeft="20dp" + android:layout_marginStart="20dp" /> + android:layout_marginLeft="20dp" + android:layout_marginStart="20dp" /> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..c023c10 --- /dev/null +++ b/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,9 @@ + + + تدويل + اتبع النظام + + النشاط الحالي اللغة: + لغة التطبيق الحالية: + لغة النظام الحالية: + \ No newline at end of file diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 33915b1..8a9c2a3 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,2 +1,5 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/library/src/main/java/com/hjq/language/ActivityLanguages.java b/library/src/main/java/com/hjq/language/ActivityLanguages.java index b88ffcd..f021db1 100644 --- a/library/src/main/java/com/hjq/language/ActivityLanguages.java +++ b/library/src/main/java/com/hjq/language/ActivityLanguages.java @@ -2,7 +2,11 @@ import android.app.Activity; import android.app.Application; +import android.os.Build; import android.os.Bundle; +import android.view.View; + +import java.util.Locale; /** * author : Android 轮子哥 @@ -30,6 +34,13 @@ public void onActivityPreCreated(Activity activity, Bundle savedInstanceState) { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { refreshActivityAndApplicationLanguage(activity); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Locale locale = MultiLanguages.getAppLanguage(activity); + if (LocaleContract.shouldRTL(locale)) { + View rootView = activity.findViewById(android.R.id.content); + rootView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); + } + } } @Override diff --git a/library/src/main/java/com/hjq/language/LanguagesUtils.java b/library/src/main/java/com/hjq/language/LanguagesUtils.java index 2226242..9f9fafc 100644 --- a/library/src/main/java/com/hjq/language/LanguagesUtils.java +++ b/library/src/main/java/com/hjq/language/LanguagesUtils.java @@ -39,6 +39,10 @@ static void setLocale(Configuration config, Locale locale) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { LocaleList localeList = new LocaleList(locale); config.setLocales(localeList); + // 在一台Android13的联想平板上,setLocales和setLocale均无效,修改config.locale生效,所以这里判断一下是否设置成功 + if (config.getLocales().get(0) != locale) { + config.locale = locale; + } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { config.setLocale(locale); } else { diff --git a/library/src/main/java/com/hjq/language/LocaleContract.java b/library/src/main/java/com/hjq/language/LocaleContract.java index fbb8e88..641e156 100644 --- a/library/src/main/java/com/hjq/language/LocaleContract.java +++ b/library/src/main/java/com/hjq/language/LocaleContract.java @@ -704,4 +704,9 @@ public static Locale getUzbekLocale() { } return sUzbekLocale; } + + public static boolean shouldRTL(Locale locale) { + return LocaleContract.getArabicLocale().equals(locale) + || LocaleContract.getHebrewLocale().equals(locale); + } } \ No newline at end of file From 42f657ec45eceb6642acc61d32511969701d52e3 Mon Sep 17 00:00:00 2001 From: chengjiansu Date: Fri, 14 Nov 2025 15:30:17 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8Configu?= =?UTF-8?q?ration.setLayoutDirection=EF=BC=8C=E8=80=8C=E4=B8=8D=E6=98=AF?= =?UTF-8?q?=E6=AF=8F=E4=B8=AAActivity=E5=88=9B=E5=BB=BA=E6=97=B6=E9=80=9A?= =?UTF-8?q?=E8=BF=87View.setLayoutDirection=E8=AE=BE=E7=BD=AE=E5=B8=83?= =?UTF-8?q?=E5=B1=80=E6=96=B9=E5=90=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/hjq/language/demo/MainActivity.java | 11 ++++++++--- .../main/java/com/hjq/language/ActivityLanguages.java | 11 ----------- .../main/java/com/hjq/language/LanguagesUtils.java | 2 ++ .../main/java/com/hjq/language/LocaleContract.java | 5 ----- .../main/java/com/hjq/language/MultiLanguages.java | 7 ++++++- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/hjq/language/demo/MainActivity.java b/app/src/main/java/com/hjq/language/demo/MainActivity.java index 4816183..6b5231a 100644 --- a/app/src/main/java/com/hjq/language/demo/MainActivity.java +++ b/app/src/main/java/com/hjq/language/demo/MainActivity.java @@ -7,6 +7,8 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebView; @@ -199,9 +201,12 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); - if (LocaleContract.shouldRTL(MultiLanguages.getAppLanguage(view.getContext()))) { - // 水平滚动条滚动到最右边 - view.scrollTo(view.getWidth(), 0); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Locale locale = MultiLanguages.getAppLanguage(view.getContext()); + if (View.LAYOUT_DIRECTION_RTL == TextUtils.getLayoutDirectionFromLocale(locale)) { + // 水平滚动条滚动到最右边 + view.scrollTo(view.getWidth(), 0); + } } } } diff --git a/library/src/main/java/com/hjq/language/ActivityLanguages.java b/library/src/main/java/com/hjq/language/ActivityLanguages.java index f021db1..b88ffcd 100644 --- a/library/src/main/java/com/hjq/language/ActivityLanguages.java +++ b/library/src/main/java/com/hjq/language/ActivityLanguages.java @@ -2,11 +2,7 @@ import android.app.Activity; import android.app.Application; -import android.os.Build; import android.os.Bundle; -import android.view.View; - -import java.util.Locale; /** * author : Android 轮子哥 @@ -34,13 +30,6 @@ public void onActivityPreCreated(Activity activity, Bundle savedInstanceState) { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { refreshActivityAndApplicationLanguage(activity); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - Locale locale = MultiLanguages.getAppLanguage(activity); - if (LocaleContract.shouldRTL(locale)) { - View rootView = activity.findViewById(android.R.id.content); - rootView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); - } - } } @Override diff --git a/library/src/main/java/com/hjq/language/LanguagesUtils.java b/library/src/main/java/com/hjq/language/LanguagesUtils.java index 9f9fafc..f36f612 100644 --- a/library/src/main/java/com/hjq/language/LanguagesUtils.java +++ b/library/src/main/java/com/hjq/language/LanguagesUtils.java @@ -43,8 +43,10 @@ static void setLocale(Configuration config, Locale locale) { if (config.getLocales().get(0) != locale) { config.locale = locale; } + config.setLayoutDirection(locale); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { config.setLocale(locale); + config.setLayoutDirection(locale); } else { config.locale = locale; } diff --git a/library/src/main/java/com/hjq/language/LocaleContract.java b/library/src/main/java/com/hjq/language/LocaleContract.java index 641e156..fbb8e88 100644 --- a/library/src/main/java/com/hjq/language/LocaleContract.java +++ b/library/src/main/java/com/hjq/language/LocaleContract.java @@ -704,9 +704,4 @@ public static Locale getUzbekLocale() { } return sUzbekLocale; } - - public static boolean shouldRTL(Locale locale) { - return LocaleContract.getArabicLocale().equals(locale) - || LocaleContract.getHebrewLocale().equals(locale); - } } \ No newline at end of file diff --git a/library/src/main/java/com/hjq/language/MultiLanguages.java b/library/src/main/java/com/hjq/language/MultiLanguages.java index db3ddfc..118425b 100644 --- a/library/src/main/java/com/hjq/language/MultiLanguages.java +++ b/library/src/main/java/com/hjq/language/MultiLanguages.java @@ -2,7 +2,9 @@ import android.app.Application; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; +import android.os.Build; import android.os.Looper; import android.os.MessageQueue; import android.text.TextUtils; @@ -96,7 +98,10 @@ public static void updateAppLanguage(Context context, Resources resources) { return; } Locale locale = getAppLanguage(context); - if (!locale.equals(LanguagesUtils.getLocale(resources.getConfiguration()))) { + Configuration config = resources.getConfiguration(); + if (!locale.equals(LanguagesUtils.getLocale(config)) + || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 + && TextUtils.getLayoutDirectionFromLocale(locale) != config.getLayoutDirection())) { LanguagesUtils.updateLanguages(resources, locale); } if (!locale.equals(LanguagesUtils.getDefaultLocale())) { From 50741e4da67cc3042548477353fddad44f1cb190 Mon Sep 17 00:00:00 2001 From: chengjiansu Date: Tue, 18 Nov 2025 10:24:51 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BD=BF=E7=94=A8onPageCommitVisible?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2onPageStarted?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/hjq/language/demo/MainActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/hjq/language/demo/MainActivity.java b/app/src/main/java/com/hjq/language/demo/MainActivity.java index 6b5231a..3988f2d 100644 --- a/app/src/main/java/com/hjq/language/demo/MainActivity.java +++ b/app/src/main/java/com/hjq/language/demo/MainActivity.java @@ -198,8 +198,8 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { return true; } @Override - public void onPageStarted(WebView view, String url, Bitmap favicon) { - super.onPageStarted(view, url, favicon); + public void onPageCommitVisible(WebView view, String url) { + super.onPageCommitVisible(view, url); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Locale locale = MultiLanguages.getAppLanguage(view.getContext());