簡體   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