2015-09-23 12 views
9

Ich habe eine Ansicht, die etwas außerhalb des Fragments zeichnet, das es enthält, und ich habe es auf draw the content outside it using this konfiguriert.Platzieren/Überlappen (Z-Index) Eine Ansicht über Aktionsleiste Tabs

Das Problem ist, dass es überall aber auf den Registerkarten ActionBar und ActionBar funktioniert.

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

Ich verwende AppCompat und das Hinzufügen von Registerkarten auf diese Weise:

ich android:clipChildren="false" alle Eltern Ansichten hinzugefügt, aber es funktioniert nicht nur für ActionBar und ActionBar Registerkarten.

Die gewünschte Ansicht:

enter image description here Aber das Ergebnis ist folgendes:

enter image description here

+0

Versuchen Sie das Erstellen und Aufpumpen benutzerdefinierte Ansicht zuerst, dann Registerkarten –

Antwort

0

Endlich entfernte ich die TabBar und ersetzte es mit einfachen Schaltflächen, um zwischen den Tabs zu wechseln und legte es vor CustomLayout in xml davor gezeichnet werden.

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

<CustomLayout 

.... 
/> 
2

Es ist nicht einfach, Sie ohne die vollständige Quellcode zu helfen; Trotzdem kann ich Ihnen einen alternativen Ansatz vorschlagen, der zu Ihrem Fall passt.

Wenn Sie ein benutzerdefiniertes Floating Element erstellen (vielleicht für ein Tutorial oder einen Hinweis verwendet), Sie vermeiden sollen die Basis Ansichten Hierarchie und bevorzugen eine reine Overlay Lösung zu verändern.

Die PopupWindow ist genau das, was Sie brauchen:

ein Popup-Fenster, das verwendet werden kann, eine beliebige Ansicht anzuzeigen.

Da die PopupWindow wirkt auf Activity Ebene sollte es alles in Ihrem aktuellen Activity überlagern.

Das Popup-Fenster ist ein schwebender Container, der über der aktuellen Aktivität angezeigt wird.

Sie können ein einfaches Beispiel finden here.

+0

Diese Ansicht den Kreis in der OnDraw() -Methode zeichnen und dies ist eine komplexe Sicht, so will ich nicht die Sicht Funktionalität ändern. –

+0

Sie bestehen darauf, eine Änderung der Basishierarchie zu vermeiden, aber Sie fügen dem root-Fenster eine fremde Ansicht hinzu. Auch das Popup-Fenster bleibt in diesem Container, bis es explizit entfernt wird. – wrecker

+0

@wrecker Ja, weil es tatsächlich eine überlappende und eigenartige Ansicht ist, die nicht mit dem gewöhnlichen Baumlayout zusammenhängt. Ihre Lösung ist einfach schlecht, weil Sie die Hierarchie ändern, um einen temporären visiven Effekt zu erzielen (und Sie müssen immer noch die abgerundete Ansicht entfernen und das Layout neu berechnen). Für diesen Anwendungsfall ist ein Popup-Fenster viel besser. – bonnyz

0

Dies geschieht aufgrund der hierarchischen Reihenfolge Ihres Aktivitätslayouts. Ihre ActionBar wird über Ihre Ansicht gezeichnet. Sie können den Rahmen Ihrer Aktivität finden und dort die Ansicht hinzufügen.

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; 
} 

Denken Sie auch daran, die Ansicht zu entfernen, wenn Sie zu einem anderen Fragment navigieren.

frameLayoutRoot.removeView(circleView); 

Edit:

Bitte beachten Sie, dass dies etwas ist, das man auf der Ebene tun sollten, die Sie ActionBar hinzufügen, die die Aktivität ist. In diesem Fall würden Sie diese Problemumgehungen nicht benötigen. Dieses Zeug ist viel einfacher zu erreichen mit ToolBar.

Verwandte Themen