我正在开发一个阿拉伯语的应用程序,并且在微调器中有一些值是英语的,有些是阿拉伯语的。因此,英语文本与左对齐,阿拉伯语与右对齐。
但是,我希望所有文本都在右边。我尝试了很多方法,但没有得到确切的解决方案。
我的代码是, 我使用了自定义微调器
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到右边
我怎样才能实现这个目标?
请帮助.. !!
答案 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"
/>