Android 是否将按钮添加到滑动抽屉手柄?

Android 是否将按钮添加到滑动抽屉手柄?,android,onclick,slidingdrawer,Android,Onclick,Slidingdrawer,我已经做了一段时间了。这个想法一开始很简单,我想要一个滑动抽屉手柄上的按钮,允许用户查看特定于抽屉内容的设置。因此,我做了一个布局,旁边有一个按钮,并将其设置为手柄。抽屉拉得很好,但不允许按(把手上的)按钮。当我试图点击物品时,点击被解释为手柄点击,并切换抽屉的状态 有人知道发生了什么事吗 感谢~Aedon您可以抑制将单击手柄按钮解释为“打开”的操作,该操作在布局XML的SlidingDrawer元素中具有一个属性。像这样: <SlidingDrawer android:layout_wi

我已经做了一段时间了。这个想法一开始很简单,我想要一个滑动抽屉手柄上的按钮,允许用户查看特定于抽屉内容的设置。因此,我做了一个布局,旁边有一个按钮,并将其设置为手柄。抽屉拉得很好,但不允许按(把手上的)按钮。当我试图点击物品时,点击被解释为手柄点击,并切换抽屉的状态

有人知道发生了什么事吗


感谢~Aedon

您可以抑制将单击手柄按钮解释为“打开”的操作,该操作在布局XML的SlidingDrawer元素中具有一个属性。像这样:

<SlidingDrawer android:layout_width="fill_parent"android:id="@+id/SlidingDrawer" android:handle="@+id/slideHandleButton"
                    android:content="@+id/txtHolder" android:layout_height="fill_parent"
                    android:orientation="horizontal" android:allowSingleTap="false">


只需创建android:allowSingleTap=“false”,然后像平常一样为按钮实现一个单击处理程序。这将阻止它打开/关闭抽屉,但您可能需要截获按钮的事件,以使其执行您希望它执行的操作。

我将发布我的实现,以避免其他人遇到麻烦

基本上,您必须扩展SlidingDrawer类并处理onInterceptTouch事件,当它们位于句柄布局中的项目顶部时,这些事件将通过

这假设您正在为控制柄使用视图组(例如,任何布局),并且控制柄内的所有视图都可以单击

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SlidingDrawer;

public class ClickableSlidingDrawer extends SlidingDrawer {

    private ViewGroup mHandleLayout;
    private final Rect mHitRect = new Rect();

    public ClickableSlidingDrawer(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ClickableSlidingDrawer(Context context, AttributeSet attrs) {
        super(context, attrs);
    }



    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        View handle = getHandle();

        if (handle instanceof ViewGroup) {
            mHandleLayout = (ViewGroup) handle;
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (mHandleLayout != null) {
            int childCount = mHandleLayout.getChildCount();
            int handleClickX = (int)(event.getX() - mHandleLayout.getX());
            int handleClickY = (int)(event.getY() - mHandleLayout.getY());

            Rect hitRect = mHitRect;

            for (int i=0;i<childCount;i++) {
                View childView = mHandleLayout.getChildAt(i);
                childView.getHitRect(hitRect);

                if (hitRect.contains(handleClickX, handleClickY)) {
                    return false;
                }
            }
        }

        return super.onInterceptTouchEvent(event);
    }
}
导入android.content.Context;
导入android.graphics.Rect;
导入android.util.AttributeSet;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.SlidingDrawer;
公共类ClickableSlidingDrawer扩展了SlidingDrawer{
私有视图组mHandleLayout;
private final Rect mHitRect=new Rect();
公共可点击滑动抽屉(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
公共可点击滑动抽屉(上下文、属性集属性){
超级(上下文,attrs);
}
@凌驾
充气时受保护的空隙(){
超级充气();
视图句柄=getHandle();
if(视图组的句柄实例){
mHandleLayout=(视图组)句柄;
}
}
@凌驾
公共布尔值onInterceptTouchEvent(MotionEvent){
if(mHandleLayout!=null){
int childCount=mHandleLayout.getChildCount();
int handleClickX=(int)(event.getX()-mHandleLayout.getX());
int handleClickY=(int)(event.getY()-mHandleLayout.getY());
Rect hitRect=mHitRect;

对于(int i=0;i我尝试了d4n3的实现,但由于我的句柄包含一个嵌套在多个
视图组中的按钮,因此我必须对其进行修改以使其正常工作

我的实现还假设您正在使用
视图组
作为句柄,但子视图不必是可单击的。此外,您必须将视图的
标记
设置为“单击截获的”您希望可以在句柄中单击。只有具有此特定标记集的子视图才会考虑在句柄中单击。这样,您可以按照自己的意愿布局句柄,并且在特定的
视图
上单击时仍能正确操作(例如,
按钮
)此外,在这个实现中,您仍然可以拖动并单击句柄来切换其状态

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SlidingDrawer;

public class ClickableSlidingDrawer extends SlidingDrawer
{
    private static final String TAG_CLICK_INTERCEPTED = "click_intercepted";

    private ViewGroup mHandleLayout;
    private final Rect mHitRect = new Rect();

    public ClickableSlidingDrawer(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ClickableSlidingDrawer(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onFinishInflate()
    {
        super.onFinishInflate();

        View handle = getHandle();

        if (handle instanceof ViewGroup)
        {
            mHandleLayout = (ViewGroup) handle;
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event)
    {
        if (mHandleLayout != null)
        {
            int clickX = (int) (event.getX() - mHandleLayout.getLeft());
            int clickY = (int) (event.getY() - mHandleLayout.getTop());

            if (isAnyClickableChildHit(mHandleLayout, clickX, clickY))
            {
                return false;
            }
        }
        return super.onInterceptTouchEvent(event);
    }

    private boolean isAnyClickableChildHit(ViewGroup viewGroup, int clickX, int clickY)
    {
        for (int i = 0; i < viewGroup.getChildCount(); i++)
        {
            View childView = viewGroup.getChildAt(i);

            if (TAG_CLICK_INTERCEPTED.equals(childView.getTag()))
            {
                childView.getHitRect(mHitRect);

                if (mHitRect.contains(clickX, clickY))
                {
                    return true;
                }
            }

            if (childView instanceof ViewGroup && isAnyClickableChildHit((ViewGroup) childView, clickX, clickY))
            {
                return true;
            }
        }
        return false;
    }
}
导入android.content.Context;
导入android.graphics.Rect;
导入android.util.AttributeSet;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.SlidingDrawer;
公共类ClickableSlidingDrawer扩展了SlidingDrawer
{
私有静态最终字符串标记\u CLICK\u INTERCEPTED=“CLICK\u INTERCEPTED”;
私有视图组mHandleLayout;
private final Rect mHitRect=new Rect();
公共可点击滑动抽屉(上下文、属性集属性)
{
超级(上下文,attrs);
}
公共可点击滑动抽屉(上下文上下文、属性集属性、int-defStyle)
{
超级(上下文、属性、定义样式);
}
@凌驾
充气时受保护的空隙()
{
超级充气();
视图句柄=getHandle();
if(视图组的句柄实例)
{
mHandleLayout=(视图组)句柄;
}
}
@凌驾
公共布尔值onInterceptTouchEvent(MotionEvent)
{
if(mHandleLayout!=null)
{
int clickX=(int)(event.getX()-mHandleLayout.getLeft());
int clickY=(int)(event.getY()-mHandleLayout.getTop());
如果(isAnyClickableChildHit(mHandleLayout,clickX,clickY))
{
返回false;
}
}
返回super.onInterceptTouchEvent(事件);
}
私有布尔值isAnyClickableChildHit(视图组视图组、int-clickX、int-clickY)
{
对于(int i=0;i
首先制作一个布局,并将句柄内容放入其中(比如放入Handle\u content.xml)

其次,将当前句柄
句柄
替换为以下内容:

<include android:id="@id/handle" 
android:layout="@layout/handle_content.xml"/>
现在定义这个,包括MYSlidingDrawer:

        MYSlidingDrawer drawer = (MYSlidingDrawer) findViewById(R.id.drawer);
        drawer.setActivity(this);
        Button btn = (Button) findViewById(R.id.play_btn);//button inside your handle
        drawer.setButton(btn);

希望这能对您有所帮助。

谢谢您的意见,我会试一试。谢谢您,先生,经过一点修补,它工作得非常完美。我想您刚刚给了我一个教训,我真的应该早点学到。
        MYSlidingDrawer drawer = (MYSlidingDrawer) findViewById(R.id.drawer);
        drawer.setActivity(this);
        Button btn = (Button) findViewById(R.id.play_btn);//button inside your handle
        drawer.setButton(btn);