使LinearLayout像Button一样

时间:2011-04-05 02:26:10

标签: android android-layout

我有LinearLayout我的样式看起来像button,它包含一些text / ImageView元素。我想让整个LinearLayout行为像button,特别是给它一些在a中定义的状态,因此它在按下时会有不同的背景。

有没有比制作ImageButton整个布局大小和绝对定位更好的方法?

10 个答案:

答案 0 :(得分:155)

如果您想要添加Android默认后台行为,以使Layout行为像“可克隆”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中)。

答案 1 :(得分:148)

我刚才遇到了这个问题。您必须将LinearLayout设置为可单击。您可以使用

在XML中执行此操作
android:clickable="true"

或使用

代码
yourLinearLayout.setClickable(true);

干杯!

答案 2 :(得分:13)

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

的LinearLayout

observeEvent(input$remove_child,{
    if(input$Name_to_remove!=""){
      FindNode(node=vv$org,name = input$Parent_name_remove)$RemoveChild(input$Name_to_remove)
      #re-generate chart
      output$xx=renderGrViz({

        grViz(DiagrammeR::generate_dot(ToDiagrammeRGraph(vv$org)),engine = "dot")
      })
    }
  })

答案 3 :(得分:9)

首先,您需要一个选择器来定义不同的状态。例如,在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设置为您的选择器。您不必在按钮上放置文字。

答案 4 :(得分:7)

在我正在工作的应用程序中,我需要动态创建LinearLayout。在这种情况下命令

ll.setClickable(true);

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

以下代码创建一个LinearLayout,其中包含两个textview和圆角,按下时会更改颜色。

首先,在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;
                }
  });           

答案 5 :(得分:5)

只需设置这些属性

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

答案 6 :(得分:2)

只需将背景attr / selectableItemBackground添加到线性布局 并使线性布局可点击

示例:

<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">

按下时,线性布局就像按钮一样。 :)

答案 7 :(得分:1)

这很有用,但是如果您要设置背景色并使线性布局像列表项一样可单击。设置具有您喜欢的颜色的背景,并将前景色设置为?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"
        />

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

只需使用此:

android:foreground="?attr/selectableItemBackground"