【问题标题】:Android clickable layoutAndroid可点击布局
【发布时间】:2015-05-12 17:42:46
【问题描述】:

我有一个线性布局,我将其设置为可单击 + 焦点,但问题是单击时没有显示焦点。我怎样才能让焦点显示出来。

这是我的代码

<LinearLayout
  android:id="@+id/linear_tv_layout"
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_weight="1"
  android:clickable="true"
  android:focusable="true"
  android:paddingBottom="7px">

【问题讨论】:

  • 你想显示什么样的焦点?我认为线性布局在获得焦点时不会显示任何内容。
  • 我只想在触摸屏幕上的布局后突出显示它,就像一个按钮表明它已被点击
  • 如果有人想获得完整的解决方案,请查看此存储库:github.com/shamanland/AndroidLayoutSelector 有自定义可点击/可检查 LinearLayout 就像 ToggleButton

标签: android android-layout event-handling click


【解决方案1】:

要将material design's button press animation 应用于任何元素,请将元素的android 背景属性设置为:

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

在你的情况下:

<LinearLayout
  android:id="@+id/linear_tv_layout"
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_weight="1"
  android:clickable="true"
  android:focusable="true"
  android:paddingBottom="7px"
  android:background="?android:attr/selectableItemBackground">

【讨论】:

  • 好答案。但是,如果您的项目以低于 11 的 API 级别为目标,则必须将属性更改为“?attr/selectableItemBackground”。
  • 谢谢。这也非常有用和简单
  • 如何在添加自定义颜色背景的同时仍然保持材料设计动画?
【解决方案2】:

我认为您需要将可点击视图(布局)设置为背景 state list drawable ,它是一个可绘制资源,您可以为不同的状态或状态组合指定不同的可绘制资源,一个用于选择,一个用于压力等等。此外,布局的状态会传播到其所有子级。


澄清 - 这是之前链接文档中的示例:

res/drawable/button.xml :(这是可绘制的状态列表)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/button_pressed" /> <!-- pressed -->
    <item android:state_focused="true"
          android:drawable="@drawable/button_focused" /> <!-- focused -->
    <item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>

button_pressedbutton_focusedbutton_normal 是代表处于这些状态的按钮的普通可绘制对象,可能是 png 的(按下时可以插入,焦点以橙色突出显示)。

如果您将此资源设置为“线性布局按钮”的背景:

<LinearLayout
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button">
    ...
</LinearLayout>

现在聚焦布局会自动将其背景图像设置为@drawable/button_focused,依此类推。

当然,你使用的所有drawables必须已经是res/drawable/中的资源,连同button.xml

【讨论】:

  • 我对状态列表有点困惑,我是否必须更改我使用的所有线性布局,或者只是为了我选择的那些
  • @M2Gd 您可以通过将状态列表设置为背景来选择哪些线性布局将像按钮一样工作。
  • 我不太明白可绘制的状态列表是什么,我是 android 新手...我只想在按下状态为真时改变背景颜色
  • @M2Gd 我添加了一些解释 - 哦,每个状态的可绘制对象也可以只是颜色,例如:android:drawable="#FF4422" - 见developer.android.com/guide/topics/resources/…
  • 我试过了,并在该选项卡中收到错误消息。这是我的 xml 提前感谢
【解决方案3】:

@danLeon: 代替 android:background="@android:drawable/btn_default"

你应该使用
android:background="@android:drawable/list_selector_background"

former 也会修改 UI,这不是必需的。

【讨论】:

    【解决方案4】:

    尝试在代码中将该布局置于最前面:

    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
    
        View mainView = this.findViewById(R.id.mainView);
        this.setContentView(mainView);
    
        LinearLayout linear_tv_layout = (LinearLayout)mainView.findViewById(R.id.linear_tv_layout);
        linear_tv_layout.bringToFront();
        // or: mainView.bringChildToFront(linear_tv_layout);
    }
    

    如果这不起作用,请检查是否有一个或多个视图重叠在该 LinearLayout 上。

    【讨论】:

      【解决方案5】:

      这里有一个示例布局,可能会给你一些想法:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      >
      <LinearLayout
        android:background="@android:drawable/btn_default"
        android:clickable="true"
        android:focusable="true"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        >
      
        <ImageView
          android:id="@+id/image"
          android:src="@android:drawable/star_big_on"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          />
      
      </LinearLayout>
      
      <LinearLayout
        android:background="@android:drawable/btn_default"
        android:clickable="true"
        android:focusable="true"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        >
      
        <ImageView
          android:id="@+id/image"
          android:src="@android:drawable/star_big_on"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          />
      
      </LinearLayout>
      </LinearLayout>
      

      【讨论】:

      • 我试过了,现在我在该选项卡中出现错误。这就是我在我的 drable xml schemas.android.com/apk/res/android"> 你能告诉我你的 btn_default xml
      【解决方案6】:

      一个简单的方法是设置这个属性:android:background="@android:drawable/btn_default"

      <LinearLayout
        android:id="@+id/linear_tv_layout"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:clickable="true"
        android:focusable="true"
        android:paddingBottom="7px"
        android:background="@android:drawable/btn_default"
        >
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        相关资源
        最近更新 更多