2013-05-23 31 views
26

Czy można trwale usunąć pasek nawigacji z działania? Chcę usunąć pasek za pomocą przycisków wyświetlanych na przycisku na ekranie tabletu, a nie na pasku czynności. Here.Trwale ukryj pasek nawigacyjny w działaniu

Wiem, że nie zaleca się tego, nie podjąłem tej decyzji, ale muszę to zrobić. Na moim layoucie jest jeszcze jeden przycisk do opuszczenia działania. Reszta mojej aplikacji może mieć i ma pasek nawigacyjny.

Znalazłem ten kod i trochę go zaadaptowałem. Problem polega na tym, że nawet gdy ukrywam pasek nawigacji, pozostało czarne miejsce. Chyba system oblicza rozmiar ekranu uwzględniając pasek nawigacyjny?

public static class Content extends ImageView implements View.OnSystemUiVisibilityChangeListener, View.OnClickListener, ActionBar.OnMenuVisibilityListener { 
    Activity mActivity; 
    TextView mTitleView; 
    Button mPlayButton; 
    SeekBar mSeekView; 
    boolean mAddedMenuListener; 
    boolean mMenusOpen; 
    boolean mPaused; 
    boolean mNavVisible; 
    int mLastSystemUiVis; 

    Runnable mNavHider = new Runnable() { 
     @Override public void run() { 
      setNavVisibility(false); 
     } 
    }; 

    public Content(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setOnSystemUiVisibilityChangeListener(this); 
     setOnClickListener(this); 
    } 

    public void init(Activity activity, TextView title, Button playButton, 
      SeekBar seek) { 
     // This called by the containing activity to supply the surrounding 
     // state of the video player that it will interact with. 
     mActivity = activity; 
     mTitleView = title; 
     mPlayButton = playButton; 
     mSeekView = seek; 
     mPlayButton.setOnClickListener(this); 
     setPlayPaused(true); 
    } 

    @Override protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     if (mActivity != null) { 
      mAddedMenuListener = true; 
      mActivity.getActionBar().addOnMenuVisibilityListener(this); 
     } 
    } 

    @Override protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     if (mAddedMenuListener) { 
      mActivity.getActionBar().removeOnMenuVisibilityListener(this); 
     } 
    } 

    @Override public void onSystemUiVisibilityChange(int visibility) { 
     // Detect when we go out of nav-hidden mode, to clear our state 
     // back to having the full UI chrome up. Only do this when 
     // the state is changing and nav is no longer hidden. 
     int diff = mLastSystemUiVis^visibility; 
     mLastSystemUiVis = visibility; 
     if ((diff&SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0 
       && (visibility&SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) { 
      setNavVisibility(true); 
     } 
    } 

    @Override protected void onWindowVisibilityChanged(int visibility) { 
     super.onWindowVisibilityChanged(visibility); 

     // When we become visible or invisible, play is paused. 
     setPlayPaused(true); 
    } 

    @Override public void onClick(View v) { 
     if (v == mPlayButton) { 
      // Clicking on the play/pause button toggles its state. 
      setPlayPaused(!mPaused); 
     } else { 
      // Clicking elsewhere makes the navigation visible. 
      setNavVisibility(true); 
     } 
    } 

    @Override public void onMenuVisibilityChanged(boolean isVisible) { 
     mMenusOpen = isVisible; 
     setNavVisibility(true); 
    } 

    void setPlayPaused(boolean paused) { 
     mPaused = paused; 
     mPlayButton.setText(paused ? R.string.play : R.string.pause); 
     setKeepScreenOn(!paused); 
     setNavVisibility(true); 
    } 

    void setNavVisibility(boolean visible) { 
     int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
       | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
       | SYSTEM_UI_FLAG_LAYOUT_STABLE; 
     if (!visible) { 
      newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN 
        | SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
     } 

     // If we are now visible, schedule a timer for us to go invisible. 
     if (visible) { 
      Handler h = getHandler(); 
      if (h != null) { 
       h.removeCallbacks(mNavHider); 
       if (!mMenusOpen && !mPaused) { 
        // If the menus are open or play is paused, we will not auto-hide. 
        h.postDelayed(mNavHider, 1500); 
       } 
      } 
     } 

     // Set the new desired visibility. 
     setSystemUiVisibility(newVis); 
     mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE); 
     mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE); 
     mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE); 
    } 

} 
+0

Jak się masz? śpiewać ten kod? –

Odpowiedz

5

AFAIK, nie jest to możliwe bez dostępu do roota. Byłby problem z bezpieczeństwem, aby mieć aplikację, której nie można opuścić za pomocą przycisków systemowych.

Edit, zobacz tutaj: Hide System Bar in Tablets

4

Zmień motyw w swoim manifeście.

Jeśli chcesz ukryć paska nawigacji dla jednej czynności można użyć to:

<activity 
     android:name="Activity Name" 
     android:theme="@android:style/Theme.Black.NoTitleBar" 
     android:label="@string/app_name" > 

Jeśli chcesz ukryć NAV poprzeczkę dla całej aplikacji można użyć tego:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.Black.NoTitleBar" > 
+2

Chciałbym usunąć pasek nawigacji, a nie pasek akcji. Chcę ukryć przyciski pojawiające się u dołu ekranu na tablety. –

+0

cześć steve, są pewne problemy z niezrozumieniem tych odpowiedzi. każdy chce, abyś usunął pasek akcji. LOL. czy zdarzyło ci się to zrozumieć w wersji 4.0 i wyższej? dzięki – steveh

57

Istnieje rozwiązanie zaczynając KitKat (4.4.2), zwany Immersive Mode: https://developer.android.com/training/system-ui/immersive.html

Zasadniczo należy dodać ten kod do swojej onResume() Metoda:

View decorView = getWindow().getDecorView(); 
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
           | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_FULLSCREEN 
           | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
+1

należy przyjąć odpowiedź – Jaysbays

+7

To nie jest stałe. więc nie kwalifikuje się jako zaakceptowana odpowiedź. –

19

można

Istnieje Dwa sposoby:

1- korzeń urządzeniu, a następnie otwierać urządzenia w adb window command, a następnie uruchom następujące:

adb shell > 
su > 
pm disable com.android.systemui > 

i dostać go z powrotem po prostu zrobić to samo, ale do zmiany disableenable.

2- dodać następującą linię do końca build.prop plików urządzenia:

qemu.hw.mainkeys = 1 

następnie ją odzyskać po prostu ją usunąć.

a jeśli nie wiesz, jak edytować build.prop plik:

  • pobrania EsExplorer na urządzeniu i sprawdzić build.prop następnie zmienić jego uprawnienia do odczytu i zapisu, w końcu dodać linia.
  • pobierz specjalną aplikację edytora build.prop, taką jak build.propEditor.
  • lub odnieś się do that link.
+0

Czy wiesz dokładnie, która funkcjonalność ma com.android.systemui? – JohnyTex

+0

Czy wiesz, czy qemu.hw.mainkeys = 1 będzie działać dla wszystkich urządzeń z przyciskami oprogramowania? – JohnyTex

+0

@ JohnyTex com.android.systemui służy do wyłączania niektórych funkcji interfejsu użytkownika dodanych przez system, takich jak paski nawigacyjne i tapeta. A kiedy mówimy o qemu.hw.mainkeys = 1, co masz na myśli mówiąc "urządzenia z przyciskami oprogramowania"? –

2

Po obejrzeniu DevBytes video (Roman Nurik) i czytanie bardzo ostatni wiersz w Dokumenty, które mówi:

UWAGA: Jeśli podoba Ci się zachowanie automatycznego ukrycia IMMERSIVE_STICKY ale trzeba pokaż także własne kontrolki interfejsu użytkownika, po prostu użyj IMMERSIVE w połączeniu z Handler.postDelayed() lub czymś podobnym do ponownego wejścia w tryb immersyjny po kilku sekundach.

Odpowiedź, udzielona przez radu122, zadziałała dla mnie. Po prostu skonfiguruj handler'a i będzie ci dobrze.

Oto kod, który działa dla mnie:

@Override 
protected void onResume() { 
    super.onResume(); 
    executeDelayed(); 
} 


private void executeDelayed() { 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      // execute after 500ms 
      hideNavBar(); 
     } 
    }, 500); 
} 


private void hideNavBar() { 
    if (Build.VERSION.SDK_INT >= 19) { 
     View v = getWindow().getDecorView(); 
     v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
           | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_FULLSCREEN 
           | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
    } 
} 

Google mówi „po kilku sekundach” - ale chcę, aby zapewnić tę funkcjonalność jak najszybciej. Może zmienię wartość później, jeśli będę musiał, zaktualizuję tę odpowiedź.

+1

To jest najstraszniejszy sposób zrobić, ale google radził używać w taki sposób .. Naprawdę nie mogą zapewnić dobrego sposobu Zrób to? Co za idiokracja –

+0

Jestem z tobą. Może platforma zapewnia teraz lepsze rozwiązanie. –

+0

Obawiam się, że nie ... Obecnie próbuję znaleźć, ale nie ma mowy ... po prostu Google ssie wielki czas dając naprawdę pomocny apis –

12

Możesz ukryć pasek nawigacyjny, po prostu zadzwoń do tej metody na swojej onCreate(),

public void FullScreencall() { 
    if(Build.VERSION.SDK_INT < 19){ 
     View v = this.getWindow().getDecorView(); 
     v.setSystemUiVisibility(View.GONE); 
    } else { 
      //for higher api versions.  
     View decorView = getWindow().getDecorView(); 
     int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
     decorView.setSystemUiVisibility(uiOptions); 
    } 
} 

To ukryje całą nagiation panel.hope To pomaga

+1

Witam, w każdym razie, aby ukryć przyciski po wprowadzeniu fokusu w widoku sieciowym wyświetlającym słowo kluczowe? – Patrick

+1

To nie jest trwałe! –

+0

Typo? komentarz powinien powiedzieć // dla wyższych interfejsów API – user1010160

0

z dokumentacji Google:

Mona ukryj pasek nawigacji w Androidzie 4.0 i nowszych przy użyciu flagi SYSTEM_UI_FLAG_HIDE_NAVIGATION. Ten fragment ukrywa zarówno pasek nawigacji i pasek stanu:

View decorView = getWindow().getDecorView(); 
// Hide both the navigation bar and the status bar. 
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as 
// a general rule, you should design your app to hide the status bar whenever you 
// hide the navigation bar. 
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
       | View.SYSTEM_UI_FLAG_FULLSCREEN; 
decorView.setSystemUiVisibility(uiOptions); 

http://developer.android.com/training/system-ui/navigation.html

+0

To nie jest stałe. –

2

zacząć od ukrywanie w OnResume() aktywności wtedy też ukrywać, jak pokazano poniżej:

decorView.setOnSystemUiVisibilityChangeListener 
       (new View.OnSystemUiVisibilityChangeListener() { 
        @Override 
        public void onSystemUiVisibilityChange(int visibility) { 
         // Note that system bars will only be "visible" if none of the 
         // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set. 
         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
          //visible 
          hideSystemUI(); 
         } 
        } 
        } 
       });` 

    public void hideSystemUI() { 
     // Set the IMMERSIVE flag. 
     // Set the content to appear under the system bars so that the content 
     // doesn't resize when the system bars hide and show. 
     decorView.setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar 
         | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 
         | View.SYSTEM_UI_FLAG_IMMERSIVE); 
    } 
0

Moje rozwiązanie, aby ukryć pasek nawigacji, to:

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

    final View decorView = getWindow().getDecorView(); 
    decorView.setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() { 
     @Override 
     public void onSystemUiVisibilityChange(int visibility) { 
      if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
       decorView.setSystemUiVisibility(
         View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
           | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
           | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 
      } 
     } 
    }); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    final int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
    final View decorView = getWindow().getDecorView(); 
    decorView.setSystemUiVisibility(uiOptions); 
} 
+0

gdzie otrzymałeś 'getWindow()'? W moim końcu mówi: ** Nie można odczytać symbolu getWindow(). ** –