Java 单击按钮的上半部分-不';不行?

Java 单击按钮的上半部分-不';不行?,java,android,Java,Android,我有4个相对布局:(正如你在动画中看到的) 绿色相对论 “键入内容和图标”相对视图 灰色相对论 底部文本视图 每个RelativeView都位于它以前的相对视图的“下方” 根据设计,当两个内部视图关闭时,按钮应位于绿色上方的半顶部,文本上方的半底部(如动画所示) 好的,我添加了一个按钮,它位于“底部文本视图”中 但为了使底部仅位于视图上方的半底部,我添加了一个负边距: 因此,无负边际: 并且具有负的裕度(期望的结果) 因此,当我单击按钮时,我只需隐藏/显示(+animation wit

我有4个相对布局:(正如你在动画中看到的)

  • 绿色相对论
  • “键入内容和图标”相对视图
  • 灰色相对论
  • 底部文本视图
每个RelativeView都位于它以前的相对视图的“下方”

根据设计,当两个内部视图关闭时,按钮应位于绿色上方的顶部,文本上方的底部(如动画所示)

好的,我添加了一个按钮,它位于“底部文本视图”中

但为了使底部仅位于视图上方的半底部,我添加了一个负边距:

因此,负边际:

并且具有负的裕度(期望的结果)

因此,当我单击按钮时,我只需隐藏/显示(+animation with
android:animateLayoutChanges=“true”
)内部的两个中间视图

那么问题出在哪里呢

问题

我不知道为什么,但只有下半部分的按钮是可点击的!我猜这是因为一半在它的容器视图中,而上半部分不在它的视图中…(也许我错了)

但是如果我去掉了负边距,并且按钮完全在它的容器中,那么按钮是100%完全可点击的(上半部分和下半部分)

正如您在动画(最后一帧)中所看到的,当我单击上半部分时,什么也没有发生

我怎样才能解决这个问题

也许我采取了错误的初始方法

注::


您的按钮属于底部RL。当android路由动作时,它会检查布局的边界,并将事件提供给内部有事件坐标的viewgrops(VG)。然后VG根据它的坐标将事件与它的子事件成比例

所以,当你们点击按钮触摸事件的上半部分时,灰色RL和蓝色RL的按钮并没有得到它。实际上,事件被赋予了窗口->根视图组->其他一些视图组->视图。路由是基于坐标的。这对于启动触摸的ACTION_DOWN是正确的,但并非所有MotionEvent都以这种方式处理


作为一种解决方案,您可以将按钮移动到另一个可以正确路由触摸事件的groupview。或者可以尝试使用触摸代理。

将您的按钮作为亲戚的兄弟,而不是孩子。这是你想要的

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true">![enter image description here][1]

    <RelativeLayout
        android:id="@+id/red"
        android:background="@android:color/holo_red_dark"
        android:layout_width="match_parent"
        android:layout_height="100dp">

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/green"
        android:layout_below="@id/red"
        android:background="@android:color/holo_green_dark"
        android:layout_width="match_parent"
        android:layout_height="100dp">

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/blue"
        android:background="@android:color/holo_blue_dark"
        android:layout_below="@id/green"
        android:layout_width="match_parent"
        android:layout_height="100dp">

    </RelativeLayout>

    <Button
        android:id="@+id/button"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/green"
        android:layout_width="wrap_content"
        android:text="Hide Green"
        android:layout_marginTop="-24dp"
        android:layout_height="wrap_content"/>

</RelativeLayout>
![在此处输入图像描述][1]
看起来是这样的,当setVisibility在绿色RelativeLayout的GONE/VISIBLE之间切换时,按钮上下移动


你试过翻译而不是页边空白吗?@IT20请再帮我一点忙?(可能是代码)?我一整天都在工作-(试着用
android:translationY=-32dp
@iTwenty测试替换按钮xml中的
android:layout\u marginTop=-32dp
,同样的结果:上半部分不可点击。也许,你想看看新的浮动操作按钮(FAB):我决定使用你的解决方案。效果很好(按钮没有移动,但我要修复它)-所以这里有一个问题:如果我有一个视图,我如何才能找到它底部的偏移量?(换句话说,在它们全部折叠之后-我需要将按钮“带”到第一个视图的底部)--
视图
类有
getTop()
getBottom
是相对于父视图组
的。对于不移动的按钮,如果您可以指定它相对于正在设置动画的视图的位置,您可以让它移动,而无需任何额外的努力。在我的示例中,如果我设置绿色
RelativeLayout
的动画,则
按钮也会随着它的移动而移动下面是
layout\u=@id/green
明白了!工作!我将按钮设置为
\u安卓:layout\u=“@id/viewGray1”\u
(视图灰色是分隔符,正如您已经知道的)带有负margniTop(当然,现在按钮是一个兄弟,就像您在回答中所说的那样)现在它运行得很好。非常感谢你让它工作起来了!:)顺便说一句,你是如何在你的问题中制作动画截图的?关于解决方案:现在我有另一个问题。我做的和你做的完全一样(我只是隐藏了内部的两个视图)这一切都很好。但当按钮折叠时,请看它的上半部分,它会随着灰色视图而褪色……请帮助:-)?-看这里(我怎样才能使上半部分不褪色?)