14

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

14 に答える 14

12

共有された質問について検索するのに時間を費やした後、私は何も役に立たなかった。明らかに、androidapiは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;
    }
}

標準のAndroidAPIの残りの設定は同じである必要があります(ところで、私はまだ試していません)。いつか、Androidの設定でrtlサポートを完全に実装し、githubでホストする必要があります。このコードスニペットがお役に立てば幸いです。

于 2014-01-12T13:14:40.700 に答える
8

残念ながら、基本のPreferenceコンポーネント(PreferenceScreenPreferenceなど)は、かなり構成不可能な方法で実装されています。それらは特定の方法で機能するように設計されており、ひどくカスタマイズすることはできません。

必要なことを行うには、おそらく独自のバージョンのPreferenceScreen(または、CheckBoxPreferenceなどの使用しているPreferenceタイプのみ)を実装する必要があります。それが設計されている方法では、XMLレイアウトを膨らませるとき、それはそれらについて多くのことを想定し、それを処理します(テキストサイズ、パディング、レイアウト、ラッピングなど)。これは、デフォルトのように見せたい場合は便利ですが、これらの構成を微調整する必要がある場合はそれほど便利ではありません。

(注:preferencescreenを実装したくない場合は、リストビューを使用してそれを設定ページとして扱うことができます。ただし、どちらの方法でも、基本的に独自のバージョンの設定を実装する必要があります。)

(注2:アラビア語のテキストについて私が見た他の質問に基づくと、 Androidはデフォルトで右揃えを試みるのに十分賢い可能性があります。ただし、これが当てはまる場合は驚きます。それでも、試してみる価値はあります。)

申し訳ありませんが、これ以上の答えはありません。

于 2012-07-04T16:16:03.970 に答える
4

アプリケーションタグの下のマニフェストファイルに、この行を追加します。

android:supportsRtl = "true"

于 2014-03-04T07:36:38.167 に答える
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()メソッドのロケールを変更して、ロケールをプリファレンス(またはユーザー定義)ロケールに戻すことができます。

お役に立てれば!

于 2014-04-23T20:49:49.510 に答える
3

了解しました。これはかなり遅いかもしれませんが、とにかく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);
    }
}

次に、このフラグメントをレイアウトに追加するアクティビティを作成する必要があります。アクティビティのレイアウトを作成し、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コードを追加し、マニフェストファイルに追加します。

手遅れではないことを願っています:)

于 2014-08-15T10:05:45.017 に答える
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;
    }

}
于 2014-09-11T14:50:30.600 に答える
2

私の見解では、これが解決策になる可能性があります。各ビューの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;}
于 2016-08-19T11:05:33.080 に答える
2

プリファレンスフラグメントの場合、そのコンテナにこの属性を持たせることができます

android:layoutDirection="rtl"
于 2018-06-29T03:36:11.860 に答える
1

これを貼り付けるというレイアウトxmlファイルを作成しますpreference_checkbox.xml(色を必要な色に変更します。親を塗りつぶすために設定された重力と幅のみが重要です)。

<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

画像付きのチェックボックスについての質問がありましたが、それは同じテクニックです。

于 2014-05-28T12:02:18.830 に答える
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) {

            }
        });
    }

結果は次の画像のようになります:右から左への設定

于 2016-02-21T04:41:58.237 に答える
0

を呼び出してカスタムレイアウトを使用することで、これを行うことができますsetLayoutResource(int layoutResId)

res / layout / Preferences_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);
}
于 2014-01-28T22:54:58.273 に答える
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;
}

}

于 2014-09-11T14:54:55.040 に答える
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;
}
于 2019-03-09T13:31:09.777 に答える
-1

アラビア語のテキストは多くのユーザーに問題を引き起こしました。これは、同じではないにしても、同じような質問に何度も回答されたことを意味します。

これらはここに残しておきます

Androidのアラビア語のテキストの配置

Androidでアラビア語のテキストをサポートするにはどうすればよいですか?

于 2012-07-04T16:17:53.427 に答える