繁体   English   中英

Android-在片段中检索和使用视图位置

[英]Android - Retrieve and use views position in fragment

我有一个带有4个按钮的片段。 我想将每个按钮在屏幕上的位置保存在哈希图中(每个按钮将映射到其在屏幕上的位置)。 最简单的方法是什么? 在使用片段之前,我使用了onWindowFocusChanged方法(在Activity中),可以在其中检索按钮位置。 对于片段,我尝试使用ViewTreeObserver(与GlobalLayoutListener一起使用)。 在匿名类内部,我可以检索并保存(在实例变量中)按钮的位置,但是在其外部,这些值都消失了(等于0)。 如何做呢?

谢谢!

编辑:添加了一个代码段-

public void getViewsPosition(final ArrayList<View> viewArr) {
    for (final View v : viewArr) {
        final ViewTreeObserver vto = v.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int[] i = new int[2];
                v.getLocationOnScreen(i);
                _rect = new Rect(i[0], i[1], i[0] + v.getWidth(), i[1]
                        + v.getHeight());
                view_to_rect.put(v, _rect);
                if (Build.VERSION.SDK_INT < 16) {
                    vto.removeGlobalOnLayoutListener(this);
                } else {
                    vto.removeOnGlobalLayoutListener(this);
                }
            }
        });
    }
    Log.i(TAG, "size of view to rect = " + String.valueOf(view_to_rect.size()));
}

其中viewArr是此布局中我所有视图的arrayList; view_to_rect是一个实例变量,声明为:

私人静态地图view_to_rect = new HashMap();

日志始终显示“ rect的视图大小= 0”。

附加了onViewCreated的实现:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Log.i(TAG, "onViewCreated");
    final ViewGroup _mainView = (ViewGroup) getView().findViewById(
            R.id.fragment01);
    getAllViews(viewsList, _mainView);
    Log.i(TAG, "size of view list = " + String.valueOf(viewsList.size()));
    getViewsPosition(viewsList);
}

从哪里调用getViewsPosition。

编辑#2:我将尝试阐明我的意图。 我正在用片段构建应用程序。 假设每个片段都有4个按钮。 我希望这些按钮能够监听触摸事件,以便用户触摸一个按钮并将其手指移至另一个按钮(无需抬起手指)时,将会收到该按钮名称的音频反馈。 为此,我需要拥有所有按钮的位置,以便能够识别从一个按钮到另一个按钮的移动(在onTouch方法中)。 为此,我需要一个实例变量,该变量将在屏幕上保留所有按钮的位置,并且可以在onTouch中使用它。 您建议的解决方案无法解决问题,因为

public void getViewsPosition(final ArrayList viewArr)

view_to_rect的大小仍为0。

编辑#3:

这是我尝试构建集合的过程:

1)类签名+集合和数组定义:

public class Fragment01 extends Fragment implements OnTouchListener,
    OnClickListener{
        private Map<View, Rect> view_to_rect = new HashMap<View, Rect>();
        ArrayList<View> viewsList = new ArrayList<View>();

2)onViewCreated实现:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Log.i(TAG, "onViewCreated");
    final ViewGroup _mainView = (ViewGroup) getView().findViewById(
            R.id.fragment01);
    getAllViews(viewsList, _mainView);
    Log.i(TAG, "size of view list = " + String.valueOf(viewsList.size()));
    getViewsPosition(viewsList);
    Log.i(TAG, "size of view to rect = " + String.valueOf(view_to_rect.size()));
}

3)getViewsPosition(...)和onPositioUpdate()方法-

public void getViewsPosition(final ArrayList<View> viewArr) {
    for (final View v : viewArr) {
        final ViewTreeObserver vto = v.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                int[] i = new int[2];
                v.getLocationOnScreen(i);
                _rect = new Rect(i[0], i[1], i[0] + v.getWidth(), i[1]
                        + v.getHeight());
                if (Build.VERSION.SDK_INT < 16) {
                    vto.removeGlobalOnLayoutListener(this);
                } else {
                    vto.removeOnGlobalLayoutListener(this);
                }

                onPositionUpdate();
            }
        });
    }
}

private void onPositionUpdate() {
}

第一个登录onViewCreated(...)是“视图列表的大小= 7”。

我的问题是如何获取第二个日志打印出来的“ rect的视图大小= 7”? 它总是返回0。

我可能不是很了解如何通过onPositionUpdate()方法使用您的解决方案。 如何实现我的目标?

仅当呈现视图时,才会通知ViewTreeObserver,这是什么意思

“但除此之外,这些价值已经消失了”

您可以仅获取GlobalLayoutListener回调中按钮的位置,然后将其保存到实例中。 请记住,您只能在渲染位置上获得位置。

提醒:

把这个代码

Log.i(TAG,“ rect的视图大小=” + String.valueOf(view_to_rect.size()));

在public void onGlobalLayout(){}中,那么您将获得非零值。

为什么:

仅调用onGlobalLayout方法,您可以获取非零值。

         public void onGlobalLayout() {
                int[] i = new int[2];
                v.getLocationOnScreen(i);
                _rect = new Rect(i[0], i[1], i[0] + v.getWidth(), i[1]
                        + v.getHeight());
                view_to_rect.put(v, _rect);
                if (Build.VERSION.SDK_INT < 16) {
                    vto.removeGlobalOnLayoutListener(this);
                } else {
                    vto.removeOnGlobalLayoutListener(this);
                }

                onPositionUpdate();

            }

private void onPositionUpdate()
{
    //do your work with positions
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM