我有PreferencesActivity
我需要它才能正确对齐,因为我想使用阿拉伯语,我尝试将android:layout_gravity="right"
用于PreferenceScreen
,但它不起作用。
这是我的XML:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:layout_gravity="right">
<PreferenceCategory android:title="General Settings">
<CheckBoxPreference
android:title="Full Screen"
android:defaultValue="false"
android:summary="Always view as Full Screen"
android:key="fullScreenPref" />
<Preference
android:title="Report Bugs"
android:summary="Notify us for any Bugs or Errors"
android:key="bugs"/>
<Preference
android:title="About"
android:summary="Version 1.0.0"
android:key="about"/>
</PreferenceCategory>
</PreferenceScreen>
这就是我在PreferencesActivity
:
addPreferencesFromResource(R.layout.preferences);
答案 0 :(得分:12)
在花了一些时间搜索我们的共享问题后,我发现没有任何用处。 obviosly android api不支持RTL优先权。这意味着不支持波斯语/希伯来语/阿拉伯语。但毕竟我试图找到一些方法来右对齐editText。我启动了EditTextPreference类并再次实现了onCreateView方法。 这是我的代码:
/**
* Created by omid on 1/12/14.
*/
public class RtlTextPreference extends EditTextPreference {
public RtlTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected View onCreateView(ViewGroup parent) {
View view = super.onCreateView(parent);
RelativeLayout layout = (RelativeLayout) ((LinearLayout) view).getChildAt(1);
layout.setGravity(Gravity.RIGHT);
return view;
}
}
标准android api中的其他首选项应该是相同的(顺便说一下,我还没有尝试过)。 也许有一天我们应该在Android偏好中完全实现rtl支持并在github上托管它。 希望这段代码片段可以帮助你。
答案 1 :(得分:8)
不幸的是,基本偏好组件(PreferenceScreen,Preference等)以相当不可配置的方式实现。它们旨在以特定方式工作,并且不是非常可定制的。
为了做你想做的事,你可能必须实现你自己的PreferenceScreen版本(或者可能只是你正在使用的Preference类型,比如CheckBoxPreference)。它的设计方式,当它膨胀XML布局时,它假定了很多关于它们的东西并为你处理它(文本大小,填充,布局,包装等)。如果您希望它看起来像默认值,这很好,但如果您需要调整这些配置,则不是很好。
(注意:如果您不想实现首选项屏幕,您可以使用listview并将其视为首选项页面。但是,无论哪种方式,您基本上都必须实现自己的首选项版本。)
(注2:根据我见过的关于阿拉伯语文本的其他问题,它的可能 android足够聪明,可以在默认情况下尝试对齐它。但是,如果这是不过,值得一试。)
抱歉,我没有更好的答案。
答案 2 :(得分:4)
在应用程序标签下的清单文件中添加此行
机器人:supportsRtl = “真”
答案 3 :(得分:3)
在检查了几个解决方案后,我找到了一些可能有用的东西。 它不优雅,仅适用于4及以上,但它总比没有好......
将此代码添加到onResume()
Locale locale = new Locale("iw");// Hebrew in this case
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
当然,您可以选择仅在MainActivity的onResume()更改区域设置中将您的首选项活动onResume()方法中的区域设置更改回您首选(或用户定义的)区域设置。
希望这有帮助!
答案 4 :(得分:2)
好吧,这可能已经很晚了,但无论如何,如果你的目标是Android 3.0或更高版本,你应该使用PreferenceFragment来以某种方式制作RTL。
所以你应该在你的代码中创建一个像这样的片段:
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
现在您应该创建一个将此片段添加到其布局的Activity。
您可以为活动创建布局,并通过xml元素或使用FragmentManager
类将片段放入其中。但是,将权限设置为Right-To-Left的关键是在布局文件中为该片段的父元素放置layout_direction =“rtl”属性。即
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:id="@+id/rootView"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"
android:orientation="vertical">
<fragment
class="blah.blah.SettingsFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
请注意解决问题的android:layoutDirection="rtl"
元素上的RelativeLayout
。
现在像任何其他活动一样添加Activity Java代码并添加到清单文件中。
希望现在还不晚:)
答案 5 :(得分:2)
public class RtlEditTextPreference extends EditTextPreference {
@Override
protected View onCreateView(ViewGroup parent) {
View view = super.onCreateView(parent);
RelativeLayout relativeLayout = (RelativeLayout)(((LinearLayout)view).getChildAt(1));
relativeLayout.setGravity(Gravity.RIGHT);
TextView title = (TextView) relativeLayout.getChildAt(0);
TextView summary = (TextView) relativeLayout.getChildAt(1);
RelativeLayout.LayoutParams titleLayoutParams = (RelativeLayout.LayoutParams)title.getLayoutParams();
titleLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
title.setLayoutParams(titleLayoutParams);
RelativeLayout.LayoutParams summaryLayoutParams = (RelativeLayout.LayoutParams)summary.getLayoutParams();
summaryLayoutParams.addRule(RelativeLayout.ALIGN_RIGHT, title.getId());
summaryLayoutParams.addRule(RelativeLayout.ALIGN_LEFT, -1); // Override default left alignment to the title
summary.setLayoutParams(summaryLayoutParams);
return view;
}
}
答案 6 :(得分:1)
create a layout xml file called preference_checkbox.xml paste this (change the colour to what you want, only the gravity and the width set to fill parent are important) :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical" android:paddingRight="?android:attr/scrollbarSize">
<RelativeLayout android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginLeft="15dip"
android:layout_marginRight="6dip" android:layout_marginTop="6dip"
android:layout_marginBottom="6dip" android:layout_weight="1">
<TextView android:id="@+android:id/title"
android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="right"
android:singleLine="true" android:textAppearance="?android:attr/textAppearanceMedium"
android:ellipsize="marquee" android:fadingEdge="horizontal"
android:textColor=#000000 />
<TextView android:id="@+android:id/summary"
android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="right"
android:layout_below="@android:id/title" android:layout_alignLeft="@android:id/title"
android:textAppearance="?android:attr/textAppearanceSmall" android:textColor=#000000
android:maxLines="4" />
</RelativeLayout>
<!-- Preference should place its actual preference widget here. -->
<LinearLayout android:id="@+android:id/widget_frame"
android:layout_width="wrap_content" android:layout_height="match_parent"
android:gravity="center_vertical" android:orientation="vertical" />
</LinearLayout>
and then in the preferences xml file for each row in the settings list that you want to right align add this: android:layout="@layout/preference_checkbox"
thats it!
got the solution from : http://stackoverflow.com/questions/7094584/checkboxpreference-with-own-layout
the question there was about check box with image but it's the same technique.
Good Luck.
答案 7 :(得分:1)
与我的问题相同,这是解决方案:
在PreferenceFragment中:
@Override
public View onCreateView(LayoutInflater paramLayoutInflater,
ViewGroup paramViewGroup, Bundle paramBundle) {
getActivity().setTitle(R.string.fragment_title_settings);
View v = super.onCreateView(paramLayoutInflater, paramViewGroup,
paramBundle);
rtlView(v);
return v;
}
public void rtlView(View v){
if(v instanceof ListView){
rtllater((ListView) v);
}
else
if(v instanceof ViewGroup){
if(v instanceof RelativeLayout){
((RelativeLayout)v).setGravity(Gravity.RIGHT);
}
else
if(v instanceof LinearLayout){
((LinearLayout)v).setGravity(Gravity.RIGHT);
}
for (int i=0;i<((ViewGroup)v).getChildCount();i++){
rtlView(((ViewGroup)v).getChildAt(i));
}
}
else
if(v instanceof TextView){
v.getLayoutParams().width=v.getLayoutParams().MATCH_PARENT;
((TextView)v).setGravity(Gravity.RIGHT);
}
}
public void rtllater(ListView v){
v.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
@Override
public void onChildViewAdded(View view, View view1) {
rtlView(view1);
}
@Override
public void onChildViewRemoved(View view, View view1) {
}
});
}
结果如下图所示:right to left Preference
答案 8 :(得分:1)
在我看来,这可能是解决方案: 将每个视图的LayoutDirection设置为rtl;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
view.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
return view;}
答案 9 :(得分:1)
对于首选项片段,您可以使其容器具有此属性
android:layoutDirection="rtl"
答案 10 :(得分:0)
您可以通过调用setLayoutResource(int layoutResId)
使用自定义布局来实现此目的。
res / layout / preference_layout.xml:(请注意,这是基于HoloEverywhere库org.holoeverywhere.preference.Preference)
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:gravity="center_vertical"
android:minHeight="?attr/listPreferredItemHeight"
android:paddingRight="@dimen/preference_item_padding_side"
android:paddingLeft="?android:attr/scrollbarSize" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:minWidth="@dimen/preference_icon_minWidth"
android:orientation="horizontal" >
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:minWidth="48dp"
android:contentDescription="@string/emptyString"
android:paddingRight="@dimen/preference_item_padding_inner" >
</ImageView>
</LinearLayout>
<RelativeLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingBottom="6dip"
android:gravity="right"
android:layout_gravity="right"
android:paddingLeft="@dimen/preference_item_padding_inner"
android:paddingTop="6dip" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:gravity="right"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium" >
</TextView>
<TextView
android:id="@+id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@id/title"
android:gravity="right"
android:layout_below="@id/title"
android:maxLines="10"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" >
</TextView>
</RelativeLayout>
<LinearLayout
android:id="@+id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:minWidth="@dimen/preference_widget_width"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
在自定义偏好设置中:
@Override
protected View onCreateView(ViewGroup parent)
{
setLayoutResource(R.layout.preference_layout);
return super.onCreateView(parent);
}
答案 11 :(得分:0)
public class RtlEditTextPreference extends EditTextPreference {
public RtlEditTextPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RtlEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public RtlEditTextPreference(Context context) {
super(context);
}
@Override
protected View onCreateView(ViewGroup parent) {
View view = super.onCreateView(parent);
RelativeLayout relativeLayout = (RelativeLayout)(((LinearLayout)view).getChildAt(1));
relativeLayout.setGravity(Gravity.RIGHT);
TextView title = (TextView) relativeLayout.getChildAt(0);
TextView summary = (TextView) relativeLayout.getChildAt(1);
RelativeLayout.LayoutParams titleLayoutParams = (RelativeLayout.LayoutParams)title.getLayoutParams();
titleLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
title.setLayoutParams(titleLayoutParams);
RelativeLayout.LayoutParams summaryLayoutParams = (RelativeLayout.LayoutParams)summary.getLayoutParams();
summaryLayoutParams.addRule(RelativeLayout.ALIGN_RIGHT, title.getId());
summaryLayoutParams.addRule(RelativeLayout.ALIGN_LEFT, -1); // Override default left alignment to the title
summary.setLayoutParams(summaryLayoutParams);
return view;
}
}
答案 12 :(得分:0)
此方法对我有用:
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs)
{
View v = super.onCreateView(parent, name, context, attrs);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
{
if(parent != null)
parent.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
if(v != null)
v.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}
return v;
}
答案 13 :(得分:-1)
阿拉伯语文本给许多用户带来了问题,这意味着类似的(如果不是相同的话)问题已经多次回答。
我会把这些留在这里