所以,我有一个片段,其中有两个按钮。 我想在这个片段中获得此按钮位置。所以,我试图这样做:
Button button;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
final View w = inflater.inflate(R.layout.fragment_buttons, container, false);
button = (Button)w.findViewById(R.id.button);
final ViewTreeObserver obs = button.getViewTreeObserver();
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw () {
Rect r = locateView(w.findViewById(R.id.button));
return true;
}
});
return w;
}
这就是我获得按钮位置的方式
public Rect locateView(View view) {
Rect loc = new Rect();
int[] location = new int[2];
if (view == null) {
return loc;
}
view.getLocationOnScreen(location);
loc.left = location[0];
loc.top = location[1];
loc.right = loc.left + view.getWidth();
loc.bottom = loc.top + view.getHeight();
return loc;
}
然而,问题是永远不会调用onPreDraw。我做错了什么?
答案 0 :(得分:1)
我刚刚想出如何解决这个问题。
button = (Button)w.findViewById(R.id.button);
ViewTreeObserver observer = button.getViewTreeObserver();
observer.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = locateView(button);
button.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
此代码正常运行。但是,我仍然不知道为什么以前的版本没有用。