2013-03-03 6 views
10

Wenn ich eine Aktivität unter Verwendung der fullscreen activity wizard Create eine Fullscreen-Aktivität erstellen, aber immer wenn ich irgendwo auf dem Bildschirm klicke, wird die Aktionsleiste für ein paar Sekunden angezeigt. Wie kann ich damit aufhören?Vollbild Aktivitätsassistent Aktivität. Wie kann ich verhindern, dass die Aktionsleiste angezeigt wird, wenn ich mit dem Gerät interagiere?

Voll Code von 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); 
    } 
} 

Antwort

1

nahm ich einen tiefen Einblick in den Code und begann die Aktivität auf einem Android-4.2-Gerät ohne physikalische Navigationstasten. Die Standardkonfiguration ist so vollständig wie möglich. Es verbirgt Statusleiste, Aktionsleiste und Navigationsleiste. Wie also sollte der Benutzer aus Ihrer Aktivität herauskommen, wenn nicht mit einem Klick irgendwo auf dem Bildschirm? Alles andere wäre sehr einschränkend und schlecht benutzbar. Ich denke, das ist der Grund, warum dieses Verhalten nicht manipuliert werden kann.

Was können Sie stattdessen tun, ist es, die SystemUiHider ändern, so dass es auf die Statusleiste und die Aktionsleiste versteckt, aber nicht der Navigationsleiste. Stattdessen wird die Navigationsleiste auf drei helle Punkte gedimmt, siehe Abbildung unten.

dimmed navigation bar

Es muss ein besserer Weg, dies zu erreichen, aber die folgenden Werke. Kommentar diese Zeilen am Ende des SystemUiHiderHoneycomb() Konstruktor:

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

Die Aktivität dann auf Interaktion mit dem Benutzer Vollbild bleibt und Sie können es an einem bestimmten Ereignis toggle(). Natürlich müssten Sie immer noch die Änderung von meiner ursprünglichen Antwort vornehmen, um das Klickverhalten zu deaktivieren.


Ursprüngliche Antwort:

Ich denke, Sie haben diesen Teil Kommentar:

// 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

Dies funktioniert nicht, setzt das System automatisch die Aktionsleiste auf Interaktion. Mit dem obigen Code können Sie die Benutzeroberfläche nur dann ausblenden, wenn sie sichtbar ist, sodass die mSystemUiHider.show(); Teil ist ziemlich überflüssig. Ich suche auch nach einer Möglichkeit, dieses Verhalten zu überschreiben. – JayPea

+0

@JayPea: Bitte sehen Sie meine Bearbeitung. –

+0

Danke für Ihre Antwort. Ich werde es versuchen, obwohl ich immer noch nach einer Lösung suche, die die Navigationsleiste enthält. Wenn Sie die Kindle App verwendet haben, werden Sie verstehen, warum dies nützlich wäre. In dieser App können Sie die Navigation anzeigen, indem Sie auf die Mitte des Bildschirms klicken, aber das Blättern auf einer Seite oder das Klicken auf die linke oder rechte Seite des Bildschirms hat diesen Effekt nicht. Das Wiedersehen der Navigationsleiste beim Seitenwechsel ist nicht nur ärgerlich, sondern Sie müssen auch zweimal streichen, da der erste Klick von der Aktion verbraucht wird, die diesen Effekt auslöst. Es muss möglich sein, da Kindle es tut. – JayPea

0

Ändern Sie das Thema Ihrer Tätigkeit nicht Aktionsleiste haben. Am besten ist, von der Aktionsleiste Sherlock-Aktivität zu erben und die Aktionsleiste zu entfernen

+0

Das Problem ist, dass dies die Aktionsleiste dauerhaft ausblenden würde.Ich weiß nichts über das OP, aber in meinem Fall suche ich nach einer Möglichkeit, die Aktionsleiste vorübergehend zu verstecken und sie dann wieder manuell anzuzeigen, wenn eine bestimmte Bedingung erfüllt ist (nicht nur irgendeine Benutzerinteraktion, wie sie ist) funktioniert momentan) – JayPea

12

Wenn ich das richtig verstehe, möchten Sie nur die Aktionsleiste ausblenden?

Wenn ja, ändern Sie diese Zeile (indem Sie flag_hide_navigation auf 0 setzen).

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

und fügen Sie diese dem onCreate Aufruf:

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

danach, wenn Sie die Aktionsleiste anzeigen möchten, rufen Sie einfach in der Aktivität von überall:

getActionBar().show(); 
+0

Danke, ich muss noch herausfinden, wie ich das mit der Animation integrieren kann, aber das verhindert, dass die Aktionsleiste bei der Interaktion wieder erscheint, wie es nötig war. – JayPea

2

I Tried Das Selbe Durch Setzen von 0 anstelle von 3000

private static final int AUTO_HIDE_DELAY_MILLIS = 3000; 

Aber es wird zu lückig ... So Der Trick u Änderungen im androidmanifest.xml hinzufügen

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

-AndroidManifest.xml underApplication

2

Das ist für mich gearbeitet. Obwohl der Navigator nicht vollständig entfernt wird, lässt er dem Benutzer nicht viel Zeit zum Interagieren, und die Schaltflächensymbole sind kleine Punkte. Dies verringert auch den Code, der überall benötigt wird, um einen Bildschirm im Vollbildmodus zu erstellen.

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

Danke für den 'postDelayed' Trick, ich war so frustriert beim halb-zufälligen Dimmen, als die Navigation versteckt werden sollte. – hleinone

1

In api19 können wir verwenden:

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

Navigationsleiste auszublenden zusammen mit Statusleiste

0

Obwohl es zu spät ist, eine Antwort zu schreiben, aber soweit ich die Frage verstehen und da ich mit der Full Screen Activity Vorlage arbeite, die in Android Studio zur Verfügung gestellt wird, denke ich, die Antwort auf diese Frage ist, Aktionsleiste zu deaktivieren, die sichtbar wird, wenn der Benutzer mit der Benutzeroberfläche interagiert, die nur durch Deaktivieren der OnClickListener on 01 erreicht werden kann d.h.

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

d.h. die Stellung onClick Methodenimplementierung geführt.

0

einfach auf Kommentar

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

standardmäßig den Zustand Off ist. Toggle passiert, weil ein onclick-Listener hinzugefügt wurde, der den Bildschirm umschaltet. Sie könnten es einfach nicht hinzufügen und das Code-Snippet löschen.

Der neueste Code lautet // Richten Sie die Benutzerinteraktion ein, um die Systembenutzeroberfläche manuell ein- oder auszublenden.

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

ich einfach auf Kommentar Toggle() und voila

Verwandte Themen