Skip to content

Commit 6aeb23a

Browse files
committed
适配RTL
1 parent ca023ea commit 6aeb23a

7 files changed

Lines changed: 66 additions & 5 deletions

File tree

app/src/main/java/com/hjq/language/demo/MainActivity.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.annotation.TargetApi;
44
import android.content.Context;
55
import android.content.Intent;
6+
import android.graphics.Bitmap;
67
import android.net.Uri;
78
import android.os.Build;
89
import android.os.Bundle;
@@ -54,7 +55,7 @@ protected void onCreate(Bundle savedInstanceState) {
5455
getApplication().getResources().getString(R.string.current_language));
5556
mSystemLanguageView = findViewById(R.id.tv_main_language_system);
5657
mSystemLanguageView.setText(MultiLanguages.getLanguageString(this,
57-
MultiLanguages.getSystemLanguage(this), R.string.current_language));
58+
MultiLanguages.getSystemLanguage(this), R.string.current_language));
5859

5960
if (MultiLanguages.isSystemLanguage(this)) {
6061
radioGroup.check(R.id.rb_main_language_auto);
@@ -66,6 +67,8 @@ protected void onCreate(Bundle savedInstanceState) {
6667
radioGroup.check(R.id.rb_main_language_tw);
6768
} else if (LocaleContract.getEnglishLocale().equals(locale)) {
6869
radioGroup.check(R.id.rb_main_language_en);
70+
} else if (LocaleContract.getArabicLocale().equals(locale)) {
71+
radioGroup.check(R.id.rb_main_language_ar);
6972
} else {
7073
radioGroup.check(R.id.rb_main_language_auto);
7174
}
@@ -94,6 +97,9 @@ public void onCheckedChanged(RadioGroup group, int checkedId) {
9497
} else if (checkedId == R.id.rb_main_language_en) {
9598
// 英语
9699
restart = MultiLanguages.setAppLanguage(this, LocaleContract.getEnglishLocale());
100+
} else if (checkedId == R.id.rb_main_language_ar) {
101+
// 阿拉伯语
102+
restart = MultiLanguages.setAppLanguage(this, LocaleContract.getArabicLocale());
97103
}
98104

99105
if (restart) {
@@ -130,7 +136,7 @@ public void onResume() {
130136
return;
131137
}
132138
mSystemLanguageView.setText(MultiLanguages.getLanguageString(this,
133-
MultiLanguages.getSystemLanguage(this), R.string.current_language));
139+
MultiLanguages.getSystemLanguage(this), R.string.current_language));
134140
}
135141

136142
@Override
@@ -189,6 +195,15 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) {
189195
}
190196
return true;
191197
}
198+
@Override
199+
public void onPageStarted(WebView view, String url, Bitmap favicon) {
200+
super.onPageStarted(view, url, favicon);
201+
202+
if (LocaleContract.shouldRTL(MultiLanguages.getAppLanguage(view.getContext()))) {
203+
// 水平滚动条滚动到最右边
204+
view.scrollTo(view.getWidth(), 0);
205+
}
206+
}
192207
}
193208

194209
/**

app/src/main/res/layout/activity_main.xml

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,33 @@
4848
android:layout_width="wrap_content"
4949
android:layout_height="wrap_content"
5050
android:layout_marginLeft="15dp"
51+
android:layout_marginStart="15dp"
5152
android:text="简体" />
5253

5354
<RadioButton
5455
android:id="@+id/rb_main_language_tw"
5556
android:layout_width="wrap_content"
5657
android:layout_height="wrap_content"
5758
android:layout_marginLeft="15dp"
59+
android:layout_marginStart="15dp"
5860
android:text="繁體" />
5961

6062
<RadioButton
6163
android:id="@+id/rb_main_language_en"
6264
android:layout_width="wrap_content"
6365
android:layout_height="wrap_content"
6466
android:layout_marginLeft="15dp"
67+
android:layout_marginStart="15dp"
6568
android:text="English" />
6669

70+
<RadioButton
71+
android:id="@+id/rb_main_language_ar"
72+
android:layout_width="wrap_content"
73+
android:layout_height="wrap_content"
74+
android:layout_marginLeft="15dp"
75+
android:layout_marginStart="15dp"
76+
android:text="عربي" />
77+
6778
</RadioGroup>
6879

6980
<LinearLayout
@@ -82,6 +93,7 @@
8293
android:layout_width="wrap_content"
8394
android:layout_height="wrap_content"
8495
android:layout_marginLeft="20dp"
96+
android:layout_marginStart="20dp"
8597
android:text="@string/current_language" />
8698
</LinearLayout>
8799

@@ -100,7 +112,8 @@
100112
android:id="@+id/tv_main_language_application"
101113
android:layout_width="wrap_content"
102114
android:layout_height="wrap_content"
103-
android:layout_marginLeft="20dp" />
115+
android:layout_marginLeft="20dp"
116+
android:layout_marginStart="20dp" />
104117
</LinearLayout>
105118

106119
<LinearLayout
@@ -119,7 +132,8 @@
119132
android:id="@+id/tv_main_language_system"
120133
android:layout_width="wrap_content"
121134
android:layout_height="wrap_content"
122-
android:layout_marginLeft="20dp" />
135+
android:layout_marginLeft="20dp"
136+
android:layout_marginStart="20dp" />
123137
</LinearLayout>
124138

125139
</LinearLayout>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string name="app_name">تدويل</string>
4+
<string name="current_language">اتبع النظام</string>
5+
6+
<string name="current_activity_language">النشاط الحالي اللغة:</string>
7+
<string name="current_application_language">لغة التطبيق الحالية:</string>
8+
<string name="current_system_language">لغة النظام الحالية:</string>
9+
</resources>
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<manifest package="com.hjq.language" />
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
package="com.hjq.language">
4+
<application android:supportsRtl="true" />
5+
</manifest>

library/src/main/java/com/hjq/language/ActivityLanguages.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
import android.app.Activity;
44
import android.app.Application;
5+
import android.os.Build;
56
import android.os.Bundle;
7+
import android.view.View;
8+
9+
import java.util.Locale;
610

711
/**
812
* author : Android 轮子哥
@@ -30,6 +34,13 @@ public void onActivityPreCreated(Activity activity, Bundle savedInstanceState) {
3034
@Override
3135
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
3236
refreshActivityAndApplicationLanguage(activity);
37+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
38+
Locale locale = MultiLanguages.getAppLanguage(activity);
39+
if (LocaleContract.shouldRTL(locale)) {
40+
View rootView = activity.findViewById(android.R.id.content);
41+
rootView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
42+
}
43+
}
3344
}
3445

3546
@Override

library/src/main/java/com/hjq/language/LanguagesUtils.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ static void setLocale(Configuration config, Locale locale) {
3939
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
4040
LocaleList localeList = new LocaleList(locale);
4141
config.setLocales(localeList);
42+
// 在一台Android13的联想平板上,setLocales和setLocale均无效,修改config.locale生效,所以这里判断一下是否设置成功
43+
if (config.getLocales().get(0) != locale) {
44+
config.locale = locale;
45+
}
4246
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
4347
config.setLocale(locale);
4448
} else {

library/src/main/java/com/hjq/language/LocaleContract.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,4 +704,9 @@ public static Locale getUzbekLocale() {
704704
}
705705
return sUzbekLocale;
706706
}
707+
708+
public static boolean shouldRTL(Locale locale) {
709+
return LocaleContract.getArabicLocale().equals(locale)
710+
|| LocaleContract.getHebrewLocale().equals(locale);
711+
}
707712
}

0 commit comments

Comments
 (0)