14

我有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>

这就是我在里面使用 XML 的方式PreferencesActivity

addPreferencesFromResource(R.layout.preferences);
4

14 回答 14

12

在花了一些时间搜索我们共同的问题后,我发现没有任何用处。显然 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 上。希望此代码段对您有所帮助。

于 2014-01-12T13:14:40.700 回答
8

不幸的是,基本的 Preference 组件(PreferenceScreenPreference等)是以相当不可配置的方式实现的。它们被设计为以特定方式工作,并且不是非常可定制的。

为了做你想做的事,你可能必须实现你自己的 PreferenceScreen 版本(或者可能只是你正在使用的 Preference 类型,例如 CheckBoxPreference)。它的设计方式是,当它扩展 XML 布局时,它会假设很多关于它们的事情并为您处理(文本大小、填充、布局、换行等)。如果您希望它看起来像默认设置,这很好,但如果您需要调整这些配置,则不是很好。

(注意:如果您不想实现偏好屏幕,您可以只使用列表视图并将其视为偏好页面。但是,无论哪种方式,您基本上都必须实现自己的偏好版本。)

(注2:基于我看到的关于阿拉伯文本的其他问题,它的POSSIBLE android 足够聪明,可以默认尝试右对齐。但是,如果是这种情况,我会感到惊讶。不过,值得一试。)

对不起,我没有更好的答案给你。

于 2012-07-04T16:16:03.970 回答
4

In your manifest file under application tag add this line,

android:supportsRtl="true"

于 2014-03-04T07:36:38.167 回答
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() 方法中更改语言环境。

希望这可以帮助!

于 2014-04-23T20:49:49.510 回答
3

好吧,这可能已经很晚了,但无论如何,如果你的目标是 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 将此片段添加到其布局中。FragmentManager您可以为您的活动创建一个布局,并通过 xml 元素或使用该类将片段放入其中。但是使首选项从右到左的关键是在片段的父元素的布局文件中放置一个 layout_direction="rtl" 属性。IE

<?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元素。

现在像任何其他活动一样添加活动 Java 代码并添加到您的清单文件中。

希望还为时不晚:)

于 2014-08-15T10:05:45.017 回答
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;
    }

}
于 2014-09-11T14:50:30.600 回答
2

在我看来,这可能是解决方案:将每个视图的 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;}
于 2016-08-19T11:05:33.080 回答
2

对于首选项片段,您可以使其容器具有此属性

android:layoutDirection="rtl"
于 2018-06-29T03:36:11.860 回答
1

创建一个xml名为preference_checkbox.xmlpaste this 的布局文件(将颜色更改为您想要的,只有设置为填充父级的重力和宽度很重要):

<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

那里的问题是关于带有图像的复选框,但它是相同的技术。

于 2014-05-28T12:02:18.830 回答
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) {

            }
        });
    }

结果是这样的图像:从右到左偏好

于 2016-02-21T04:41:58.237 回答
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);
}
于 2014-01-28T22:54:58.273 回答
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;
}

}

于 2014-09-11T14:54:55.040 回答
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;
}
于 2019-03-09T13:31:09.777 回答
-1

阿拉伯文本给许多用户带来了问题,这意味着类似的(如果不相同的话)问题已经被回答了好几次。

我就把这些留在这里

Android阿拉伯语文本对齐

如何在 Android 中支持阿拉伯语文本?

于 2012-07-04T16:17:53.427 回答