How to right align PreferencesActivity in android?
Asked Answered
A

14

14

I have PreferencesActivity which I need it to be right aligned because I want to use Arabic language, I tried to use android:layout_gravity="right" for PreferenceScreen but it didn't work.

This is my 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>

This is how I use the XML inside PreferencesActivity:

addPreferencesFromResource(R.layout.preferences);
Audrieaudris answered 4/7, 2012 at 15:55 Comment(1)
not that it will help you today, but Google hae made vast improvements in right-to-left languages recently. Unfortunately they won't appear on devices before JellyBeanSixfooter
A
8

Unfortunately the base Preference components (PreferenceScreen, Preference, etc.) are implemented in a fairly non-configurable way. They are designed to work in a specific way and are not terribly customizable.

In order to do what you want, you will probably have to implement your own version of PreferenceScreen (or possible just the Preference types you are using such as CheckBoxPreference). The way it is designed, when it inflates XML layouts it assumes a lot of things about them and handles it for you (text size, padding, layout, wrapping, etc). This is great if you want it to look like the default, but not so great if you need to tweak these configurations.

(note: if you don't want to implement preferencescreen you could just use a listview and treat it as a preference page. However, either way you basically have to implement your own version of preferences.)

(note2: based on other questions I've seen about arabic text, it's POSSIBLE android is smart enough to try to right align it by default. However, I would be surprised if this was the case. Still, it's worth a try.)

Sorry I don't have a better answer for you.

Argentiferous answered 4/7, 2012 at 16:16 Comment(3)
I already test it, Android smart enough in certain things (General Settings) if I write it in arabic, it goes right aligned, but the preferences they remain left aligned.Audrieaudris
That's a default setting determined by the way preferences are inflated. You'll have to write your own version of preferences if you want to change that, as far as I know.Argentiferous
You can create your own preference layout xml and right align the text. Have a look at this: #7095084Apraxia
M
12

After spending some time searching about our shared question, I found nothing useful. obviosly android api doesn't support RTL prefefrences. it means no support for persian/hebrew/arabic languages. But afterall I tried to find some way to right align an editText. I drived EditTextPreference class and implemented onCreateView method again. here is my code:

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

the rest of the preferences in the standard android api should be the same(btw I haven't tried yet). maybe someday we should fully implement rtl support in android preferences and host it on github. Hope this code snippet helps you.

Mandorla answered 12/1, 2014 at 13:14 Comment(2)
I have tried your suggested solution, It really aligns my preference text to right but the problem is that it does not do same thing for preference icon that is located on left of my text. So my Current appearance that text is on most right of screen while its icon is on most left of the screen. Do you have any suggestions how can I align the icon as well?Helladic
I haven't tried yet, but I suppose if you find a reference to the associated ImageView for the icon image and then, setting layout_alignToParentRight to true would work. you directly don't have a method with the same name but you can use setLayoutParams. see https://mcmap.net/q/274503/-android-layout-right-alignMandorla
A
8

Unfortunately the base Preference components (PreferenceScreen, Preference, etc.) are implemented in a fairly non-configurable way. They are designed to work in a specific way and are not terribly customizable.

In order to do what you want, you will probably have to implement your own version of PreferenceScreen (or possible just the Preference types you are using such as CheckBoxPreference). The way it is designed, when it inflates XML layouts it assumes a lot of things about them and handles it for you (text size, padding, layout, wrapping, etc). This is great if you want it to look like the default, but not so great if you need to tweak these configurations.

(note: if you don't want to implement preferencescreen you could just use a listview and treat it as a preference page. However, either way you basically have to implement your own version of preferences.)

(note2: based on other questions I've seen about arabic text, it's POSSIBLE android is smart enough to try to right align it by default. However, I would be surprised if this was the case. Still, it's worth a try.)

Sorry I don't have a better answer for you.

Argentiferous answered 4/7, 2012 at 16:16 Comment(3)
I already test it, Android smart enough in certain things (General Settings) if I write it in arabic, it goes right aligned, but the preferences they remain left aligned.Audrieaudris
That's a default setting determined by the way preferences are inflated. You'll have to write your own version of preferences if you want to change that, as far as I know.Argentiferous
You can create your own preference layout xml and right align the text. Have a look at this: #7095084Apraxia
H
5

In your manifest file under application tag add this line,

android:supportsRtl="true"

Homan answered 4/3, 2014 at 7:36 Comment(1)
This attribute is only used in API 17 and higher, but good point.Lona
M
3

After checking for a few solutions i came upon something that might help. It's not elegant and works only on 4 and up but it's better than nothing...

add this code to 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());

Of course you can choose to change the locale in your preference activities onResume() method only in your MainActivity's onResume() change locale back to your preferred (or user defined) locale.

Hope this helps!

Malanie answered 23/4, 2014 at 20:49 Comment(0)
T
3

Alright, this might be quite late, but anyways if you are targeting Android 3.0 or higher, you should use PreferenceFragment with can be somehow made RTL.

So you should create a fragment in your code like this:

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

now you should create an Activity that adds this fragment to its layout. You can create a layout for your activity and put the fragment in it via xml element or using the FragmentManager class. But the key to make the preferences Right-To-Left is to put a layout_direction="rtl" attribute in the layout file for a parent element of the fragment. i.e.

<?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>

Notice the android:layoutDirection="rtl" on the RelativeLayout element that fixes the problem.

Now add the Activity Java code like any other activity and add to your manifest file.

Hope it's not too late :)

Terwilliger answered 15/8, 2014 at 10:5 Comment(1)
Thanks!!! The only correct answer. android:layoutDirection="rtl" fixes issues with right-to-left languages.Grekin
I
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;
    }

}
Inamorata answered 11/9, 2014 at 14:50 Comment(0)
D
2

same as my problem and this is the solution:

inside your 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) {

            }
        });
    }

the result is like this image:right to left Preference

Dictograph answered 21/2, 2016 at 4:41 Comment(1)
The best answer but If you can modify lines which changes gravity to: Gravity.RIGHT | Gravity.CENTER_VERTICAL because if you have some views with multi-line summary like switch preference, it's gravity will be on top and will lose its CENTER_VERTICAL gravity.Doronicum
C
2

In my point of view this can be the solution: Set each view's LayoutDirection to 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;}
Convocation answered 19/8, 2016 at 11:5 Comment(0)
O
2

for preferences fragment you can make its container to have this attribute

android:layoutDirection="rtl"
Outdare answered 29/6, 2018 at 3:36 Comment(0)
N
1

create a layout xml file called preference_checkbox.xml paste this (change the color 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 : https://mcmap.net/q/827504/-checkboxpreference-with-own-layout

the question there was about check box with image but it's the same technique.

Negativism answered 28/5, 2014 at 12:2 Comment(0)
S
0

You could do that by using a custom layout with calling setLayoutResource(int layoutResId).

res/layout/preference_layout.xml: (Note that this is based on HoloEverywhere library 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>

In your custom Preference:

@Override
protected View onCreateView(ViewGroup parent)
{
    setLayoutResource(R.layout.preference_layout);

    return super.onCreateView(parent);
}
Scrutinize answered 28/1, 2014 at 22:54 Comment(0)
I
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;
}

}

Inamorata answered 11/9, 2014 at 14:54 Comment(0)
A
0

This method worked for me:

        @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;
}
Allophone answered 9/3, 2019 at 13:31 Comment(0)
L
-1

Arabic text has posed a problem for many a user which means that similar, if not the same, questions have been answered several times.

I'll just leave these here

Android Arabic text aligment and

How to support Arabic text in Android?

Leasia answered 4/7, 2012 at 16:17 Comment(2)
You haven't answered his question, and the layout configurations used in those questions don't exist for PreferenceScreens.Argentiferous
Raul, this is another issue, text alignment is not what am asking for, its right alignment or right gravity of Prefernces Layouts.Audrieaudris

© 2022 - 2024 — McMap. All rights reserved.