2012-07-04 36 views
13

Tôi có PreferencesActivity mà tôi cần nó để được căn phải bởi vì tôi muốn sử dụng ngôn ngữ tiếng Ả Rập, tôi đã cố gắng sử dụng android:layout_gravity="right" cho PreferenceScreen nhưng nó không hoạt động.Cách căn chỉnh PreferencesActivity trong Android?

Đây là XML của tôi:

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

Đây là cách tôi sử dụng XML bên PreferencesActivity:

addPreferencesFromResource(R.layout.preferences); 
+0

không phải là nó sẽ giúp bạn ngày hôm nay, nhưng Google hae đã cải tiến rất lớn trong các ngôn ngữ từ phải sang trái gần đây. Thật không may họ sẽ không xuất hiện trên các thiết bị trước Jellybean – Merlin

Trả lời

9

Đáng tiếc là các thành phần Preference cơ sở (PreferenceScreen, Preference, vv) được thực hiện trong một cách khá cấu hình. Chúng được thiết kế để hoạt động theo một cách cụ thể và không thể tùy chỉnh một cách khủng khiếp.

Để thực hiện những gì bạn muốn, có thể bạn sẽ phải triển khai phiên bản PreferenceScreen của riêng mình (hoặc chỉ có thể là loại Tùy chọn bạn đang sử dụng như CheckBoxPreference). Cách nó được thiết kế, khi nó thổi phồng các layout XML, nó giả định rất nhiều thứ về chúng và xử lý nó cho bạn (kích thước văn bản, padding, layout, wrapping, vv). Điều này là tuyệt vời nếu bạn muốn nó trông giống như mặc định, nhưng không tuyệt vời như vậy nếu bạn cần phải tinh chỉnh các cấu hình này.

(lưu ý:.. Nếu bạn không muốn thực hiện preferencescreen bạn chỉ có thể sử dụng một listview và đối xử với nó như là một trang sở thích Tuy nhiên, một trong hai cách về cơ bản bạn phải thực hiện phiên bản riêng của bạn về sở thích)

(Lưu ý 2: dựa trên các câu hỏi khác mà tôi đã xem về văn bản tiếng Ả Rập, đó là CÓ THỂ android đủ thông minh để cố gắng căn chỉnh theo mặc định. Tuy nhiên, tôi sẽ ngạc nhiên nếu đây là trường hợp. .)

Rất tiếc, tôi không có câu trả lời hay hơn cho bạn.

+3

Tôi đã thử nghiệm nó, Android đủ thông minh trong những thứ nhất định (Cài đặt chung) nếu tôi viết nó bằng tiếng Ả Rập, nó đi đúng hướng, nhưng các ưu tiên vẫn còn căn trái. –

+0

Đó là cài đặt mặc định được xác định theo cách tùy chọn được tăng cao. Bạn sẽ phải viết phiên bản tùy chọn của riêng mình nếu bạn muốn thay đổi điều đó, theo như tôi biết. – matt5784

+0

Bạn có thể tạo bố cục tùy chọn của riêng mình xml và căn chỉnh văn bản. Hãy xem xét điều này: http://stackoverflow.com/questions/7094584/checkboxpreference-with-own-layout – black

-1

Văn bản tiếng Ả Rập đã đặt ra vấn đề cho nhiều người dùng có nghĩa là tương tự, nếu không giống nhau, câu hỏi đã được trả lời nhiều lần.

tôi sẽ chỉ để lại những đây

Android Arabic text aligment

How to support Arabic text in Android?

+0

Bạn chưa trả lời câu hỏi của mình và cấu hình bố cục được sử dụng trong những câu hỏi đó không tồn tại cho PreferenceScreens. – matt5784

+0

Raul, đây là một vấn đề khác, liên kết văn bản không phải là những gì đang yêu cầu, sự liên kết đúng của nó hoặc trọng lực phù hợp của bố cục Prefernces. –

+0

Rất tiếc! Lỗi của tôi. –

11

Sau khi trải qua một thời gian tìm kiếm về câu hỏi chia sẻ của chúng tôi, tôi thấy không có gì hữu ích. api android mơ hồ không hỗ trợ RTL prefefrences. nó có nghĩa là không hỗ trợ cho các ngôn ngữ Ba Tư/Hebrew/arabic. Nhưng sau đó tôi đã cố gắng tìm một số cách để căn chỉnh một editText. Tôi đã lái lớp EditTextPreference và thực hiện lại phương thức onCreateView. đây là mã của tôi:

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

phần còn lại của các ưu đãi trong api android chuẩn nên giống nhau (btw tôi đã không cố gắng chưa). có thể một ngày nào đó chúng ta nên triển khai hoàn toàn hỗ trợ rtl trong tùy chọn Android và lưu trữ nó trên github. Hy vọng đoạn mã này sẽ giúp bạn.

+0

Tôi đã thử giải pháp được đề xuất của bạn, Nó thực sự căn chỉnh văn bản tùy chọn của tôi sang phải nhưng vấn đề là nó không làm điều tương tự cho biểu tượng tùy chọn nằm ở bên trái văn bản của tôi. Vì vậy, xuất hiện hiện tại của tôi rằng văn bản là trên hầu hết các quyền của màn hình trong khi biểu tượng của nó là trên hầu hết các bên trái của màn hình. Bạn có bất cứ đề nghị làm thế nào tôi có thể sắp xếp các biểu tượng là tốt? –

+0

Tôi chưa thử, nhưng tôi cho rằng nếu bạn tìm thấy một tham chiếu đến ImageView liên quan cho hình ảnh biểu tượng và sau đó, thiết lập layout_alignToParentRight thành true sẽ hoạt động. bạn trực tiếp không có một phương thức có cùng tên nhưng bạn có thể sử dụng setLayoutParams. xem http://stackoverflow.com/questions/4305564/android-layout-right-align –

0

Bạn có thể làm điều đó bằng cách sử dụng bố cục tùy chỉnh có gọi số setLayoutResource(int layoutResId).

res/layout/preferences_layout.xml: (Lưu ý rằng điều này dựa trên thư viện 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> 

Trong Sở thích tùy chỉnh của bạn:

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

    return super.onCreateView(parent); 
} 
5

Trong file manifest của bạn dưới thẻ ứng dụng thêm dòng này,

android: supportsRtl = "true"

+0

Thuộc tính này chỉ được sử dụng trong API 17 trở lên, nhưng điểm tốt. –

3

Sau khi kiểm tra cho một vài giải pháp tôi đã đưa ra một cái gì đó có thể giúp đỡ. Đó không phải là thanh lịch và chỉ hoạt động trên 4 và lên nhưng nó còn hơn không ...

thêm mã này vào 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()); 

Tất nhiên bạn có thể chọn để thay đổi vị trí trong hoạt động sở thích của bạn phương thức onResume() chỉ trong locale thay đổi onResume() của MainActivity của bạn trở lại miền địa phương ưa thích (hoặc do người dùng xác định) của bạn.

Hy vọng điều này sẽ hữu ích!

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. 
1

Được rồi, điều này có thể khá muộn, nhưng dù sao nếu bạn đang nhắm mục tiêu Android 3.0 trở lên, bạn nên sử dụng PreferenceFragment bằng cách nào đó có thể được thực hiện RTL.

Vì vậy, bạn nên tạo một đoạn trong mã của bạn như thế này:

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

bây giờ bạn nên tạo một Hoạt động có thêm đoạn này vào bố cục của nó. Bạn có thể tạo bố cục cho hoạt động của mình và đặt đoạn trong đó qua phần tử xml hoặc sử dụng lớp FragmentManager. Nhưng chìa khóa để tạo các ưu tiên Right-To-Left là đặt thuộc tính layout_direction = "rtl" trong tệp bố cục cho phần tử cha của đoạn. tức là

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

Lưu ý trên phần tử RelativeLayout khắc phục sự cố.

Bây giờ, hãy thêm mã Java hoạt động như bất kỳ hoạt động nào khác và thêm vào tệp kê khai của bạn.

Hy vọng nó không quá muộn :)

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

}

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

}

0

tương tự như vấn đề của tôi và đây là giải pháp:

bên PreferenceFragment của bạn:

@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) { 

      } 
     }); 
    } 

kết quả là như hình ảnh này: right to left Preference

0

Trong quan điểm của tôi điều này có thể là giải pháp: Đặt LayoutDirection mỗi nhằm 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;} 
Các vấn đề liên quan