[英]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.