2013-03-03 1 views
10

Quando creo un'attività utilizzando lo fullscreen activity wizard, creo un'attività a schermo intero ma ogni volta che clicco in qualsiasi punto dello schermo la barra di azione viene visualizzata per alcuni secondi. Come posso impedirgli di farlo?Attività della procedura guidata dell'attività a schermo intero. Come posso impedire alla barra di azione di mostrare quando interagisco con il dispositivo?

codice completo di FullScreenActivity.java

/** 
* An example full-screen activity that shows and hides the system UI (i.e. 
* status bar and navigation/system bar) with user interaction. 
* 
* @see SystemUiHider 
*/ 
public class FullscreenActivity extends Activity { 
    /** 
    * Whether or not the system UI should be auto-hidden after 
    * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds. 
    */ 
    private static final boolean AUTO_HIDE = true; 

    /** 
    * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after 
    * user interaction before hiding the system UI. 
    */ 
    private static final int AUTO_HIDE_DELAY_MILLIS = 3000; 

    /** 
    * If set, will toggle the system UI visibility upon interaction. Otherwise, 
    * will show the system UI visibility upon interaction. 
    */ 
    private static final boolean TOGGLE_ON_CLICK = true; 

    /** 
    * The flags to pass to {@link SystemUiHider#getInstance}. 
    */ 
    private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION; 

    /** 
    * The instance of the {@link SystemUiHider} for this activity. 
    */ 
    private SystemUiHider mSystemUiHider; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_fullscreen); 

     final View controlsView = findViewById(R.id.fullscreen_content_controls); 
     final View contentView = findViewById(R.id.fullscreen_content); 

     // Set up an instance of SystemUiHider to control the system UI for 
     // this activity. 
     mSystemUiHider = SystemUiHider.getInstance(this, contentView, 
       HIDER_FLAGS); 
     mSystemUiHider.setup(); 
     mSystemUiHider 
       .setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() { 
        // Cached values. 
        int mControlsHeight; 
        int mShortAnimTime; 

        @Override 
        @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
        public void onVisibilityChange(boolean visible) { 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 
          // If the ViewPropertyAnimator API is available 
          // (Honeycomb MR2 and later), use it to animate the 
          // in-layout UI controls at the bottom of the 
          // screen. 
          if (mControlsHeight == 0) { 
           mControlsHeight = controlsView.getHeight(); 
          } 
          if (mShortAnimTime == 0) { 
           mShortAnimTime = getResources().getInteger(
             android.R.integer.config_shortAnimTime); 
          } 
          controlsView 
            .animate() 
            .translationY(visible ? 0 : mControlsHeight) 
            .setDuration(mShortAnimTime); 
         } else { 
          // If the ViewPropertyAnimator APIs aren't 
          // available, simply show or hide the in-layout UI 
          // controls. 
          controlsView.setVisibility(visible ? View.VISIBLE 
            : View.GONE); 
         } 

         if (visible && AUTO_HIDE) { 
          // Schedule a hide(). 
          delayedHide(AUTO_HIDE_DELAY_MILLIS); 
         } 
        } 
       }); 

     // Set up the user interaction to manually show or hide the system UI. 
     contentView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (TOGGLE_ON_CLICK) { 
        mSystemUiHider.toggle(); 
       } else { 
        mSystemUiHider.show(); 
       } 
      } 
     }); 

     // Upon interacting with UI controls, delay any scheduled hide() 
     // operations to prevent the jarring behavior of controls going away 
     // while interacting with the UI. 
     findViewById(R.id.dummy_button).setOnTouchListener(
       mDelayHideTouchListener); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 

     // Trigger the initial hide() shortly after the activity has been 
     // created, to briefly hint to the user that UI controls 
     // are available. 
     delayedHide(100); 
    } 

    /** 
    * Touch listener to use for in-layout UI controls to delay hiding the 
    * system UI. This is to prevent the jarring behavior of controls going away 
    * while interacting with activity UI. 
    */ 
    View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      if (AUTO_HIDE) { 
       delayedHide(AUTO_HIDE_DELAY_MILLIS); 
      } 
      return false; 
     } 
    }; 

    Handler mHideHandler = new Handler(); 
    Runnable mHideRunnable = new Runnable() { 
     @Override 
     public void run() { 
      mSystemUiHider.hide(); 
     } 
    }; 

    /** 
    * Schedules a call to hide() in [delay] milliseconds, canceling any 
    * previously scheduled calls. 
    */ 
    private void delayedHide(int delayMillis) { 
     mHideHandler.removeCallbacks(mHideRunnable); 
     mHideHandler.postDelayed(mHideRunnable, delayMillis); 
    } 
} 

risposta

1

ho preso uno sguardo in profondità nel codice e ha iniziato l'attività su un dispositivo Android 4.2 senza pulsanti di navigazione fisici. La configurazione predefinita è a schermo intero il più possibile. Nasconde la barra di stato , action bar e barra di navigazione. Quindi, come dovrebbe essere l'utente a uscire dalla tua attività se non con un clic in qualsiasi punto dello schermo? Qualsiasi altra cosa sarebbe molto limitante e cattiva usabilità. Penso che questo sia il motivo per cui questo comportamento non può essere manipolato.

Invece, è possibile modificare SystemUiHider in modo che nasconda la barra di stato e la barra delle azioni, ma non la barra di navigazione. Dimagrisce invece la barra di navigazione a tre pallidi punti, vedi lo screenshot qui sotto.

dimmed navigation bar

Ci deve essere un modo migliore per raggiungere questo obiettivo, ma le seguenti opere. Commento queste righe alla fine del costruttore SystemUiHiderHoneycomb():

if ((mFlags & FLAG_HIDE_NAVIGATION) != 0) { 
    // If the client requested hiding navigation, add relevant flags. 
    mShowFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; 
    mHideFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
      | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
    mTestFlags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
} 

L'attività rimane quindi a tutto schermo su interazione con l'utente e si può toggle() che in un particolare evento. Ovviamente, dovresti comunque eseguire la modifica dalla mia risposta originale per disabilitare il comportamento dei clic.


risposta originale:

Credo che devi da commentare questa parte:

// Set up the user interaction to manually show or hide the system UI. 
contentView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (TOGGLE_ON_CLICK) { 
      mSystemUiHider.toggle(); 
     } else { 
      mSystemUiHider.show(); 
     } 
    } 
}); 
+0

Questo non funziona, il sistema ripristina automaticamente la barra delle azioni dall'interazione. Il codice sopra consente solo di nascondere l'interfaccia utente quando è visibile, quindi mSystemUiHider.show(); parte è praticamente ridondante. Sto anche cercando un modo per ignorare questo comportamento. – JayPea

+0

@JayPea: Si prega di consultare la mia modifica. –

+0

Grazie per la risposta. Darò questo a provare anche se sto ancora cercando una soluzione che include la barra di navigazione. Se hai utilizzato l'app Kindle, capirai perché sarebbe utile. In questa app, puoi mostrare la navigazione facendo clic sul centro dello schermo, ma sfogliando una pagina o facendo clic sulla parte sinistra o destra dello schermo non ha questo effetto. Riappare la barra di navigazione quando sfogliare una pagina non è solo fastidiosa, ma richiede anche un doppio sfioramento del dito, poiché il primo clic viene consumato dall'azione che attiva questo effetto. Deve essere possibile dal momento che Kindle lo fa. – JayPea

0

Modifica del tema della vostra attività di non avere barra delle operazioni. La cosa migliore è ereditare dalla barra delle azioni l'attività Sherlock e rimuovere la barra delle azioni

+0

Il problema è che questo nasconderebbe la barra delle azioni in modo permanente.Non conosco l'OP, ma nel mio caso, sto cercando un modo per nascondere temporaneamente la barra delle azioni e quindi mostrarlo di nuovo manualmente quando viene soddisfatta una determinata condizione (non solo su qualsiasi interazione dell'utente, poiché attualmente funziona) – JayPea

12

se ho capito bene, vuoi solo nascondere la barra delle azioni?

in caso affermativo, modificare questa riga (cambiando flag_hide_navigation su 0).

private static final int HIDER_FLAGS = 0;// SystemUiHider.FLAG_HIDE_NAVIGATION; 

e aggiungere questo alla chiamata onCreate:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    getWindow().requestFeature(Window.FEATURE_ACTION_BAR); //new 
    getActionBar().hide();         //new 
    getWindow().setFlags(
     WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.activity_fullscreen); 

in seguito, se si desidera visualizzare la barra delle azioni, basta chiamare da qualsiasi attività:

getActionBar().show(); 
+0

Grazie, dovrò ancora scoprire come integrare questo con l'animazione, ma questo impedisce alla barra di azione di riapparire all'interazione come era necessario. – JayPea

2

I Tried The Same Inserendo 0 al posto di 3000

private static final int AUTO_HIDE_DELAY_MILLIS = 3000; 

Ma sta diventando troppo laggoso ... Così, Il trucco u di apportare modifiche in androidmanifest.xml aggiungere

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 

a AndroidManifest.xml underApplication

2

Questo ha funzionato per me. Sebbene il navigatore non sia stato rimosso completamente, non consente molto all'utente di interagire, inoltre le icone dei pulsanti sono piccoli punti. Inoltre, riduce la quantità di codice necessaria in tutto il luogo per creare uno schermo a schermo intero.

SystemUiHider hider = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //go full screen with no title 
    this.requestWindowFeature(Window.FEATURE_PROGRESS); //show progress on loadup 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); //hide the title bar 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //go fullscreen 

    setContentView(R.layout.activity_main); 

    //hide the navigation controls 
    final RelativeLayout mainLayout = (RelativeLayout)this.findViewById(R.id.mainLayout); 
    hider = SystemUiHider.getInstance(this, mainLayout, SystemUiHider.FLAG_HIDE_NAVIGATION); 
    hider.setup(); 
    hider.setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() { 
     @Override 
     @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) 
     public void onVisibilityChange(boolean visible) { 
      if (visible) { 
       //will make navigator into small dots 
       hider.hide(); 

       //must use delayed to force navigator to disappear completely 
       final Handler mHideHandler = new Handler(); 
       final Runnable mHideRunnable = new Runnable() { 
        @Override 
        public void run() { 
         hider.hide(); 
        } 
       }; 
       mHideHandler.removeCallbacks(mHideRunnable); 
       mHideHandler.postDelayed(mHideRunnable, 1000); //min 1 sec to work 
      } 
     } 
    }); 
    hider.hide(); 

    //do the rest of your onCreate stuff here 
} 
+0

Grazie per il trucco 'postDelayed', ero così frustrato all'oscuramento semi-casuale, quando la navigazione doveva essere nascosta. – hleinone

1

In api19 possiamo usare:

getWindow().getDecorView() 
    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
          | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 

per nascondere barra di navigazione con barra di stato

0

Anche se la sua troppo tardi per inviare una risposta, ma per quanto posso capire la domanda e dal momento che sto lavorando utilizzando il modello di attività a schermo intero fornito in Android Studio, penso che la risposta a questa domanda è di disabilitare la barra delle azioni che diventa visibile quando l'utente interagisce con l'interfaccia utente, che può essere ottenuta semplicemente disabilitando OnClickListener su contentView cioè

contentView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (TOGGLE_ON_CLICK) { 
      mSystemUiHider.toggle(); 
     } else { 
      mSystemUiHider.show(); 
     } 
    } 
}); 

cioè commento l'attuazione onClick metodo.

0

Proprio come commento

if (TOGGLE_ON_CLICK) { 
        mSystemUiHider.toggle(); 
       } else { 
        mSystemUiHider.show(); 
       } 

Per impostazione predefinita lo stato è Off. Attiva perché è presente anche un ascoltatore onclick che attiva o disattiva lo schermo. Potresti semplicemente non aggiungerlo ed eliminare lo snippet di codice.

Il codice più recente è // Imposta l'interazione dell'utente per mostrare o nascondere manualmente l'interfaccia utente del sistema.

mContentView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // toggle(); 
     } 

semplicemente commentate ginocchiera() e voilà