2015-09-23 7 views
9

私はそれを含むフラグメントの外に何かを描画するViewを持っており、それをdraw the content outside it using thisに設定しました。アクションバーのタブの上にビューを配置/オーバーラップ(z-インデックス)

問題はどこでも動作しますが、ActionBarタブとActionBarタブで問題になります。

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

私はAPPCOMPATを使用して、タブをこのように追加してい:

を私はすべての親ビューへ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で実現するのがより簡単です。

関連する問題