2013-03-03 1 views
10

Gdy utworzę aktywność za pomocą fullscreen activity wizard, utworzę pełnoekranową aktywność, ale gdy kliknę w dowolnym miejscu na ekranie, pasek akcji pokazuje się na kilka sekund. Jak mogę to powstrzymać?Aktywność kreatora aktywności na pełnym ekranie. Jak zatrzymać wyświetlanie paska akcji podczas interakcji z urządzeniem?

Pełny kod 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); 
    } 
} 

Odpowiedz

1

Wzięłam głęboki zajrzeć do kodu i rozpoczął działalność na urządzeniu z Androidem 4.2 bez fizycznych przycisków nawigacyjnych. Domyślna konfiguracja jest maksymalnie pełnoekranowa. Ukrywa pasek stanu pasek stanu, pasek akcji i pasek nawigacyjny. Jak więc użytkownik powinien wyjść z Twojej aktywności, jeśli nie kliknięciem w dowolnym miejscu na ekranie? Coś innego byłoby bardzo ograniczające i zła użyteczność. Myślę, że właśnie z tego powodu nie można manipulować tym zachowaniem.

Zamiast tego można zmienić wartość SystemUiHider, tak aby ukryła pasek stanu i pasek akcji, ale , a nie pasek nawigacji. Zamiast tego przyciemnia pasek nawigacyjny do trzech jasnych punktów, patrz zrzut ekranu poniżej.

dimmed navigation bar

Musi być lepszym sposobem osiągnięcia tego celu, ale następujące prace. Komentarz te linie na końcu konstruktora 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; 
} 

Aktywność wtedy pozostaje tryb pełnoekranowy na interakcji użytkownika i można toggle() go w konkretnym przypadku. Oczywiście nadal będziesz musiał dokonać zmiany z mojej oryginalnej odpowiedzi, aby wyłączyć zachowanie kliknięcia.


Oryginalny odpowiedź:

Chyba trzeba skomentować tę część:

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

ten nie działa, system automatycznie przywraca pasek działań po interakcji. Powyższy kod pozwala ukryć interfejs tylko wtedy, gdy jest widoczny, więc mSystemUiHider.show(); część jest prawie zbyteczna. Poszukuję także sposobu na obejście tego zachowania. – JayPea

+0

@JayPea: Proszę zobaczyć moją edycję. –

+0

Dzięki za odpowiedź. Spróbuję, chociaż wciąż szukam rozwiązania, które zawiera pasek nawigacyjny. Jeśli korzystasz z aplikacji Kindle, zrozumiesz, dlaczego byłaby przydatna. W tej aplikacji możesz wyświetlić nawigację, klikając na środku ekranu, ale przerzucanie strony lub klikanie z lewej lub prawej strony ekranu nie ma takiego efektu. Ponowne pojawienie się paska nawigacji podczas przerzucania strony jest nie tylko denerwujące, ale wymaga również dwukrotnego kliknięcia, ponieważ pierwsze kliknięcie jest pochłaniane przez działanie, które uruchamia ten efekt. To musi być możliwe, ponieważ Kindle to robi. – JayPea

0

zmienić temat swojej działalności, aby nie mieć pasek akcji. Najlepiej jest odziedziczyć z paska akcji działanie Sherlocka i usunąć pasek akcji

+0

Problem polega na tym, że ukryłoby to pasek akcji na stałe.Nie wiem, co to jest OP, ale w moim przypadku, szukam sposobu, aby tymczasowo ukryć pasek akcji, a następnie pokazać go ponownie ręcznie, gdy spełniony jest pewien warunek (nie tylko w przypadku każdej interakcji użytkownika, ponieważ obecnie pracuje) – JayPea

12

jeśli dobrze rozumiem, po prostu chcesz ukryć pasek akcji?

jeśli tak, zmień ten wiersz (zmieniając flag_hide_navigation na 0).

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

i dodać do onCreate rozmowy:

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

potem, jeśli chcesz pokazać pasek akcji, wystarczy zadzwonić z dowolnego miejsca na aktywność:

getActionBar().show(); 
+0

Dzięki, będę musiał jeszcze dowiedzieć się, jak zintegrować to z animacją, ale to uniemożliwi ponowne wyświetlenie paska akcji po interakcji, w zależności od potrzeb. – JayPea

2

Próbowałam Taki sam przez wstawienie 0 zamiast 3000

private static final int AUTO_HIDE_DELAY_MILLIS = 3000; 

Ale staje się zbyt lagged ... Więc Sztuką u, aby dokonać zmian w androidmanifest.xml dodać

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

do AndroidManifest.xml underApplication

2

Ten pracował dla mnie. Chociaż nawigator nie jest całkowicie usunięty, nie pozwala użytkownikowi na interakcję, a ikony przycisków są małymi kropkami. Obniża to również ilość kodu potrzebnego w całym miejscu, aby ekran był wyświetlany na pełnym ekranie.

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

Dzięki za sztuczkę 'postDelayed', byłem tak sfrustrowany na pół przypadkowym ściemnianiem, kiedy nawigacja miała być ukryta. – hleinone

1

W api19 możemy użyć:

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

ukryć pasek nawigacyjny wraz z paskiem stanu

0

Choć jej zbyt późno, aby umieścić odpowiedź, ale o ile mogę zrozumieć pytanie i ponieważ pracuję przy użyciu szablonu działania pełnego ekranu dostępnego pod numerem Android Studio, myślę, że odpowiedź na to pytanie polega na wyłączeniu paska działań, który staje się widoczny, gdy użytkownik wchodzi w interakcję z interfejsem użytkownika, co można osiągnąć, wyłączając OnClickListener na contentView tj

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

tj wykomentuj realizację onClick metody.

0

Wystarczy wykomentuj

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

Domyślnie stan jest wyłączony. Przełączanie się dzieje, ponieważ jest również dodany detektor onclick, który przełącza ekran. Po prostu nie można go dodać i usunąć fragmentu kodu.

Najnowszy kod to // Konfigurowanie interakcji użytkownika w celu ręcznego wyświetlania lub ukrywania interfejsu systemowego.

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

po prostu wypowiedziało się przełącznik() i voila