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