Подтвердить что ты не робот

Как правильно выравнивать 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);
4b9b3361

Ответ 1

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

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

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

(примечание2: по другим вопросам, которые я видел о арабском тексте, он ВОЗМОЖНО, и Android достаточно умен, чтобы попытаться правильно выровнять его по умолчанию. Однако я был бы удивлен, если бы это было так. попробовать.)

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

Ответ 2

Потратив некоторое время на поиск нашего общего вопроса, я не нашел ничего полезного. 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;
    }
}

остальные настройки в стандартном андроиде api должны быть одинаковыми (кстати, я еще не пробовал). возможно, когда-нибудь мы должны полностью реализовать поддержку rtl в настройках android и разместить ее на github. Надеюсь, этот фрагмент кода поможет вам.

Ответ 3

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

Android: supportsRtl = "истина"

Ответ 4

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

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

Ответ 5

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

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 the same technique.
Good Luck.

Ответ 7

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

Теперь добавьте Java-код Activity как любое другое действие и добавьте в файл манифеста.

Надеюсь, что это не слишком поздно:)

Ответ 8

Вы можете сделать это, используя собственный макет с вызовом 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);
}

Ответ 9

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

}

Ответ 10

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

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

            }
        });
    }

результат выглядит следующим образом: справа налево Предпочтение

Ответ 11

По моему мнению, это может быть решение: Установите каждый вид 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;}