android-从代码而不是从xml创建选择器时出现意外结果

android-从代码而不是从xml创建选择器时出现意外结果,第1张

概述我在将一些有效的XML文件转换为代码时遇到麻烦.我有一个ListView,并且我需要能够在运行时从高级资源中未知的资源中切换其按下/选中的可绘制对象(因此为什么不使用XML);以下配置非常有效:main.xml:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://s

我在将一些有效的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创建选择器时出现意外结果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1210887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存