我在将一些有效的XML文件转换为代码时遇到麻烦.
我有一个ListVIEw,并且我需要能够在运行时从高级资源中未知的资源中切换其按下/选中的可绘制对象(因此为什么不使用XML);
以下配置非常有效:
main.xml:
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="fill_parent" androID:layout_height="fill_parent" androID:orIEntation="vertical" > <ListVIEw androID:ID="@+ID/ListVIEw1" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:choiceMode="singleChoice" > </ListVIEw></linearLayout>
选择器.xml:
<?xml version="1.0" enCoding="utf-8"?><selector xmlns:androID="http://schemas.androID.com/apk/res/androID"> <item androID:drawable="@drawable/blue" androID:state_pressed="true"/> <item androID:drawable="@drawable/green" androID:state_checked="true"/> <item androID:drawable="@drawable/orange"/></selector>
List_row.xml:
<?xml version="1.0" enCoding="utf-8"?><CheckedTextVIEw xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:background="@drawable/selector" androID:@R_301_5095@="10dp" />
Main.java:
public class Main extends Activity { StateListDrawable selector; @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.main); ListVIEw ListVIEw1 = (ListVIEw) findVIEwByID(R.ID.ListVIEw1); StringAdapter adapter = new StringAdapter(this, R.layout.List_row); adapter.add("one"); adapter.add("two"); adapter.add("three"); adapter.add("four"); adapter.add("five"); adapter.add("six"); adapter.add("seven"); adapter.add("eight"); adapter.add("nine"); adapter.add("ten"); adapter.add("eleven"); adapter.add("twelve"); ListVIEw1.setAdapter(adapter); } private class StringAdapter extends ArrayAdapter<String>{ public StringAdapter(Context context, int textVIEwResourceID) { super(context, textVIEwResourceID); } @OverrIDe public VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final CheckedTextVIEw tv = (CheckedTextVIEw ) inflater.inflate(R.layout.List_row, parent, false); tv.setText(getItem(position)); return tv; } }}
结果是这样的,很棒(按下:蓝色,选中:绿色,否则:橙色):
但是,如果我删除了
androID:background="@drawable/selector
从List_row_xml,并通过代码应用它:
Drawable blue = getResources().getDrawable(R.drawable.blue); Drawable green = getResources().getDrawable(R.drawable.green); Drawable orange = getResources().getDrawable(R.drawable.orange); selector = new StateListDrawable(); selector.addState(new int[] { androID.R.attr.state_pressed }, blue); selector.addState(new int[] { androID.R.attr.state_checked }, green); selector.addState(new int[] { }, orange); tv.setBackgroundDrawable(selector);
我得到以下内容(一切都得到state_pressed可绘制的蓝色):
什么地方出了错?我很确定我将选择器正确地转换为代码.
解决方法:
我复制了您的代码,一切正常.
不过,您应该确保在getVIEw()中创建选择器的新实例.否则,如果对所有项目使用相同的选择器,则按一个项目将影响所有项目.
这是您的getVIEw()方法的外观
@OverrIDe public VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) { LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final CheckedTextVIEw tv = (CheckedTextVIEw) inflater.inflate(R.layout.List_row, parent, false); tv.setText(getItem(position)); Drawable blue = getResources().getDrawable(R.drawable.blue); Drawable green = getResources().getDrawable(R.drawable.green); Drawable orange = getResources().getDrawable(R.drawable.orange); selector = new StateListDrawable(); selector.addState(new int[] { androID.R.attr.state_pressed }, blue); selector.addState(new int[] { androID.R.attr.state_checked }, green); selector.addState(new int[] {}, orange); tv.setBackgroundDrawable(selector); return tv; }
当然,您可以进行一些优化,但这将起作用.
总结以上是内存溢出为你收集整理的android-从代码而不是从xml创建选择器时出现意外结果全部内容,希望文章能够帮你解决android-从代码而不是从xml创建选择器时出现意外结果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)