2011-07-20 68 views
44

我有問題將視圖發回。在Android中,我們有一個像bringToFront()這樣的方法,將視圖置於另一個視圖之上。像那樣,我想把視圖放在之前的圖像下面。如何發送視圖回來?如何以編程方式控制z順序?

Android中是否有像sendToBack()bringToBack()這樣的方法。如果是這樣,任何人都可以幫助我。

注意:我不想通過在佈局中放置項目的順序來控制z順序我想通過編程方式控制z順序。

我不想在前面隱藏視圖我只是希望他們能夠在視圖的後面移動。

回答

26

Afaik沒有內置的解決方案。我想你試圖修改FrameLayout中的z順序或類似的東西。

但是,我認爲你可以修改佈局中包含的子元素的順序。 RemoveChild ...()和addView()方法可以取位置值,所以你很可能會交換子元素,並且會修改z順序。但是,這看起來有點不方便。或者考慮修改子視圖的可見性屬性,您可能會得到類似的行爲,而且我認爲這會更清晰。

編輯:

有了新的Android版本,看來我們終於可以輕鬆更改視圖的Z排序的能力將L開發者預覽版。 「提升」和「TranslationZ」屬性救援:https://developer.android.com/preview/material/views-shadows.html

+1

我贊成。我已經看到,實際上,你不能爲具有子節點的'view'調用'bringToFront()'。首先,你必須像'removeAllViews()'或'setVisibility(View.GONE)'或其他類似的東西。然後你可以使用'addView()'或'setVisibility(View.Visible)'將孩子帶回來。 – AlexAndro

+0

你能幫我實施這個嗎? – MMakati

+0

這不是我面臨的問題,但給了我一個解決我的問題的想法(刪除並添加視圖排序我的問題)。謝謝。 – avijendr

0

你可以嘗試做view.setVisibility(View.INVISIBLE)view.setVisibility(View.GONE)

UPDATE:

This向您展示如何完成你想做的事情。

+0

看到我的新編輯 – Lukap

+0

我認爲[this](http://dotslasha.in/wp/143/creating-floating-views-in-android)將幫助你。 –

+3

鏈接到樣品現在已損壞。 –

1

您也可以嘗試使用ViewGroup.addViewInLayout()方法,採取指數的功能,確定應認爲是在年底或在列表

33

之初沒有sendToBack()方法。但如果您在較低位置的視圖上調用bringToFront(),則可獲得幾乎相同的效果。

+0

這是一個含糊不清的答案,沒有提供任何示例,也沒有記錄你必須在通話後使視圖無效。爲什麼不改善答案,而不是爲了獲得積分?至少這是在@noob發佈之前如何處理它的。 – LoungeKatt

+0

你的意思是在需要之前獲得所有視圖,並調用sendToBack?這是瘋狂的 – user924

19

請致電bringToFront()關於你想要在前面看到的視圖,然後在所有視圖上調用invalidate()方法,包括你想要在前面的視圖。對所有聽衆重複相同的操作。

因此,當另一個視圖的偵聽器被調用時,以前的視圖將會失效,並將在後臺。

+0

看看這篇文章的更多信息: - http://abhishek347.wordpress.com/2012/02/22/android-development-bringtofront-and-sendtoback-on-view/ – noob

8

這裏是我使用的視圖發送到後面的方法(因此相對bringToFront的,那種sendToBack):

private void moveToBack(View myCurrentView) 
    { 
     ViewGroup myViewGroup = ((ViewGroup) myCurrentView.getParent()); 
     int index = myViewGroup.indexOfChild(myCurrentView); 
     for(int i = 0; i<index; i++) 
     { 
      myViewGroup.bringChildToFront(myViewGroup.getChildAt(i)); 
     } 
    } 

希望這有助於!

+0

有一個錯誤在這個,讓我說我有3個圖像。如果我移動回第二個圖像,它工作正常。但如果我移動第三張圖像(在第二張圖像之後),第三張圖像會移回,但第二張圖像會移到前面。 – MMakati

+0

這是瘋狂的,它會崩潰你所有的佈局/視圖設計 – user924

56

我意識到這已被隱含在其他答案中,但沒有人發佈代碼。我保持在一個實用程序類下面我哪裏有「幫手」功能處理意見:

public static void sendViewToBack(final View child) { 
    final ViewGroup parent = (ViewGroup)child.getParent(); 
    if (null != parent) { 
     parent.removeView(child); 
     parent.addView(child, 0); 
    } 
} 
+0

不會覆蓋任何插槽0之前?我認爲你必須將每個孩子都拖下來放置一個插槽,這樣在取出孩子後,讓孩子們計數,因爲他們每個孩子都會找回孩子,用前一個孩子取代它(從一個孩子開始),然後繼續前進下一個孩子。完成後,添加最後一個孩子回來,你完成了......或者我認爲我沒有看到任何addView文檔中的任何內容,這表明它將取代該位置的現有孩子。 – James

+2

@James不,它確實將它們轉移給你(類似於'ArrayList'中的'add()')。你可以嘗試一下,如果你想。或者通過查看源代碼來確認它......它在內部使用addInArray()。但是對於這個問題,在文檔中不太清楚。因此,如果你使用這個,你可能應該在將來的API更新中關注這個,以防他們決定改變這個(未記錄的)行爲。好點子。 – Turix

+0

感謝這段代碼。因爲它讀得更好,所以我只想將「null!= parent」改爲「parent!= null」。 – clocksmith

0

我要麼設置它的能見度爲0,或只是把它下面的看法在它的前面。

2

請注意,您可以使用從API級別21開始的view.setZ(float)Here您可以找到更多信息。

1

它工作的優良像bringToBack()

public void moveToBack(ViewGroup viewGroup, View v) { 
    int s = 1; 
    for (int i = 1; i < viewGroup.getChildCount(); i++) { 
     if (viewGroup.getChildAt(1) == v) { 
      s = 2; 
     } else { 
      viewGroup.getChildAt(s).bringToFront(); 
     } 
    } 
} 
+0

你能更詳細地描述你的代碼是如何工作的嗎? –

+0

請說明您的代碼的更多詳細信息... –

+0

例如,我們有4個如此命名的視圖(A,B,C,D),並且我們希望將視圖B發送回所有的 ,所以我們有3個循環根據循環條件 第一個循環:(B ,C,d,A) 第二循環:我們得到乙視圖是第一視圖所以我們必須SECEND視圖發送到前面(B,d,A,C) 第三循環:像先前循環中,我們發送第二查看前面(B,A,C,D)抱歉,我的弱語法 –

相關問題