Android - 将Spinner文本设置为Right

时间:2014-05-18 09:52:55

标签: android android-spinner

我正在开发一个阿拉伯语的应用程序,并且在微调器中有一些值是英语的,有些是阿拉伯语的。因此,英语文本与左对齐,阿拉伯语与右对齐。

但是,我希望所有文本都在右边。我尝试了很多方法,但没有得到确切的解决方案。

我的代码是, 我使用了自定义微调器

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;

public class SpinnerModified extends Spinner
{
public SpinnerModified(Context context)
{
    super(context);
}

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

public SpinnerModified(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}

@Override
public void setAdapter(SpinnerAdapter orig)
{
    final SpinnerAdapter adapter = newProxy(orig);

    super.setAdapter(adapter);

    try
    {
        final Method m = AdapterView.class.getDeclaredMethod("setNextSelectedPositionInt", int.class);
        m.setAccessible(true);
        m.invoke(this, -1);

        final Method n = AdapterView.class.getDeclaredMethod("setSelectedPositionInt", int.class);
        n.setAccessible(true);
        n.invoke(this, -1);

    }
    catch (Exception e)
    {
        throw new RuntimeException(e);
    }
}

protected SpinnerAdapter newProxy(SpinnerAdapter obj)
{
    return (SpinnerAdapter) java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(),
            new Class[] { SpinnerAdapter.class }, new SpinnerAdapterProxy(obj));
}

/**
 * Intercepts getView() to display the prompt if position < 0
 */
protected class SpinnerAdapterProxy implements InvocationHandler
{
    protected SpinnerAdapter obj;
    protected Method getView;

 protected SpinnerAdapterProxy(SpinnerAdapter obj)
 {
        this.obj = obj;

    try
    {
     this.getView = SpinnerAdapter.class.getMethod("getView",int.class, View.class, ViewGroup.class);
    }
    catch (Exception e)
    {
     throw new RuntimeException(e);
    }
 }

    @Override
    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
    {
        try
        {
            return m.equals(getView) && (Integer) (args[0]) < 0 ? getView(
                    (Integer) args[0], (View) args[1], (ViewGroup) args[2])
                    : m.invoke(obj, args);
        }
        catch (InvocationTargetException e)
        {
            throw e.getTargetException();
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }
    }

protected View getView(int position, View convertView, ViewGroup parent)throws IllegalAccessException
{
    if (position < 0)
    {
            final TextView v = (TextView) ((LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                    .inflate(R.layout.spinner_item, parent,
                            false);

            v.setText(getPrompt());
            v.setTextColor(Color.GRAY);

            return v;
    }

    return obj.getView(position, convertView, parent);
}

 }

}

spinner_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="?android:attr/listPreferredItemHeight"
android:layout_width="match_parent"
android:gravity="right"/>

my_lyout.xml

<com.demo.demoapp.utils.SpinnerModified
            android:id="@+id/search_list_spinner_2"       
            android:layout_width="match_parent"
            android:layout_height="35dp"
            android:layout_centerHorizontal="true"
            android:prompt="@string/select"
            android:layout_centerVertical="true"
            android:layout_marginRight="30dp"
            android:layout_marginLeft="5dp"
            android:layout_toLeftOf="@+id/search_logo_2"
            android:background="@color/transparent"
            />

微调器的屏幕截图

enter image description here

我想要1000-2500和2500-5000到右边

我怎样才能实现这个目标?

请帮助.. !!

3 个答案:

答案 0 :(得分:2)

我相信这是Android奇怪之一。如果将TextView包装在另一个布局中,它将起作用。 例如:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="?android:attr/listPreferredItemHeight"
android:layout_width="match_parent">
   <TextView 
   android:layout_height="wrap_content"
   android:layout_width="wrap_content"
   android:layout_gravity="right"/>
</FrameLayout>

不要忘记在文字视图中提供ID,并致电findViewById获取

答案 1 :(得分:0)

如果您希望同时支持英语(L2R)和阿拉伯语(R2L),只需将以下行添加到微调器布局项

android:textDirection="locale"

并添加

android:supportsRtl="true" 

在清单文件中。

这将使Spinner文本与Left对齐以选择英语,并且在选择阿拉伯语时将与Right对齐。

答案 2 :(得分:0)

只需设置这两个属性:

android:textAlignment="gravity"
android:gravity="right"

示例:spinner_layout.xml

<?xml version="1.0" encoding="utf-8"?>
 <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:ellipsize="marquee"
   android:singleLine="true"
   android:textAlignment="gravity"
   android:gravity="right"
/>