4

私はヘブライ語で表示するアプリを書いています。そのために、TextView のテキストを右揃えにしています。Nexus デバイスでの開発中は、TextView に android:gravity="right" を使用して、すべてがうまく機能し、テキストが適切に表示されます。カスタム ROM を実行しているローカル モバイル キャリア デバイス (イスラエル) で同じアプリを実行すると、gravity="right" で設定されたすべての TextView ウィジェットが、gravity="left" として設定されているかのように表示されます。重力を左に変更すると (ご想像のとおり)、右に整列します。

コードを使用し、デバイス構成自体を使用して、デバイスの既定のロケールを米国英語に戻そうとしました。何も助けませんでした。私が取り組んでいるキャリア デバイスは Galaxy SII です。

ROMを作成した人がアライン値を変更しただけで、右が左を意味し、左が右を意味するように思えます。ROMはSamsungの公式のものです。

誰かがこの問題を経験しましたか? 解決策のアイデアはありますか?

私がすでに試したこと: 1.設定メニューからデバイスのロケールを変更します。2. プログラムによるデバイス ロケールの変更。3. レイアウト ファイルのルート レイアウトを左右の layout_gravity/gravity に強制する

現在機能しているのは、TextView の重力を左に変更することだけです。つまり、Nexus などのグローバル デバイスでは機能しなくなります。

4

1 に答える 1

4

私自身の質問に答えます。

全体を見た後、私は答えを見つけられませんでした。ROMはイスラエルに住んでいてヘブライ語を話す人々のためにカスタムメイドされているため、幅MATCH_PARENTTextView内の配置が反転しているようです。つまり、左揃えは右を意味し、右揃えは左を意味します。これを変更する唯一の方法は、TextViewをWRAP_CONTENTとともに使用し、TextView自体をその親の内側の右側に揃えることです。私はすでにアプリとすべての画面レイアウトを作成しているので、すべてを変更したくありませんでした。そこで、私が行ったことは、TextViewをLinearLayout内にラップし、外部から簡単に使用できるように公開するカスタムコントロールを実装することです。このように、MATCH_PARENTはLinearLayoutに影響を与え、コントロールはラップされたTextViewを右に揃えます。

そして、これはどのように:

まず、コントロールクラス自体(HebrewTextView.java):

public class HebrewTextView extends LinearLayout
{
private TextView mTextView;

public HebrewTextView(Context context)
{
    super(context);
    init(null);
}

public HebrewTextView(Context context, AttributeSet attrs)
{
    super(context, attrs);
    init(attrs);
}

public TextView getTextView()
{
    return mTextView;
}

private void init(AttributeSet attrs)
{       
    mTextView = new TextView(getContext());
    LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
    lp.gravity = Gravity.RIGHT; 
    mTextView.setLayoutParams(lp);
    mTextView.setGravity(Gravity.CENTER_VERTICAL);

    addView(mTextView);

    if(attrs!=null)
    {
        TypedArray params = getContext().obtainStyledAttributes(attrs, R.styleable.HebrewTextView);
        mTextView.setText(params.getString(R.styleable.HebrewTextView_android_text));
        mTextView.setTextColor(params.getColor(R.styleable.HebrewTextView_android_textColor, Color.WHITE));
        mTextView.setTextSize(params.getDimension(R.styleable.HebrewTextView_android_textSize, 10));
        mTextView.setSingleLine(params.getBoolean(R.styleable.HebrewTextView_android_singleLine, false));
        mTextView.setLines(params.getInt(R.styleable.HebrewTextView_android_lines, 1));                     
        params.recycle();
    }               
}
}

values/attrs.xmlの下の制御XML属性。カスタム属性がTextView属性と一致するため、レイアウトファイルを変更する必要がないことに注意してください。

注:これらは私が必要とした属性です。さらに使用している場合は、XMLに追加して、クラスのinit()で読み取ります。

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="HebrewTextView">
    <attr name="android:text"/>
    <attr name="android:textColor"/>
    <attr name="android:lines"/>
    <attr name="android:textSize"/>
    <attr name="android:singleLine"/>                                    
</declare-styleable>
</resources>

その後、問題のあるレイアウトを実行し、TextViewをHebrewTextViewに置き換え、コードによって参照されるTextViewの場合は、キャストを変更するだけです。getTextView()メソッドは、.getTextView()接尾辞を追加した後、テキストやその他のTextViewプロパティを変更するコード内のセクションが機能するように、コントロールクラスで定義されました。

お役に立てば幸いです。

于 2013-03-20T07:19:02.377 に答える