2015-09-23 58 views
9

我有一個視圖,它在包含它的片段外繪製東西,我將它配置爲draw the content outside it using this放置/重疊(z-index)視圖上方的操作欄選項卡

問題是,它在任何地方都可以使用,但在ActionBar和ActionBar選項卡上。

mActionBar.addTab(
    mActionBar.newTab() 
     .setCustomView(t)); 

我使用程序兼容性和添加標籤是這樣的:

我加android:clipChildren="false"所有家長的意見,但它不只是對動作條和動作條標籤的工作。

所需的視圖:

enter image description here 但結果是這樣的:

enter image description here

+0

嘗試創建和第一膨脹自定義視圖,則突片 –

回答

0

我終於刪除了tabBar,並用簡單的按鈕替換它,在製表符之間切換,並將它放在xml的CustomLayout之前,以便在它之前繪製。

<LinearLayout 
    .... 
    // tabs layout /> 

<CustomLayout 

.... 
/> 
2

這並不容易,以幫助您沒有完整的源代碼;無論如何,我可以建議你一個可能適合你的情況的替代方法。

如果要創建一個自定義浮動項(可能用於教程或暗示),你應該避免改變基本視層次,喜歡純覆蓋解決方案

PopupWindow正是你需要的東西:

,可用於顯示任意視圖的彈出窗口。

由於在Activity水平PopupWindow行爲,應該在當前的Activity覆蓋一切。

彈出窗口是一個浮動容器,它出現在 當前活動的頂部。

你可以找到一個簡單的例子here

+0

這種觀點是繪製在的onDraw()方法中的圓,這是一個複雜的視圖,因此我不希望改變視圖的功能。 –

+0

您正在堅持避免更改基本層次結構,但您將外來視圖附加到根窗口。此外,彈出窗口將保留在該容器中,直到它被明確刪除。 – wrecker

+0

@wrecker是的,因爲它實際上是一個與普通樹佈局無關的重疊和奇特的視圖。您的解決方案很糟糕,因爲您正在修改層次結構以實現臨時視覺效果(並且仍然需要移除圓角視圖並重新計算佈局)。對於這個用例,彈出窗口更好些 – bonnyz

0

這是因爲您的活動佈局的層次順序。您的ActionBar正在您的視圖上繪製。你可以找到你的活動的框架,並在那裏添加視圖。

private void addCircleView() { 
    final FrameLayout frameLayoutRoot = (FrameLayout) getActivity().getWindow() 
     .getDecorView().findViewById(android.R.id.content); 

    View circleView = inflater.inflate(
     R.layout.my_circle_view, frameLayoutRoot, false); 

    ViewGroup.MarginLayoutParams marginLayoutParams = 
     ((ViewGroup.MarginLayoutParams) circleView.getLayoutParams()); 

    marginLayoutParams.topMargin = getStatusBarHeight(getActivity()) 
     + getActivity().getActionBar().getHeight() 
     + getResources().getDimensionPixelSize(R.dimen.your_margin_top_circle); 

    circleView.setLayoutParams(marginLayoutParams); 

    frameLayoutRoot.addView(circleView); 
} 

public int getStatusBarHeight(Context context) { 

    int result = 0; 

    final int resourceId = context.getResources().getIdentifier(
     "status_bar_height", "dimen", "android"); 

    if (resourceId > 0) { 
     result = context.getResources().getDimensionPixelSize(resourceId); 
    } 
    return result; 
} 

還記得當您導航到其他片段時刪除視圖。

frameLayoutRoot.removeView(circleView); 

編輯:

請注意,這是東西,你應該在你添加ActionBar水平,這是活動做。在這種情況下,您不需要這些解決方法。這些東西用ToolBar更容易實現。