是否可以将ViewGroups项目放在ViewGroups兄弟姐妹面前?

时间:2013-07-09 13:48:04

标签: android foreground viewgroup siblings

我不确定我的问题是否可以理解。我的布局中有ImageViewGroupViewGroupGridView相当,我有物品,我可以拖放。 现在我有兴趣将ViewGroup的项目拖到图像上,但每次尝试时,项目似乎都有较低的z-index,因为图像后面会消失。

我已尝试在bringToFront及其项目上使用ViewGroup的组合,但没有任何效果。现在我的问题是,是否有可能将viewgroups项目放在viewgroups兄弟姐妹面前。有没有人有这方面的经验?

我的xml看起来像这样,其中GridView是我的Viewgroup ...图像的图像资源和可见性在代码中设置:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relative_gridview_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="@string/tag_fragment_GridView"
android:background="#FFF"
android:orientation="vertical" >

<ImageView
    android:id="@+id/img"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:visibility="gone" />


<de.test.GridView
    android:id="@+id/grid_view1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/img"
    android:background="#FFF"
    android:gravity="center"
    android:numColumns="auto_fit"
    android:stretchMode="none"
    android:tag="grid_view_tag" >
</de.test.GridView>

编辑: 我使用BaseAdapter来显示布局,因为我有一个动态数量的页面,可以使用这个库https://github.com/openaphid/android-flip翻转。

我创建的布局如下:

public View loadView(final View view, final int position) {

    final GridView dgv = (GridView) view
            .findViewById(R.id.grid_view1);


    dgv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(android.widget.AdapterView<?> arg0, View v,
                int position, long arg3) {

            // Simple click listener for the items...



        }
    });

    dgv.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT < 16) {
                        dgv.getViewTreeObserver()
                                .removeGlobalOnLayoutListener(this);
                    } else {
                        dgv.getViewTreeObserver()
                                .removeOnGlobalLayoutListener(this);
                    }

                    int displayHeight = view.getHeight();
                    int displayWidth = view.getWidth();


                        dgv.initChilds(displayWidth, displayHeight,
                                2,
                                2);
                    } else {
                        mImage = (ImageView) view
                                .findViewById(R.id.img);
                        mImage.getLayoutParams().height = displayHeight / 2;

                        mImage.setImageResource(R.drawable.bild);


                        dgv.initChilds(displayWidth,
                                displayHeight / 2, 2,
                                2);
                    }

                    updateGridView();
                }

            });

    mList.add(view);

    return view;
}

initChilds() - 方法确定视图组的每个项目的大小。当longclick选择时,我想将viewgroup项设置为前面。 longclicklistener看起来像这样:

@Override
public boolean onLongClick(View view) {

    draggedItem = getDraggedView(); draggedItem.bringToFront();
    callback.bringGridToFront();            

    return true;
}

我尝试将项目放到这样的前面,但它不起作用...回调变量是baseadapter类的一个实例,它调用了bringGridToFront() - Method,它当前执行以下代码:

public void bringGridToFront() {
    View view = mList.get(mCurrentPage);
    RelativeLayout rl = (RelativeLayout) view.findViewById(R.id.relative_gridview_layout);
    GridView dgv = (GridView) view.findViewById(R.id.grid_view1);       
    rl.bringChildToFront(dgv);
}

3 个答案:

答案 0 :(得分:1)

Android根据视图在布局树表中的位置管理z-index。具有最大指数的观点在其他观点之上。在您的布局中,您的自定义网格位于其他网格之上,因为它是布局中的最后一个视图,因此它获得了最大的索引。

在您的代码中,我可以看到您正在调用

draggedItem = getDraggedView();
在onLongClick(视图视图)事件中

。 getDraggedView()可能会返回一个视图,这是您正在拖动的视图,它不会显示在顶部(这只是猜测,因为您没有发布getDraggedView()代码)。如果是这种情况,您需要知道拖动视图的父级,例如,如果父级是主窗口,那么整个布局将位于其顶部。因此,我最好的猜测是在您的布局中添加拖动的视图,因为它将是最后一个视图,它将位于顶部。

此外,我注意到你正在打电话

mImage.getLayoutParams().height = displayHeight / 2;
在图像视图中

以更改其高度。我不认为这是正确的方法,因为如果看看第10130行的View的源代码here,其中setLayoutParams代码你将看到除了一组之外还发生了其他一些事情。 layoutparams。但是我不知道这是否与你的问题有关。

我知道我的答案更多的是猜测而不是完整的答案,但根据问题的数据,这是我能做的最好的。

希望这会有所帮助......

答案 1 :(得分:0)

感谢所有帮助。最后,bringToFront() - Method似乎对我不起作用。现在我可以通过使用getChildDrawingOrder() - 从ViewGroups重写的方法来解决我的问题。

使用此方法,您可以更改子项的绘制顺序,因此最后绘制要放在所有其他项目上方的项目。 一个例子:

@Override
public int getChildDrawingOrder(int childCount, int i) {
    if(mDragged != -1) {

        if(i == mDragged) {
            return childCount-1;
        }
        else if(i == (childCount - 1)) {
            return mDragged;
        }       
        else {
            return i;
        }
    }

    return i;
}

mDragged是应放在前面的变量。所以我用最后一个改变了这个变量的绘图位置...希望对有同样问题的人有所帮助:D

答案 2 :(得分:0)

我尝试了接受的答案,但是只要没有显示儿童观点,就会一直崩溃。问题是参数childCounti引用了可见子项,而不是整个子项列表。 该解决方案以该答案为基础,并将此调整结合到索引中。

@Override
public int getChildDrawingOrder(int childCount, int i) {
   int firstVisiblePosition = getFirstVisiblePosition();
   if (mDragged < firstVisiblePosition || mDragged > getLastVisiblePosition())
      return super.getChildDrawingOrder(childCount, i);
   int adjustedDragged = mDragged - firstVisiblePosition;
   if (i == adjustedDragged)
       return childCount - 1;
   if (i == (childCount - 1))
      return adjustedDragged;
   return i;
}