我有問題將視圖發回。在Android中,我們有一個像bringToFront()
這樣的方法,將視圖置於另一個視圖之上。像那樣,我想把視圖放在之前的圖像下面。如何發送視圖回來?如何以編程方式控制z順序?
Android中是否有像sendToBack()
或bringToBack()
這樣的方法。如果是這樣,任何人都可以幫助我。
注意:我不想通過在佈局中放置項目的順序來控制z順序我想通過編程方式控制z順序。
我不想在前面隱藏視圖我只是希望他們能夠在視圖的後面移動。
我有問題將視圖發回。在Android中,我們有一個像bringToFront()
這樣的方法,將視圖置於另一個視圖之上。像那樣,我想把視圖放在之前的圖像下面。如何發送視圖回來?如何以編程方式控制z順序?
Android中是否有像sendToBack()
或bringToBack()
這樣的方法。如果是這樣,任何人都可以幫助我。
注意:我不想通過在佈局中放置項目的順序來控制z順序我想通過編程方式控制z順序。
我不想在前面隱藏視圖我只是希望他們能夠在視圖的後面移動。
Afaik沒有內置的解決方案。我想你試圖修改FrameLayout中的z順序或類似的東西。
但是,我認爲你可以修改佈局中包含的子元素的順序。 RemoveChild ...()和addView()方法可以取位置值,所以你很可能會交換子元素,並且會修改z順序。但是,這看起來有點不方便。或者考慮修改子視圖的可見性屬性,您可能會得到類似的行爲,而且我認爲這會更清晰。
編輯:
有了新的Android版本,看來我們終於可以輕鬆更改視圖的Z排序的能力將L開發者預覽版。 「提升」和「TranslationZ」屬性救援:https://developer.android.com/preview/material/views-shadows.html
您也可以嘗試使用ViewGroup.addViewInLayout()
方法,採取指數的功能,確定應認爲是在年底或在列表
之初沒有sendToBack()
方法。但如果您在較低位置的視圖上調用bringToFront()
,則可獲得幾乎相同的效果。
這是一個含糊不清的答案,沒有提供任何示例,也沒有記錄你必須在通話後使視圖無效。爲什麼不改善答案,而不是爲了獲得積分?至少這是在@noob發佈之前如何處理它的。 – LoungeKatt
你的意思是在需要之前獲得所有視圖,並調用sendToBack?這是瘋狂的 – user924
請致電bringToFront()
關於你想要在前面看到的視圖,然後在所有視圖上調用invalidate()
方法,包括你想要在前面的視圖。對所有聽衆重複相同的操作。
因此,當另一個視圖的偵聽器被調用時,以前的視圖將會失效,並將在後臺。
看看這篇文章的更多信息: - http://abhishek347.wordpress.com/2012/02/22/android-development-bringtofront-and-sendtoback-on-view/ – noob
這裏是我使用的視圖發送到後面的方法(因此相對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));
}
}
希望這有助於!
我意識到這已被隱含在其他答案中,但沒有人發佈代碼。我保持在一個實用程序類下面我哪裏有「幫手」功能處理意見:
public static void sendViewToBack(final View child) {
final ViewGroup parent = (ViewGroup)child.getParent();
if (null != parent) {
parent.removeView(child);
parent.addView(child, 0);
}
}
不會覆蓋任何插槽0之前?我認爲你必須將每個孩子都拖下來放置一個插槽,這樣在取出孩子後,讓孩子們計數,因爲他們每個孩子都會找回孩子,用前一個孩子取代它(從一個孩子開始),然後繼續前進下一個孩子。完成後,添加最後一個孩子回來,你完成了......或者我認爲我沒有看到任何addView文檔中的任何內容,這表明它將取代該位置的現有孩子。 – James
@James不,它確實將它們轉移給你(類似於'ArrayList'中的'add()')。你可以嘗試一下,如果你想。或者通過查看源代碼來確認它......它在內部使用addInArray()。但是對於這個問題,在文檔中不太清楚。因此,如果你使用這個,你可能應該在將來的API更新中關注這個,以防他們決定改變這個(未記錄的)行爲。好點子。 – Turix
感謝這段代碼。因爲它讀得更好,所以我只想將「null!= parent」改爲「parent!= null」。 – clocksmith
我要麼設置它的能見度爲0,或只是把它下面的看法在它的前面。
請注意,您可以使用從API級別21開始的view.setZ(float)
。Here您可以找到更多信息。
它工作的優良像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();
}
}
}
你能更詳細地描述你的代碼是如何工作的嗎? –
請說明您的代碼的更多詳細信息... –
例如,我們有4個如此命名的視圖(A,B,C,D),並且我們希望將視圖B發送回所有的 ,所以我們有3個循環根據循環條件 第一個循環:(B ,C,d,A) 第二循環:我們得到乙視圖是第一視圖所以我們必須SECEND視圖發送到前面(B,d,A,C) 第三循環:像先前循環中,我們發送第二查看前面(B,A,C,D)抱歉,我的弱語法 –
我贊成。我已經看到,實際上,你不能爲具有子節點的'view'調用'bringToFront()'。首先,你必須像'removeAllViews()'或'setVisibility(View.GONE)'或其他類似的東西。然後你可以使用'addView()'或'setVisibility(View.Visible)'將孩子帶回來。 – AlexAndro
你能幫我實施這個嗎? – MMakati
這不是我面臨的問題,但給了我一個解決我的問題的想法(刪除並添加視圖排序我的問題)。謝謝。 – avijendr