使LinearLayout的行为像一个button

我有一个LinearLayout,我已经风格看起来像一个button,它包含几个文本/ ImageView元素。 我想使整个LinearLayout像一个button,特别是给它定义的状态,所以它有一个不同的背景时,它被按下。

有没有更好的办法比完整的布局和定位绝对的大小ImageButton?

我刚才遇到这个问题。 您必须将LinearLayout设置为可点击。 你可以用XML来做这个

 android:clickable="true" 

或者在代码中

 yourLinearLayout.setClickable(true); 

干杯!

如果你想添加Android的默认背景行为,使一个Layout行为像一个“clikable” View ,设置目标Layout

API 11+(纯Android):

 android:background="?android:attr/selectableItemBackground" 

API 7+(Android + AppCompat支持库):

 android:background="?attr/selectableItemBackground" 

任何API:

 android:background="@android:drawable/list_selector_background" 

上面的答案仍然是真实的,但没有帮助我只是添加默认的按下和释放的UI状态(例如在一个ListView中)。

首先你需要一个select器来定义不同的状态。 例如,在一个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到这个select器,并设置android:clickable为true,它会工作。

如果没有,你可以切换到使用RelativeLayout,并使第一个元素为这个select器作为背景,fill_parent作为它的布局宽度和高度。 在这种情况下,只需使用常规Button并将android:background设置为select器。 你不必把文字放在你的button上。

只需设置这些属性

 <LinearLayout ... android:background="@android:drawable/btn_default" android:clickable="true" android:focusable="true" android:onClick="onClick" > ... </LinearLayout> 

在我正在工作的应用程序中,我需要dynamic创build一个LinearLayout。 在这种情况下,命令

 ll.setClickable(true); 

没有按照应有的工作。 虽然我可能会错过一些东西,但是我设法利用setOnTouchListener来获得相同的结果,并且我提交代码以防万一有相同的需求。

以下代码创build一个带有两个文本视图和圆angular的LinearLayout,在按下时更改颜色。

首先,在可绘制文件夹中创build两个xml文件,一个用于正常,另一个用于按下linearlayout状态。

正常状态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> 

然后下面的代码完成这项工作

全局variables:

 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; } }); 

我用了第一个和第二个答案。 但我的linearlayout有图像和背景颜色的文字,所以我不得不将“背景”更改为“前景”

的LinearLayout

 android:foreground="?android:attr/selectableItemBackground" android:clickable="true" 

以前的aswers是关于如何在xml文件中设置默认的背景。 这里同样的代码:

 linearLayout1.setBackgroundResource(android.R.drawable.list_selector_background);