我有一个LinearLayout
样式类似于的样式button
,其中包含一些text / ImageView元素。我想使整个LinearLayout
动作像a一样button
,特别是要赋予它在a中定义的状态,以便在按下时具有不同的背景。
有没有比ImageButton
确定整个Layout的大小和绝对定位更好的方法?
LinearLayout
例如ToggleButton
我有一个LinearLayout
样式类似于的样式button
,其中包含一些text / ImageView元素。我想使整个LinearLayout
动作像a一样button
,特别是要赋予它在a中定义的状态,以便在按下时具有不同的背景。
有没有比ImageButton
确定整个Layout的大小和绝对定位更好的方法?
LinearLayout
例如ToggleButton
Answers:
我刚才遇到了这个问题。您必须将LinearLayout设置为clickable。您可以在XML中使用
android:clickable="true"
或在代码中
yourLinearLayout.setClickable(true);
干杯!
android:clickable="false"
以防止其阻止点击事件。
如果要添加Android默认背景行为以使Layout
行为类似“ clikable” View
,请针对Layout
:
android:background="?android:attr/selectableItemBackground"
android:background="?attr/selectableItemBackground"
android:background="@android:drawable/list_selector_background"
上面的答案仍然是正确的,但仅添加默认的按下和释放的UI状态(例如在a ListView
中)并没有帮助我。
首先,您需要一个选择器来定义不同的状态。例如,在XML文件中:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_pressed"
android:state_pressed="true" />
<item android:drawable="@drawable/button_focused"
android:state_focused="true" />
<item android:drawable="@drawable/button_normal" />
</selector>
我没有尝试过,但是您可以将LinearLayout的android:background设置为此选择器,并将android:clickable设置为true即可使用。
如果不是,则可以切换为使用RelativeLayout,并使第一个元素成为一个按钮,以该选择器为背景,并以fill_parent作为其布局的宽度和高度。在这种情况下,只需使用常规Button并将android:background设置为选择器即可。您不必在按钮上输入文字。
Button
。您可以重写onDraw(Canvas)
以执行所需的任何特殊操作(即在按钮内绘制图像或文本)。
在应用程序中,我需要动态创建LinearLayout。在这种情况下,命令
ll.setClickable(true);
无法正常工作。尽管我可能会错过一些东西,但是我设法利用setOnTouchListener来获得相同的结果,并在有人有相同需求的情况下提交了代码。
下面的代码创建一个带有两个textview和圆角的LinearLayout,按下时会更改颜色。
首先,在drawable文件夹中创建两个xml文件,一个用于普通文件,另一个用于按线性布局状态。
正常状态xml(drawable / rounded_edges_normal.xml)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFFFFF" />
<corners android:radius="7dp" />
<padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
</shape>
</item>
<item android:bottom="3px">
<shape android:shape="rectangle">
<solid android:color="#F1F1F1" />
<corners android:radius="7dp" />
</shape>
</item>
</layer-list>
按下状态xml(drawable / rounded_edges_pressed.xml)。唯一的区别是颜色...
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFFFFF" />
<corners android:radius="7dp" />
<padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
</shape>
</item>
<item android:bottom="3px">
<shape android:shape="rectangle">
<solid android:color="#add8e6" />
<corners android:radius="7dp" />
</shape>
</item>
</layer-list>
然后下面的代码完成工作
全局变量:
public int layoutpressed = -1;
在onCreate()
:
// Create some textviews to put into the linear layout...
TextView tv1 = new TextView(this);
TextView tv2 = new TextView(this);
tv1.setText("First Line");
tv2.setText("Second Line");
// LinearLayout definition and some layout properties...
final LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);
// it is supposed that the linear layout will be in a table.
// if this is not the case for you change next line appropriately...
ll.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
ll.setBackgroundResource(R.drawable.rounded_edges_normal);
ll.addView(tv1);
ll.addView(tv2);
ll.setPadding(10, 10, 10, 10);
// Now define the three button cases
ll.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction()==MotionEvent.ACTION_DOWN){
ll.setBackgroundResource(R.drawable.rounded_edges_pressed);
ll.setPadding(10, 10, 10, 10);
layoutpressed = arg0.getId();
}
else if (arg1.getAction()== MotionEvent.ACTION_UP){
ll.setBackgroundResource(R.drawable.rounded_edges_normal);
ll.setPadding(10, 10, 10, 10);
if(layoutpressed == arg0.getId()){
// ...........................................................................
// Code to execute when LinearLayout is pressed...
// ...........................................................................
}
}
else{
ll.setBackgroundResource(R.drawable.rounded_edges_showtmimata);
ll.setPadding(10, 10, 10, 10);
layoutpressed = -1;
}
return true;
}
});
只需将背景attr / selectableItemBackground添加到线性布局,并使该linearlayout可点击
例如:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linear1"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">
这使得linearlayout在按下时就像按钮一样。:)
这很有用,但是如果您要设置背景色并使线性布局像列表项一样可单击。将背景设置为您喜欢的颜色,并将前景色设置为?android:attr / selectableItemBackground,设置focusable true和clickable true
样例代码
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:background="#FF0"
android:orientation="horizontal"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:onClick="onClickMethod"
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
/>