2013-08-19 11 views
5

Mam aplikację, która pokazuje pełnoekranowe bitmapy w działaniu. Aby zapewnić szybki czas ładowania, ładuję je do pamięci. Ale kiedy ekran zmienia orientację, chciałbym wyczyścić pamięć podręczną, aby wypełnić ją ponownie bitmapami, które mieszczą się w nowych wymiarach. Jedynym problemem jest to, że aby to zrobić, muszę wykryć, kiedy nastąpi zmiana orientacji. Czy ktoś wie, jak to wykryć?Jak wykrywać, kiedy urządzenie przełącza się z trybu portretowego na poziomy?

+1

możliwe duplikat [ Jak wykrywać zmiany orientacji w układzie w systemie Android?] (Http://stackoverflow.com/questions/5726657/how-to-detect-orientation-change-in-layout-in -android) – Sam

Odpowiedz

23

Zobacz oficjalną dokumentację http://developer.android.com/guide/topics/resources/runtime-changes.html

Zmiana będzie faktycznie utworzyć nowy widok i onCreate zostanie wywołana ponownie.

Ponadto można sprawdzić poprzez

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
     Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

Wielkie dzięki za wspaniałą odpowiedź! –

+4

@noone: Należy zwrócić uwagę, że ta metoda zostanie WYŁĄCZNIE wybrana, jeśli wybrano konfiguracje, które mają być obsługiwane za pomocą atrybutu android.R.attr # configChanges w manifeście. Zobacz javadoc! – user504342

+0

Dzięki stary, to działa również dla mnie. – Suniel

2

Zwykle wywołania zmiany orientacji OnCreate(), chyba że zrobiłeś coś, aby inaczej.

Możesz umieścić tam logikę.

+0

Oczywiście ma sens, ale jak upewnić się, że nie ładuję ponownie pamięci podręcznej za każdym razem, gdy jest wywoływana funkcja onCreate? Metoda onCreate może zostać wywołana bezpośrednio po odtworzeniu działania po połączeniu telefonicznym, a pamięć podręczna nie powinna być ponownie ładowana w tej sytuacji. –

+1

@Poplitou zobacz odpowiedź Siika na temat 'onSavedInstanceState' oraz również http://stackoverflow.com/questions/4096169/onsaveinstancestate-and-onrestoreinstancestate – sealz

+0

Wielkie dzięki za link –

3

Można sprawdzić onSavedInstanceState od wybranej metody onCreate, jeśli to nie jest null Oznacza to zmiana konfiguracji.

+0

Dobra, rozumiem, jak to zrobić, dziękuję za wspaniałą odpowiedź! –

3

Innym podejściem jest używanie OrientationEventListener.

Może być stosowany tak:

OrientationEventListener mOrientationEventListener = new OrientationEventListener(
      this, SensorManager.SENSOR_DELAY_NORMAL) { 

     @Override 
     public void onOrientationChanged(int orientation) { 
      //checking if device was rotated 
      if (orientationPortrait != isPortrait(orientation)) { 
       orientationPortrait = !orientationPortrait; 
       Log.d(TAG, "Device was rotated!"); 
      } 
     } 
    }; 

Aby sprawdzić kierunek:

private boolean isPortrait(int orientation) { 
    return (orientation >= (360 - 90) && orientation <= 360) || (orientation >= 0 && orientation <= 90); 
} 

I nie zapomnij, aby włączać i wyłączać słuchacz:

if (mOrientationEventListener != null) { 
     mOrientationEventListener.enable(); 
    } 

if (mOrientationEventListener != null) { 
     mOrientationEventListener.disable(); 
    } 
+0

Myślę, że zmiana konfiguracji jest jedną rzeczą, w tym przypadku naConfigurationChanged jest drogą do zrobienia. Ale jeśli masz zablokowane zmiany orientacji i nadal chcesz otrzymywać powiadomienia, najlepszym wyborem są osoby nastawione na orientację. Dzięki Bogdan. – Murciegalo84

Powiązane problemy