gpt4 book ai didi

java - Android - 检索和使用 fragment 中的 View 位置

转载 作者:行者123 更新时间:2023-12-01 14:14:25 26 4
gpt4 key购买 nike

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

谢谢!

编辑:添加了代码 fragment -

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 是此布局中所有 View 的数组列表; view_to_rect 是一个实例变量,声明为:

私有(private)静态Map view_to_rect = new HashMap();

日志始终显示“矩形 View 大小 = 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:我会尽力澄清我的 Intent 。我正在用 fragment 构建应用程序。假设每个 fragment 都有 4 个按钮。我希望这些按钮能够监听触摸事件,以便当用户触摸一个按钮并将手指移动到另一个按钮(不抬起手指)时,将会有该按钮名称的音频反馈。为此,我需要拥有所有按钮的位置,以便能够识别从一个按钮移动到另一个按钮(在 onTouch 方法中)。为此,我需要一个实例变量,它将保留屏幕上所有按钮的位置,并且我将能够在 onTouch 中使用它。您建议的解决方案无法解决问题,因为外部

public void getViewsPosition(final ArrayList viewArr)

view_to_rect 的大小仍然是 0。

编辑#3:

这是我尝试构建我的 Collection 的过程:

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(...) 是“ View 列表的大小 = 7”。

我的问题是如何让第二个日志打印出“矩形 View 大小 = 7”?它总是返回 0。

我可能真的不太了解如何通过 onPositionUpdate() 方法使用您的解决方案。应该如何实现才能实现我的目标?

最佳答案

ViewTreeObserver 仅在 View 渲染时才会收到通知,你这是什么意思

"but outside of it these values are gone"

您可以在 GlobalLayoutListener 回调中获取按钮的位置,并将其保存到实例中。记住,您只能获取渲染时的位置。

提醒:

输入这段代码

Log.i(TAG, " View 大小为 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
}

关于java - Android - 检索和使用 fragment 中的 View 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18248796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com