2011-08-01 13 views
7

czy można wykryć obrót ekranu? Mam na myśli - tylko rotację, która wyraźnie odróżnia się od inicjowania działalności od innej działalności?Jak wykryć rotację ekranu?

Metody onXxx wydają się nie być przydatna dla próbowałem dodawanie/usuwanie flag z starting Intent (śm nie wydaje się znajdować odzwierciedlenie, obracania flaga jest tam), i próbowałem dodając androida: configChanges = "orientation" dla działania w manifeście, jednak metoda onConfigurationChanged wydaje się być wywoływana co drugi obrót ... podłączony.

Chyba brakuje mi czegoś ... ale nie znalazłem jasnego rozwiązania w innych powiązanych wątkach.

Wszelkie pomysły?

+0

masz na myśli, że zmienia się z krajobrazu na portret lub odwrotnie? – Pengume

+0

czy ten wątek nie jest taki sam? : http://stackoverflow.com/questions/4843809/how-do-i-detect-screen-rotation – Viren

+0

W metodzie onConfigurationChanged można wykryć, który typ ConfigurationChanged wystąpił, na przykład obrót ekranu. – mikepenz

Odpowiedz

11

Oczywisty:

<activity android:name=".MyActivity" android:configChanges="screenSize|orientation|screenLayout|navigation"/> 

aktywny:

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    Log.d("tag", "config changed"); 
    super.onConfigurationChanged(newConfig); 

    int orientation = newConfig.orientation; 
    if (orientation == Configuration.ORIENTATION_PORTRAIT) 
     Log.d("tag", "Portrait"); 
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE) 
     Log.d("tag", "Landscape"); 
    else 
     Log.w("tag", "other: " + orientation); 

    .... 
} 

tego linku również

How do I detect screen rotation

+0

Dziękuję za odpowiedź. Jednak próbowałem go, zanim napisałem pytanie, a to nie działa dla mnie, nie mam pojęcia dlaczego, ale onConfigurationChanged nie jest wywoływany za każdym razem. Jest wywoływana tylko wtedy, gdy orientacja staje się taka sama jak oryginał (co drugi raz). – MerlinBG

+0

gdzie testujesz? Czy możesz opublikować swój kod? Ponieważ przetestowałem to na telefonie i działało – Finuka

+0

testuję to na emulatorze i patrząc na widok LogCat. Kod jest 100% taka sama jak podana wyżej, bez kontroli Orientacja: android:configChanges="orientation|keyboard" w oczywisty (tylko dla tej działalności) i @Override \t public void onConfigurationChanged(Configuration newConfig) { \t \t super.onConfigurationChanged(newConfig); \t \t \t \t Log.d(" - ", "onConfigChanged"); // TODO remove \t } w klasie aktywności ... – MerlinBG

0

Dlaczego nie spróbować?

w onCreated uzyskać orientację telefonu:

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
myOrientation = display.getOrientation(); 

następnie zastąpić metodę onConfigurationChanged i sprawdź, czy orientacja zmieniła:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    if(newConfig.orientation != myOrientation) 
     Log.v(tag, "rotated"); 
    super.onConfigurationChanged(newConfig); 
} 

Nie zapomnij dodaj do manifestu android:configChanges="orientation" w działaniu.

1

Użyj metody onConfigurationChanged, aby wykryć obrót ekranu, nie jest dobrym pomysłem. Konfiguracja Zmiana tego działania nie działałaby prawidłowo, gdy użytkownik obróci ekran.

Używam tego rozwiązania, aby rozwiązać ten problem.

public class SampleActivity extends AppCompatActivity { 
    public static final String KEY_LAST_ORIENTATION = "last_orientation"; 
    private int lastOrientation; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 

     if (savedInstanceState == null) { 
      lastOrientation = getResources().getConfiguration().orientation; 
     } 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     checkOrientationChanged(); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     lastOrientation = savedInstanceState.getInt(KEY_LAST_ORIENTATION); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(KEY_LAST_ORIENTATION, lastOrientation); 
    } 

    private void checkOrientationChanged() { 
     int currentOrientation = getResources().getConfiguration().orientation; 
     if (currentOrientation != lastOrientation) { 
      onScreenOrientationChanged(currentOrientation); 
      lastOrientation = currentOrientation; 
     } 
    } 

    public void onScreenOrientationChanged(int currentOrientation) { 
     // Do something here when screen orientation changed 
    } 
} 

Ale kod nadal nie wystarczająco dobry, aby używać go w moim projekcie, więc zastosowałem ten kod do własnej biblioteki (https://github.com/akexorcist/ScreenOrientationHelper).

compile 'com.akexorcist:screenorientationhelper:<latest_version>' 

Można utworzyć klasę bazową aktywność jak ten

public class BaseActivity extends AppCompatActivity implements ScreenOrientationHelper.ScreenOrientationChangeListener { 
    private ScreenOrientationHelper helper = new ScreenOrientationHelper(this); 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     helper.onCreate(savedInstanceState); 
     helper.setScreenOrientationChangeListener(this); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     helper.onStart(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     helper.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     helper.onRestoreInstanceState(savedInstanceState); 
    } 

    @Override 
    public void onScreenOrientationChanged(int orientation) { 

    } 
} 

Następnie rozszerzyć działalność o tej klasie bazowej

public class MainActivity extends BaseActivity { 

    ... 

    @Override 
    public void onScreenOrientationChanged(int orientation) { 
     // Do something when screen orientation changed 
    } 
} 

Gotowe!

Powiązane problemy