2012-06-14 5 views
10

Ustawiam tryb "light-out" dla mojej aplikacji na Androida, gdy działa na najnowszych telefonach i tabletach. W metodzie moim onCreate(), dodałem:Utrzymywanie trybu "light-out" (View.setSystemUiVisibility) dla ponownych uruchomień

View rootView = getWindow().getDecorView(); 
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); // aka View.SYSTEM_UI_FLAG_LOW_PROFILE 

To działa lepiej niż myślałem że będzie. Na moim tablecie z Androidem 3.2 pasek stanu zaczyna się w trybie niskoprofilowym (wszystkie przyciski na pasku są zastępowane kropkami). Jeśli wchodzę w interakcje z przyciskami na pasku, stanie się to normalne, a następnie powróci do trybu niskiego profilu (np. Jeśli sprawdzę okno konfiguracji/powiadomień na pasku stanu). Wygląda więc na to, że jest to bardziej właściwość mojej aplikacji niż "polecenie" do bezpośredniego ukrycia interfejsu użytkownika.

Istnieją jednak dwa narożne przypadki, które nie są obsługiwane. Po pierwsze, jeśli użytkownik dotknie paska stanu bez uderzania w żadną kropkę, pasek staje się aktywny. Nigdy nie wraca do trybu niskiego profilu, dopóki użytkownik nie wejdzie w interakcję z czymś na pasku (np. Obejrzy powiadomienia lub zrobi zrzut ekranu). Jeśli więc wrócą do interakcji z moją aplikacją, pasek stanu nie będzie już w trybie niskoprofilowym. (Wygląda na to, że aplikacja Gallery również ma ten problem, więc może to nie tylko ja.) Drugi przypadek rogu to wznowienie z ekranu blokady. Jeśli dotknę przycisku zasilania, aby zablokować tablet, a następnie odblokować go i wznowić aplikację, pasek stanu jest w pełni widoczny (a interakcja z nim nic nie zmienia). (Aplikacja Galeria nie ma tego problemu.)

Kilka wpisów na blogu sugeruje, że mogę ustawić program obsługi, aby wykrywał zmiany widoczności interfejsu użytkownika systemu, a następnie ponownie ukryć interfejs użytkownika, jeśli stanie się widoczny. Tak:

rootView.setOnSystemUiVisibilityChangeListener(
    new View.OnSystemUiVisibilityChangeListener() { 
    @Override 
    public void onSystemUiVisibilityChange(int visibility) { 
     if (visibility == View.STATUS_BAR_VISIBLE) { 
     game.flagUIIsVisible(); 
     } 
    } 
    }); 

w moim przypadku, metoda na obiekcie game prostu ustawia flagę mówiąc UI poszedł niewidoczne. Później, jeśli w mojej aplikacji są jakieś zdarzenia dotykowe (obsługiwane są one przez ten sam obiekt game) i ta flaga jest ustawiona, ponownie wywołuję wywołanie STATUS_BAR_HIDDEN.

Jednak w przypadku tych wywołań zwrotnych nie ma widocznego wpływu na interfejs użytkownika. Widzę, że prawy przewodnik jest wywoływany z niektórych komunikatów dziennika i widzę, że wywoływany jest wywoływacz.

Próbowałem również wywoływać wywołanie STATUS_BAR_HIDDEN w mojej ścieżce onResume, ale to też nie miało znaczenia.

Szukam informacji, że jest to znany błąd lub wskazówki, co może robić aplikacja Galeria (zakładając, że robi coś inaczej). Lub sugestie dotyczące innych API do wypróbowania (lub inne szczegóły, które mogą być istotne).

Używam libGDX, a moja aplikacja ma tylko jeden widok, więc jest całkiem prosta. Widok jest również ustawiony jako pełnoekranowy bez tytułu przez libGDX. W moim manifeście mam ustawioną wartość targetSdkVersion na 15.

Odpowiedz

5

Podejrzewam, że w systemie Android 3.2 wystąpił błąd, ponieważ mogę obejść problem z wyświetlaniem wznowienia z ekranu blokady poprzez ponowne włączenie paska stanu przed wyłączeniem go w onResume. Nr OnSystemUiVisibilityChangeListener jest potrzebny.

szczególności, w moim onResume ścieżki mam kod jak poniżej:

View rootView = getWindow().getDecorView(); 
rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); 
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); 

pozornie niepotrzebne wezwanie, aby pasek stanu widoczny, wydaje się, aby późniejsze wezwanie, aby pasek stanu ukryte rzeczywiście działa po odblokowaniu urządzenie.

1

to ustalone mój problem:

rootView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { 
    @Override 
    public void onSystemUiVisibilityChange(int visibility) { 
     if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) { 
      rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); 
      rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 
     } 
    } 
}); 

Dzięki P.T.!

+0

+1, to ustalone mój problem też: D – Houssni

2

Android 4.2 tutaj, na tablecie Samsung - Twoje rozwiązania nie działa dla mnie, ja rzeczywiście udało się to zrobić z ValuAnimator zwolniony tuż po onSystemUiVisibilityChange z onAnimationEnd słuchacza

 topView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { 
      @Override 
      public void onSystemUiVisibilityChange(int visibility) { 
      hideMenu(); 
      } 
     }); 

    private void hideMenu(){ 

    ValueAnimator hideAnim = ValueAnimator.ofInt(1,2); 
    hideAnim.setDuration(1); 
    hideAnim.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      topView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 
     } 
    }); 
    hideAnim.start(); 

} 
Powiązane problemy