Как правильно настроить PreferencesActivity в Android?

я имею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);
 Merlin04 июл. 2012 г., 19:17
не то, чтобы это помогло вам сегодня, но Google недавно сделал значительные улучшения в языках с написанием справа налево. К сожалению, они не появятся на устройствах до JellyBean

Ответы на вопрос(14)

Хорошо, это может быть довольно поздно, но в любом случае, если вы ориентируетесь на 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 учебный класс. Но ключом к настройке справа налево является установка layout_direction = & quot; rtl & quot; атрибут в файле макета для родительского элемента фрагмента. то есть

<?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-код действия, как и любой другой вид деятельности, и добавьте его в файл манифеста.

Надеюсь, еще не поздно :)

 16 сент. 2018 г., 04:17
Спасибо!!! Единственно правильный ответ.android:layoutDirection="rtl" исправляет проблемы с языками справа налево.

После проверки нескольких решений я наткнулся на то, что могло бы помочь. Это не элегантно и работает только на 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());

Конечно, вы можете изменить языковой стандарт в ваших предпочтительных действиях метода onResume () только в вашем MainActivity onResume () изменить языковой стандарт обратно на предпочитаемый (или определенный пользователем) языковой стандарт.

Надеюсь это поможет!

Этот метод работал для меня:

        @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;
}

так же, как моя проблема, и это решение:

внутри вашего 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) {

            }
        });
    }

результат похож на это изображение:справа налево

 21 февр. 2019 г., 16:18
Лучший ответ, но если вы можете изменить линии, которые изменят гравитацию:Gravity.RIGHT | Gravity.CENTER_VERTICAL потому что, если у вас есть несколько представлений с многострочным обобщением, например, предпочтение переключателя, гравитация будет на вершине и потеряет своюCENTER_VERTICAL сила тяжести.
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;
}

}

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;
}

}

Решение Вопроса

К сожалению, базовые компоненты предпочтения (PreferenceScreen, предпочтениеи т. д.) реализованы довольно ненастраиваемым способом. Они предназначены для работы особым образом и не очень настраиваемы.

Чтобы делать то, что вы хотите, вам, вероятно, придется реализовать собственную версию PreferenceScreen (или, возможно, только те типы предпочтений, которые вы используете, такие как CheckBoxPreference). Как он спроектирован, когда он раздувает макеты XML, он принимает о них много вещей и обрабатывает их для вас (размер текста, отступы, макет, перенос и т. Д.). Это замечательно, если вы хотите, чтобы он выглядел как по умолчанию, но не так здорово, если вам нужно настроить эти конфигурации.

(примечание: если вы не хотите реализовывать экран настроек, вы можете просто использовать просмотр списка и рассматривать его как страницу настроек. Однако в любом случае вам, по сути, придется реализовать собственную версию настроек.)

(примечание 2: на основе других вопросов, которые я видел об арабском тексте, этоPOSSIBLE Android достаточно умен, чтобы попытаться выровнять его по умолчанию. Однако я был бы удивлен, если бы это было так. Тем не менее, это стоит попробовать.)

Извините, у меня нет лучшего ответа для вас.

 30 апр. 2013 г., 15:29
Вы можете создать свой собственный макет предпочтений XML и выровнять текст по правому краю. Посмотри на это:stackoverflow.com/questions/7094584/…
 05 июл. 2012 г., 07:11
Это настройка по умолчанию, определяемая способом раздувания предпочтений. Насколько я знаю, вам придется написать свою собственную версию предпочтений.
 Hesham Saeed04 июл. 2012 г., 19:22
Я уже проверял, Android достаточно умный в определенных вещах (Общие настройки), если я пишу это по-арабски, он выравнивается по правому краю, но настройки остаются по левому краю.

Потратив некоторое время на поиск нашего общего вопроса, я не нашел ничего полезного. Очевидно, что Android Api не поддерживает настройки RTL. это означает отсутствие поддержки персидского / иврита / арабского языка. Но в конце концов я попытался найти способ выровнять правый текст. Я использовал класс 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 должны быть такими же (кстати, я еще не пробовал). возможно когда-нибудь мы должны полностью реализовать поддержку rtl в настройках Android и разместить ее на github. Надеюсь, этот фрагмент кода поможет вам.

 14 февр. 2014 г., 07:46
Я еще не пробовал, но я полагаю, если вы найдете ссылку на связанный ImageView для изображения значка, а затем установит для layout_alignToParentRight значение true. у вас напрямую нет метода с тем же именем, но вы можете использовать setLayoutParams. увидетьstackoverflow.com/questions/4305564/android-layout-right-align
 14 февр. 2014 г., 02:33
Я испробовал предложенное вами решение. Оно действительно выравнивает текст моего предпочтения по правому краю, но проблема в том, что он не делает то же самое для значка предпочтения, расположенного слева от моего текста. Таким образом, мой Текущий вид, что текст находится в самой правой части экрана, в то время как его значок находится в большей части левой части экрана. Есть ли у вас какие-либо предложения, как я могу выровнять значок?

Вы можете сделать это с помощью пользовательского макета с вызовом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);
}

На мой взгляд, это может быть решением: Установите для каждого вида 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;}
 09 мар. 2019 г., 13:51
Это не работает

Арабский текст создает проблему для многих пользователей, что означает, что на подобные, если не одинаковые, вопросы отвечали несколько раз.

Я просто оставлю это здесь

Android текст на арабском языке а также

Как поддерживать арабский текст в Android?

 04 июл. 2012 г., 19:32
К сожалению! Виноват.
 04 июл. 2012 г., 18:19
Вы не ответили на его вопрос, и конфигурации макетов, использованные в этих вопросах, не существуют для PreferenceScreens.
 Hesham Saeed04 июл. 2012 г., 19:20
Рауль, это другая проблема, выравнивание текста - это не то, что я прошу, это выравнивание по правому краю или гравитация раскладок предпочтений.

В вашем файле манифеста под тегом приложения добавьте эту строку,

Android: supportsRtl = & Quot; истинно & Quot;

 16 сент. 2018 г., 04:14
Он не работает даже в API 27.
 21 мар. 2016 г., 05:28
Этот атрибут используется только в API 17 и выше, но это хороший момент.

для фрагмента предпочтений вы можете сделать его контейнер, чтобы иметь этот атрибут

android:layoutDirection="rtl"
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.

Ваш ответ на вопрос