我在为应用程序创建自定义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的自定义类中。你知道问题出在哪里吗?感谢
这是我的观点,
我所要求的是什么项目并不重要,
这是项目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>
答案 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来解决这个问题。