2013-07-20 19 views
13

Ho un ViewPager e FragmentPagerAdapter impostati in un'unica attività con 3 frammenti. Tutti i frammenti sono caricati simultaneamente e sono tenuti in memoria utilizzandoImposta a schermo intero i frammenti a livello di codice

mPager.setOffscreenPageLimit(2); 

Uno di questi frammenti ospita un'anteprima fotocamera che vorrei fare a schermo intero, senza barra di stato o barra delle operazioni. Gli altri frammenti richiedono che venga visualizzata la barra delle azioni.

Come faccio a rendere solo il frammento di anteprima della telecamera a schermo intero mantenendo gli altri due frammenti normali? Ho provato a usare temi, il che significa rompere la barra delle azioni.

programmazione chiamando il seguente non aiuta, perché costringe l'intera attività di essere a schermo intero (e quindi le altre due frammenti con essa):

requestWindowFeature(Window.FEATURE_NO_TITLE); 
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
setContentView(R.layout.main); 

Ho anche provato attuazione ViewPager.OnPageChangeListener:

public void onPageSelected(int position) { 
    if(position == 1) 
     getActionBar().hide(); 
    else 
     getActionBar().show(); 
} 

Ciò non nascondere la barra delle azioni, ma non nasconde la barra di stato del sistema (sto parlando in cui le notifiche, icone di stato, e il tempo sono), e la barra delle azioni nascondi/mostra di animazione è anche molto mosso durante lo scorrimento.

Per un esempio di ciò che voglio fare esattamente, vedere Snapchat: riescono a rimuovere perfettamente lo scorrimento tra fotocamera e altri frammenti.

Edit:

Così ho cambiato il mio onPageSelected a questo:

public void onPageSelected(int position) { 
    if(position == 1) { 
     MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
    } else { 
     MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
    } 
} 

Questo mi permette di cambiare se la barra di stato viene visualizzato o meno. Tuttavia, provoca una grande quantità di jank. Lo stesso problema con la barra delle azioni.

Ho notato che in Snapchat la barra di stato scorre su e giù dopo che il cambio di tabulazione è stato completato. Non sono sicuro di come implementarlo, quindi qualsiasi consiglio su questo aspetto sarebbe apprezzato.

risposta

11

Ho capito come farlo, anche se è decisamente un hack.

Il trucco non è usare la barra delle azioni di Android, ma è quello di crearne di propri nei file di layout.

Ho definito due RelativeLayouts nel mio codice:

<RelativeLayout 
    android:id="@+id/padding" 
    android:layout_width="fill_parent" 
    android:layout_height="25dip" 
    android:layout_alignParentTop="true" 
    android:background="@color/abs__background_holo_dark" /> 

<RelativeLayout 
    android:id="@+id/fake_action_bar" 
    android:layout_width="fill_parent" 
    android:layout_height="48.0dip" 
    android:layout_below="@id/padding" > 

<!-- stuff here --> 

</RelativeLayout> 

Il RelativeLayout superiore è imbottitura per la barra di stato di Android.L'ho impostato su 25dip, ma può variare: sarebbe probabilmente meglio impostare questo valore a livello di codice. Inoltre è necessario impostarlo su un colore nero in modo che corrisponda al colore della barra di stato e rende l'interfaccia utente più naturale.

Il RelativeLayout inferiore è per la barra di azione falso. È necessario riempire tutto ciò di cui ha bisogno la barra delle azioni (testo del titolo, pulsanti, ecc.) In questo RelativeLayout. L'ho impostato su 48dip, ma ancora una volta, questo varierà e probabilmente dovresti impostarlo a livello di programmazione.

Nel Activity ospitare i vostri Frammenti, ViewPager e FragmentPagerAdapter, è necessario impostare le bandiere dicendo Android per rendere la barra di stato una sovrapposizione:

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 

Ora abbiamo bisogno di rendere la barra di stato nascondere e mostrare quando cambiamo i frammenti. Avere la vostra attività implementare ViewPager.OnPageChangeListener e quindi utilizzare il seguente codice:

@Override 
public void onPageScrollStateChanged(int state) { 
    switch(state) { 
    case ViewPager.SCROLL_STATE_IDLE: 
     if(mPosition == 1) { 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
     } else { 
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
     } 
    } 
} 

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

} 

@Override 
public void onPageSelected(int position) { 
    mPosition = position; 
} 

teniamo traccia del numero di pagina utilizzando onPageSelected e utilizzarlo in onPageScrollStateChanged per nascondere in modo dinamico/mostrare la barra di stato a seconda di quale è attualmente in fase Frammento visualizzato. Non puoi farlo in onPageSelected perché questo farà visualizzare nuovamente la barra di stato a metà dello swipe.

È inoltre necessario assicurarsi di aggiungere il codice appropriato per la barra di azione falso - per i pulsanti, questo sarebbe OnClickListener.

2

Innanzitutto, nell'attività/frammento si desidera nascondere la barra di stato: Creare una statica pubblica del frammento.

public static Fragment QSFrag; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    QSFrag = this; 
} 

Poi, nel tuo onPageSelected:

public void onPageSelected(int position) { 
     // TODO Auto-generated method stub 
     if(position == 1){ 
      mActionBar.hide();    


      YourActivityWithNoStatusOrActionBar.QSFrag.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 


     }else{ 

      mActionBar.show(); 
      // mActionBar.setSelectedNavigationItem(position); I use this, not sure u need/want it. 
     } 

    } 

ho appena provato e funziona. Ma non sembra fantastico quando lasci il frammento senza barra di stato. : p

+0

Ho provato una versione modificata di questo, che aiuta ad eliminare la barra di stato, ma è un po 'assurda –

+0

Inoltre, ho appena realizzato che questo probabilmente causerebbe crash app se il frammento è stato scaricato dalla memoria a causa di una pagina scorrere o se è mai stato distrutto e ricreato, ad esempio da un cambiamento di orientamento. Dovresti recuperare un riferimento al frammento usando findFragmentById(), poiché il vecchio riferimento non sarebbe valido –

+0

cos'è 'mActionBar'? –

0

È possibile utilizzare questo codice in onCreate:

setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen); 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
if (getSupportActionBar() != null) { 
    getSupportActionBar().hide(); 
} 

Spero che questo risolve il problema. :)

Problemi correlati