Android - 将Spinner文本设置为Right

问题描述 投票:0回答:2

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

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

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

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

微调器的屏幕截图

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

我怎么能实现这个?

请帮忙..!!

android android-spinner
2个回答
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来获取它


0
投票

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

android:textDirection="locale"

并添加

android:supportsRtl="true" 

在您的清单文件中。

这将对齐左侧的微调文本以进行英语选择,并在选择阿拉伯语时对齐右侧的文本。

热门问题
推荐问题
最新问题