如何在Android中创建自定义容器视图?

时间:2016-04-12 05:00:36

标签: java android

我想创建一个带有侦听器的视图,它有点像容器或杂货袋。拖入其中的任何图像或文本都会被收集并保存到本地数据库中。或者更确切地说,图像名称或字符串被保存。我之前创建了自定义视图,显示了一个自定义的数据行,但我不知道如何创建一个“杂货袋”类型的视图。我搜索过谷歌创建一个带有监听器的自定义容器视图但找不到与我要查找的内容有关的任何内容。我不是要求任何人为我做这件事,只是给我一些建议或推进正确的方向。

修改 只是为了澄清一点。我已经知道如何拖放视图了。问题在于你可以放在任何地方。我想要的是一个视图,当某个东西在其边界内被删除时,它会获得视图的字符串或标记。无论可能是什么样的观点。不知何故,这个自定义视图必须知道在其边界内删除了哪种视图,并在drop上删除该视图。

2 个答案:

答案 0 :(得分:1)

   <view class="at.calista.quatscha.views.SwipebarLayout"
        android:id="@+id/sbl"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <!-- Top View -->
        <Button android:text="Top" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

        <!-- Bottom View -->
        <Button android:text="Bottom" android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

答案 1 :(得分:1)

您需要一种方法来确定两个视图是否重叠。例如,当目标视图和拖动的项目视图在同一容器视图中是2个不同的视图时,类似这些方法的东西可以起作用:

private Rect getScreenBounds(View view)
{
    int[] location = new int[2];
    view.getLocationOnScreen(location);

    return new Rect(location[0], location[1], location[0] + view.getWidth(), location[1] + view.getHeight());
}

private boolean doViewsIntersect(View dropTarget, View item)
{
    Rect dropRect = getScreenBounds(dropTarget);
    Rect itemRect = getScreenBounds(item);

    return Rect.intersects(dropRect, itemRect);
}

但是,如果被拖动的视图是容器上的子视图,并且该容器具有您想要执行拖放逻辑的特殊命中区域,那么您可以使用该命中区域的Rect作为交叉点测试

要保存有关View的信息,您可以选择以下几种方法:

  • 您可以使用view.setTag(key, object)view.getTag(key)在每件商品上存储您想要的任何信息。
  • 如果您正在为项目使用自定义类,则只需添加一个方法即可从视图类中获取数据。
  • 如果您为项目使用多个不同的类,则可以创建一个接口,并在每个可拖动的视图类上实现该接口。

在项目的发布上,您可以检查区域/视图是否相交,如果它们相交,则可以根据需要从拖动的项目中获取所需的任何信息,使用getTag或添加到的方法风景。

例如,当您收到onTouchListener事件时,可以通过MotionEvent.ACTION_UP触发此操作。以下是您可以在每个项目上添加的侦听器示例:

item.setOnTouchListener(new View.OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        if (event.getActionMasked() == MotionEvent.ACTION_UP)
        {
            if (doViewsIntesect(dropTarget, v))
            {
                Object data = v.getTag(DATA_KEY);
                //process data
                ((ViewGroup) v.getParent()).removeView(v); // to remove the item afterwards
            }
        }
        return false;
    }
});