Skip to content

Commit ce376c2

Browse files
authored
feat: implement rtl support for android picker (#243)
1 parent d84059c commit ce376c2

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

android/src/main/java/com/reactnativecommunity/picker/ReactPicker.java

+21
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@
1010
import android.content.Context;
1111
import android.content.ContextWrapper;
1212
import android.content.res.Resources;
13+
import android.os.Build;
1314
import android.util.AttributeSet;
1415
import android.util.TypedValue;
1516
import android.view.View;
1617
import android.widget.AdapterView;
1718
import android.widget.Spinner;
19+
1820
import androidx.appcompat.widget.AppCompatSpinner;
1921
import com.facebook.react.bridge.ReactContext;
2022
import com.facebook.react.common.annotations.VisibleForTesting;
23+
import com.facebook.react.modules.i18nmanager.I18nUtil;
2124
import com.facebook.react.uimanager.UIManagerModule;
2225

2326
import javax.annotation.Nullable;
@@ -55,24 +58,42 @@ public interface OnSelectListener {
5558

5659
public ReactPicker(Context context) {
5760
super(context);
61+
handleRTL(context);
5862
}
5963

6064
public ReactPicker(Context context, int mode) {
6165
super(context, mode);
6266
mMode = mode;
67+
handleRTL(context);
6368
}
6469

6570
public ReactPicker(Context context, AttributeSet attrs) {
6671
super(context, attrs);
72+
handleRTL(context);
6773
}
6874

6975
public ReactPicker(Context context, AttributeSet attrs, int defStyle) {
7076
super(context, attrs, defStyle);
77+
handleRTL(context);
7178
}
7279

7380
public ReactPicker(Context context, AttributeSet attrs, int defStyle, int mode) {
7481
super(context, attrs, defStyle, mode);
7582
mMode = mode;
83+
handleRTL(context);
84+
}
85+
86+
private void handleRTL(Context context) {
87+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
88+
boolean isRTL = I18nUtil.getInstance().isRTL(context);
89+
if (isRTL) {
90+
this.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
91+
this.setTextDirection(View.TEXT_DIRECTION_RTL);
92+
} else {
93+
this.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
94+
this.setTextDirection(View.TEXT_DIRECTION_LTR);
95+
}
96+
}
7697
}
7798

7899
private final Runnable measureAndLayout = new Runnable() {

android/src/main/java/com/reactnativecommunity/picker/ReactPickerManager.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,21 @@
88
package com.reactnativecommunity.picker;
99

1010
import android.content.Context;
11-
import android.graphics.Color;
1211
import android.graphics.PorterDuff;
1312
import android.graphics.Typeface;
13+
import android.os.Build;
1414
import android.view.LayoutInflater;
1515
import android.view.View;
1616
import android.view.ViewGroup;
1717
import android.widget.BaseAdapter;
1818
import android.widget.Spinner;
1919
import android.widget.TextView;
20+
2021
import com.facebook.infer.annotation.Assertions;
2122
import com.facebook.react.bridge.Arguments;
2223
import com.facebook.react.bridge.ReadableArray;
2324
import com.facebook.react.bridge.ReadableMap;
25+
import com.facebook.react.modules.i18nmanager.I18nUtil;
2426
import com.facebook.react.uimanager.*;
2527
import com.facebook.react.uimanager.annotations.ReactProp;
2628
import com.facebook.react.uimanager.events.EventDispatcher;
@@ -227,6 +229,17 @@ private View getView(int position, View convertView, ViewGroup parent, boolean i
227229
textView.setTypeface(face);
228230
}
229231

232+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
233+
boolean isRTL = I18nUtil.getInstance().isRTL(convertView.getContext());
234+
if (isRTL) {
235+
convertView.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
236+
convertView.setTextDirection(View.TEXT_DIRECTION_RTL);
237+
} else {
238+
convertView.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
239+
convertView.setTextDirection(View.TEXT_DIRECTION_LTR);
240+
}
241+
}
242+
230243
return convertView;
231244
}
232245

example/android/app/src/main/AndroidManifest.xml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
android:icon="@mipmap/ic_launcher"
1010
android:roundIcon="@mipmap/ic_launcher_round"
1111
android:allowBackup="false"
12+
android:supportsRtl="true"
1213
android:theme="@style/AppTheme">
1314
<activity
1415
android:name=".MainActivity"

example/src/App.tsx

+22
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,31 @@ import {
66
Text,
77
View,
88
SafeAreaView,
9+
I18nManager,
10+
Switch,
911
} from 'react-native';
1012

1113
import * as PickerExamples from './PickerExample';
1214
import * as PickerIOSExamples from './PickerIOSExample';
1315

1416
export default function App() {
17+
const [isRTL, setIsRTL] = React.useState(I18nManager.isRTL);
18+
React.useEffect(() => {
19+
I18nManager.allowRTL(true);
20+
}, []);
1521
return (
1622
<SafeAreaView style={styles.main}>
1723
<ScrollView>
24+
<View style={styles.rtlSwitchContainer}>
25+
<Switch
26+
value={isRTL}
27+
onValueChange={(newValue) => {
28+
setIsRTL(newValue);
29+
I18nManager.forceRTL(newValue);
30+
}}
31+
/>
32+
<Text>{I18nManager.isRTL ? 'RTL' : 'LTR'}</Text>
33+
</View>
1834
<View style={styles.container}>
1935
<Text style={styles.heading}>Picker Examples</Text>
2036
{PickerExamples.examples.map((element) => (
@@ -57,4 +73,10 @@ const styles = StyleSheet.create({
5773
fontSize: 22,
5874
color: 'black',
5975
},
76+
rtlSwitchContainer: {
77+
flexDirection: 'row',
78+
justifyContent: 'space-between',
79+
paddingHorizontal: 40,
80+
paddingTop: 20,
81+
},
6082
});

0 commit comments

Comments
 (0)