这里提供两种方法,应该还有更简单的方法,希望前辈们不吝赐教。
通常情况下:
在Adapter中调用自定义的TevtView 这里叫它 myTextView
关键代码 是 这个View的 id="@android:id/text1"
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:textColor="@color/textcolor"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:gravity="center_vertical" >
</TextView>
以及 android:textColor="@color/textcolor" 当然其他样式应该也是可以修改的,例如背景等
@color/textcolor 其实是res/color/textcolor下的 一个xml文件 由selector组成,里面有两个Item分别表示为
Spinner.isEnable()为true 和 false 时 各自字体的颜色
下面是 这个 xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="#ff808080"/>
<item android:color="#000000"/>
</selector>
下面是activity的内容,内容中的TextValue只是一个自定的类而已,可以忽略
package com.example.spinnerchangestyle;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
public class MainActivity extends Activity
{
private Button btnOnly;
private Button btnEnable;
private Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnOnly = (Button) findViewById(R.id.btn_spinnerOnlyRead);
btnEnable = (Button) findViewById(R.id.btn_spinnerEnable);
spinner = (Spinner) findViewById(R.id.spinner);
List<TextValue> dnsyList = new ArrayList<TextValue>();
TextValue tv1 = new TextValue();
tv1.setText("个人电脑");
tv1.setValue("0");
dnsyList.add(tv1);
TextValue tv2 = new TextValue();
tv2.setText("公司电脑");
tv2.setValue("1");
dnsyList.add(tv2);
TextValue tv3 = new TextValue();
tv3.setText("客户提供");
tv3.setValue("2");
dnsyList.add(tv3);
ArrayAdapter<TextValue> adapter=new ArrayAdapter<TextValue>(this,R.layout.mylayout, dnsyList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
btnOnly.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
spinner.setEnabled(false);
}
});
btnEnable.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
spinner.setEnabled(true);
}
});
}
}
注意!我在实际的开发中还有一种方法可以实现上述功能,而且用上述方法且不能实现(至少我目前实验的情况是酱)
方法2:
自定义一个类继承Adapter,实现其中的getView方法,getView中的view其实就是Spinner显示为一行时的那个view,所以在这里更改view的样式就可以了
关键代码同上,只是多了个自定义的类。由于要自定义Adapter类,要new下面的Adapter来用,而此时用到的myAdapter中的view的样式,就是前面提到的自定义的Textview
dnsySpinner = (Spinner) findViewById(R.id.dnsyet);
adapter = new MySpinnerAdapter(AddActivity.this, R.layout.spinner_layout, dnsyList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
dnsySpinner.setAdapter(adapter);
如下:
public class MySpinnerAdapter extends ArrayAdapter<TextValue>
{
private Context context;
public MySpinnerAdapter(Context context, int resource, List<TextValue> objects)
{
super(context, resource, objects);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
TextView view = (TextView) super.getView(position, convertView, parent);
AddActivity add = (AddActivity)context;
Spinner spinner = (Spinner) add.findViewById(R.id.dnsyet);
if(spinner.isEnabled())
{
view.setTextColor(Color.parseColor("#000000"));这里其实就是修改了自定义TextView中的字体的颜色为黑色
}
else
{
view.setTextColor(Color.parseColor("#808080"));灰色
}
return view;
}
}
这样还不能能实现如题所述的功能的,需要在设置mySpinner.setEnable(true或者false)的下一行代码中在setAdapter,因为自定义的类中的getView方法时在setAdapter的时候调用的,如果不setAdapter的话就无法实现更改样式的功能了。