从右到左设备上的Android TextView右对齐

时间:2013-03-16 11:34:43

标签: java android android-layout android-widget right-to-left

我正在编写一个以希伯来语显示的应用程序,为此我正确对齐TextView的文本。 在Nexus设备上进行开发时,所有工作都很棒并且文本显示应该使用,对于TextView使用android:gravity =“right”。 当我在运行自定义ROM的本地移动运营商设备(以色列)上运行相同的应用程序时,所有使用gravity =“right”设置的TextView小部件看起来好像被设置为gravity =“left”。如果我去将重力改为左(你猜对了......)它会对齐。

我尝试使用代码并使用设备配置本身将设备的默认语言环境更改回美国英语。什么都没有帮助。 我正在研究的运营商设备是Galaxy SII。

对我而言,似乎曾经创建ROM的人只是更改了对齐值,现在正确表示左右意味着正确。 ROM是三星的官方ROM。

有没有人遇到过这个问题?任何解决方案的想法?

我已经尝试过了: 1.从设置菜单更改设备区域设置。 2.以编程方式更改设备区域设置。 3.强制布局文件中的根布局为left / right layout_gravity / gravity

目前唯一有效的方法是将TextView的重力改为左侧,这意味着它将停止在Nexus等全球设备上工作......

1 个答案:

答案 0 :(得分:4)

回答我自己的问题。

看了一遍后我找不到答案。因为ROM是为居住在以色列并讲希伯来语的人定制的,所以似乎翻转了宽度MATCH_PARENT TextView内的对齐方式。意思是,左对齐意味着右和右意味着左。 更改它的唯一方法是将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();
    }               
}
}

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

在完成之后,我所要做的就是遍历有问题的布局并用HebrewTextView替换TextView,如果它是代码引用的TextView,则更改转换。 getTextView()方法是在控件类中定义的,因此在添加.getTextView()后缀后,代码中更改文本和/或其他TextView属性的部分将起作用。

希望有所帮助。