2015-09-23 28 views
9

Ho una vista che disegna qualcosa al di fuori del frammento che lo contiene e l'ho configurato su draw the content outside it using this.Posizionamento/Sovrapposizione (z-index) una vista sopra le schede della barra delle azioni

Il problema è che funziona ovunque ma sulle schede ActionBar e ActionBar.

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

Sto usando AppCompat e l'aggiunta di schede in questo modo:

ho aggiunto android:clipChildren="false" a tutte le viste padre, ma non funziona solo per le schede ActionBar e ActionBar.

la vista desiderata:

enter image description here Ma il risultato è questo:

enter image description here

+0

Prova a creare e gonfiare visualizzazione personalizzata, poi le schede –

risposta

0

Infine ho rimosso il tabBar e l'ho sostituito con semplici pulsanti per passare da una scheda all'altra e posizionarlo prima che CustomLayout in xml venga disegnato prima di esso.

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

<CustomLayout 

.... 
/> 
2

Non è facile per aiutare voi senza il codice sorgente completo; comunque posso suggerirti un approccio alternativo che potrebbe essere adatto al tuo caso.

Se si sta creando un elemento personalizzato galleggiante (forse utilizzato per un tutorial o un suggerimento), si dovrebbe evitare di alterare la gerarchia vista di base e preferiscono un pura sovrapposizione soluzione.

Il PopupWindow è esattamente quello che vi serve:

una finestra pop-up che può essere utilizzato per ottenere una visualizzazione arbitraria.

Dal momento che i PopupWindow atti a Activity livello, dovrebbe sovrapporre tutto nella vostra corrente Activity.

La finestra popup è un contenitore mobile che viene visualizzato sopra l'attività corrente .

È possibile trovare un esempio semplice here.

+0

Questo punto di vista è il disegno del cerchio nel metodo OnDraw() e questa è una visione complessa, in modo che io non voglio cambiare la funzionalità di visualizzazione. –

+0

Si sta insistendo per evitare di modificare la gerarchia di base, ma si sta allegando una vista aliena alla finestra principale. Anche la finestra popup rimarrà in quel contenitore fino a quando non verrà rimossa esplicitamente. – wrecker

+0

@wrecker Sì, perché è in realtà una vista sovrapposta e particolare che non è correlata al layout ordinario dell'albero. La tua soluzione è semplicemente pessima, perché stai modificando la gerarchia per ottenere un effetto visivo temporaneo (e devi ancora rimuovere la vista arrotondata e ricalcolare il layout). Per questo caso d'uso, una finestra pop-up è modi migliori – bonnyz

0

Ciò accade a causa dell'ordine gerarchico del layout dell'attività. Il tuo ActionBar viene disegnato sulla tua vista. Puoi trovare la cornice della tua attività e aggiungere la vista lì.

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

Ricordarsi inoltre di rimuovere la vista quando si passa ad un altro frammento.

frameLayoutRoot.removeView(circleView); 

Edit:

prega di notare che questo è qualcosa che si dovrebbe fare a livello che si aggiunge ActionBar, che è l'attività. In tal caso non avresti bisogno di questi soluzioni alternative. Questo materiale è molto più semplice da ottenere con ToolBar.