如何在Android中对齐Preferences Activity?

时间:2012-07-04 15:55:30

标签: java android android-preferences arabic

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

中使用XML的方式
addPreferencesFromResource(R.layout.preferences);

14 个答案:

答案 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)

不幸的是,基本偏好组件(PreferenceScreenPreference等)以相当不可配置的方式实现。它们旨在以特定方式工作,并且不是非常可定制的。

为了做你想做的事,你可能必须实现你自己的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)

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

我会把这些留在这里

Android Arabic text aligment

How to support Arabic text in Android?