单击自定义LinearLayout中包含的按钮时出现意外行为

时间:2011-04-06 13:39:48

标签: android button android-linearlayout

我在为应用程序创建自定义LinearLayout时遇到问题。基本上,LinearLayout包含项目,每个项目都是一个水平的LinearLayout,其中包含TextView和Button。正确填充LinearLayout,但是,当我按下按钮(其背景为自定义背景:选择器)时,会发生意外行为。发生的事情是按钮更改仅在LinearLayout的最后一个元素上出现,这没有任何意义。

填充LinearLayout的代码如下:

View template = null;

    if (items.size() > 0) {

        for (int i = 0; i < items.size(); i++) {

            template = inflate(getContext(), R.layout.views_custom_list_item, null);
            template.setBackgroundDrawable(getProperBackgroundDrawable(i, items.size() - 1));

            TextView text = (TextView)template.findViewById(R.id.custom_list_text);
            text.setText(items.get(i));

            Button button = (Button)template.findViewById(R.id.custom_list_button);
            button.setId(i);
            button.setBackgroundDrawable(backgroundButton);

            button.setOnClickListener(callListener);

            addView(template);
            template = null;
        }

    }

我正在膨胀包含每个项目布局的XML,然后我相应地设置属性。所有代码都包含在继承自LinearLayout的自定义类中。你知道问题出在哪里吗?感谢

这是我的观点,

enter image description here

我所要求的是什么项目并不重要,

enter image description here

这是项目XML:

`

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:id="@+id/custom_list_text"
    android:textSize="15sp" 
    android:textColor="@color/black" 
    android:paddingLeft="5dip" android:paddingRight="5dip" 
    android:layout_weight="1" 
    android:gravity="left" />

<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:id="@+id/custom_list_button"/>

`

主要布局上的XML:

<com.example.views.CustomLayoutView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/custom_phone_directory" android:layout_margin="5dip" xx:background_single="@drawable/button_complete" xx:background_top="@drawable/button_top" xx:background_middle="@drawable/button_middle" xx:background_bottom="@drawable/button_bottom" xx:button_background="@drawable/button_phone_selector" /> </LinearLayout>

3 个答案:

答案 0 :(得分:1)

答案是我不能在列表中重用可绘制对象。我需要为每个按钮创建一个drawable,以解决问题。感谢raukodraug的所有支持,以及向我提出一些问题的其他人。

答案 1 :(得分:0)

为什么不尝试在循环中定义template

if (items.size() > 0) {

        for (int i = 0; i < items.size(); i++) {

            View template = inflate(getContext(), R.layout.views_custom_list_item, null);
            template.setBackgroundDrawable(getProperBackgroundDrawable(i, items.size() - 1));

            TextView text = (TextView)template.findViewById(R.id.custom_list_text);
            text.setText(items.get(i));

            Button button = (Button)template.findViewById(R.id.custom_list_button);
            button.setId(i);
            button.setBackgroundDrawable(backgroundButton);

            button.setOnClickListener(callListener);

            addView(template);
        }

    }

我希望这会有所帮助

修改

尝试将此选项用于您的选择器,并尝试将其添加到XML中。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Non focused state -->
    <item android:state_focused="false" 
          android:state_pressed="false" 
          android:drawable="@drawable/button_phone"" />
    <!-- Focused state -->
    <item android:state_focused="true" 
          android:state_pressed="false" 
          android:drawable="@drawable/button_phone_over" />   
    <!-- Pressed state -->
    <item android:state_pressed="true" 
          android:drawable="@drawable/button_phone_over" />
 </selector>

我感觉问题是你在代码中重复使用drawable,所以如果你没有在XML中这样做,那么为每个背景创建一个新的drawable,而不是重用它。

答案 2 :(得分:0)

我不知道这是一个错误还是一个功能,但使用以下代码可以实现类似的行为;

    Drawable d = getResources().getDrawable(R.drawable.bg);
    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    button1.setBackgroundDrawable(d);
    button2.setBackgroundDrawable(d);        

此处,按钮2被绘制为“按下”,尽管单击按钮1并且它似乎与事实相关,同样可绘制被指定为两个按钮的背景。你可以通过为每个按钮创建自己的背景Drawable来解决这个问题。