2015-04-27 3 views
2

Я разрабатываю приложение для Android, которое должно поддерживать арабский язык. (Который должен читаться справа налево). После того, как быстро гугл решения, я выясняю Android полностью поддерживает арабский язык изначально уровня 17 API с объявлениемAndroid RTL layout direction align center issue

андроидом: supportsRtl = «истинным»

в теге приложения внутри от AndroidManifest так что я могу использовать зеркалирование макета, чтобы автоматически перевернуть макет для лучшего права на чтение слева. Тем не менее, я заметил, что проблема возникает, когда я использую centerInParent в представлении, что внутри sub RelativeLayout во время зеркального отображения макета. Ниже приведены мои коды и ожидаемый макет.

<RelativeLayout 
    android:background="@color/white" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:padding="20dp"> 

    <RelativeLayout 
     android:background="@drawable/shape_flag_imageview_boarder" 
     android:id="@+id/imageLayout" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content"> 

     <ImageView 
      android:id="@+id/image" 
      android:layout_height="100dp" 
      android:layout_width="100dp" 
      android:visibility="invisible" /> 

     <ProgressBar 
      android:id="@+id/progressbar" 
      android:layout_centerInParent="true" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" /> 

    </RelativeLayout> 

    <TextView 
     android:id="@+id/text" 
     android:layout_height="wrap_content" 
     android:layout_marginStart="10dp" 
     android:layout_marginTop="10dp" 
     android:layout_toEndOf="@id/imageLayout" 
     android:layout_width="wrap_content" 
     android:text="Some text here bla bla bla" 
     android:textColor="@color/black" /> 

</RelativeLayout> 

Normal Left to Right Layout

Изображение выше показывает ожидаемый результат в нормальном направлении компоновки, который слева направо. Целью я обернуть ImageView и ProgressBar вместе в подвале, потому что я хочу, чтобы ProgressBar показывался в середине ImageView, когда изображение загружается из Интернета. После того, как я изменил Locale на арабский, он становится таким, как Layout out in RTL
Как я пытался и ошибка, и выясните, что это вызывает центрInParent ProgressBar. Вместо того, чтобы центрировать внутреннее представление, он выравнивает центр с корневым представлением корня, который является самым внешним RelativeLayout. Ниже показан снимок экрана удаления кода CenterInParent из ProgressBar.

enter image description here

Это ясно показывает расположение зеркалирование работает хорошо, но позиция ProgressBar не то, что я ожидал. Поэтому я стараюсь работать на centerVertical и centerHorizontal, результат показан на изображениях ниже соответственно. enter image description here enter image description here

Ни одно из решений не работает, и никто из этой темы я не искал, связанные с этим вопросом. Так что, наверное, это может быть ошибка из библиотеки Android? Если кто-нибудь знает проблемы или решения, пожалуйста, поделитесь со мной. Спасибо

+0

По крайней мере, часть вашей проблемы заключается в том, что вы не указываете, где все должно идти полностью - ничто во внешнем относительном макете не выровнено ни с чем в родительском. Поэтому я не удивлен, что он не выясняет, как правильно это сделать. –

+0

родительский RelativeLayout, внутри которого вы позиционируете progressbar, не имеет фиксированной высоты и ширины. так что это может привести к нежелательным результатам. – TheLittleNaruto

+0

@GabeSechan. В шортах, слева показан макет, показанный выше, и я ожидаю, что он будет выглядеть точно так же, но перевернулся вправо налево в арабском языке. Я не использовал выравнивание влево или вправо, но вместо этого использовал Start и End, поэтому я ожидаю, что он будет работать нормально, но это не так. –

ответ

4

Я установил его, добавив android:layoutDirection="ltr" в ребенка RelativeLayout. В принципе, он дезактивирует форматирование RTL для данного RelativeLayout, а android:layout_centerInParent="true" ведет себя правильно. Он решает нашу конкретную проблему, поскольку наш особый RelativeLayout содержит только центрированные элементы. Но этот трюк не должен использоваться, если в макете содержатся другие элементы, которые должны правильно поддерживать RTL, например, текстовые представления. Надеюсь, поможет.

2

Это ошибка макета RTL в каркасе Android, который влияет только на Android 4.2 (API 17) и когда android: supportsRtl = "true" включен в AndroidManifest.xml.

Это происходит, когда вы используете RelativeLayout, который содержит элементы, расположенные с android:layout_centerVertical="true" или android:layout_centerInParent="true".

Вы можете это исправить в Java коде, как это:

View relativeLayout = layoutInflater.inflate(R.layout.my_relative_layout, parent, false); 

// Fix RTL layout bug on Android 4.2 (for Arabic and Hebrew mode) 
if (Build.VERSION.SDK_INT == 17 && 
     getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { 
    // Force a left-to-right layout 
    relativeLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); 
} 
0

позвольте мне сказать вам правильный ответ, смотрите свой RelativeLayout (ID: imageLayout), это ширина wrap_content, и ваш ProgressBar (ID: ProgressBar) добавьте атрибут android: layout_centerInParent = "true". Это означает, что родительский не ограничен witdh, а child также хочет центрировать, поэтому родитель будет растянут.