Я опробовал реализацию d4n3, но так как мой дескриптор содержит кнопку, вложенную в несколько ViewGroup
s, мне пришлось изменить ее, чтобы она работала.
Мои реализации также предполагают, что вы используете ViewGroup
для дескриптора, но дочерние представления не должны быть кликабельными. Кроме того, вы должны установить tag
на " click_intercepted " представлений, которые вы хотите, чтобы в дескрипторе было кликабельно. Только дочерние представления с этим конкретным набором тегов будут учитываться для кликов в дескрипторе. Таким образом, вы можете расположить свой дескриптор так, как вы хотите, и при этом действовать соответствующим образом при нажатии на определенные View
s (например, Button
) в дескрипторе. Кроме того, в этой реализации вы все равно можете перетащить и щелкнуть маркер, чтобы переключить его состояние.
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;
}
}