Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从代码而不是xml创建选择器时出现意外结果_Android_Listview_Android Xml_Statelistdrawable - Fatal编程技术网

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

Android 从代码而不是xml创建选择器时出现意外结果,android,listview,android-xml,statelistdrawable,Android,Listview,Android Xml,Statelistdrawable,我在将一些工作XML文件转换为代码时遇到一些问题。 我有一个ListView,我需要能够在运行时从advanced中未知的资源(因此为什么不使用XML)切换其按下/选中的可绘制内容 以下配置非常有效: main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout

我在将一些工作XML文件转换为代码时遇到一些问题。 我有一个ListView,我需要能够在运行时从advanced中未知的资源(因此为什么不使用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,并通过代码应用它:

    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);
我得到以下信息(所有内容都是可绘制的状态,蓝色):


出了什么问题?我很确定我将选择器转换成了正确的代码。

我复制了您的代码,一切正常。 您应该确保在
getView()
中创建一个新的
selector
实例。否则,如果对所有项目使用相同的
选择器
,则按一个项目将影响所有项目

下面是您的
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;
    }

当然,您可以进行一些优化,但这会起作用。

哇!谢谢,很好用!虽然我不明白为什么……你能解释一下吗?:)我猜您在onCreate方法中添加了最后一块代码,因此只实例化了一次
StateListDrawable选择器。如果在
getView()
中,则执行
tv.setBackgroundDrawable(选择器)
这将向所有文本视图添加完全相同的
StateListDrawable
。更改一个视图的状态也会更新所有其他视图的状态。顺便说一句。我不确定我的解释是否100%正确。但我也遇到过类似的问题,并且总是通过在getView()中创建新实例来解决这些问题。好吧,这在某种程度上是有意义的:)
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
    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);
    @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;
    }