2012-10-18 16 views
8

Pracuję nad aplikacją dla systemu Android, która powinna działać tylko w trybie portretu ze względu na układ, który nie pasuje do ekranu poziomego telefonu. Jednak na tabletach i netbookach chcę, aby aplikacja działała tylko w trybie poziomym.setRequestedOrientation przed wyświetleniem ProgressDialog prowadzi do awarii

Próbowałem teraz sprawdzić, czy aplikacja działa na tablecie i ustawia odpowiednią orientację za pomocą metody setRequestedOrientation.

Problem polega na tym, że aplikacja zawiesza się teraz, gdy urządzenie nie jest jeszcze trzymane w wybranej przeze mnie orientacji, ponieważ wyświetlam komunikat progressDialog krótko po wywołaniu funkcji setRequestedOrientation, która wydaje się wówczas przeciekać przez okno.

Logcat mówi:

10-18 21:15:30.698: E/WindowManager(653): Activity has leaked window [email protected] that was originally added here 
10-18 21:15:30.698: E/WindowManager(653): android.view.WindowLeaked: Activity has leaked window [email protected] that was originally added here 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
10-18 21:15:30.698: E/WindowManager(653): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
10-18 21:15:31.888: E/WindowManager(653): Activity has leaked window [email protected] that was originally added here 
10-18 21:15:31.888: E/WindowManager(653): android.view.WindowLeaked: Activity has leaked window com.android.internal.policy.impl.Ph[email protected] that was originally added here 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
10-18 21:15:31.888: E/WindowManager(653): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:599) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:336) 
10-18 21:15:34.168: E/AndroidRuntime(653): at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:151) 

Co mogę zrobić, aby zapobiec tej katastrofie? Każda pomoc będzie bardzo ceniona.

EDYTOWANIE: Ponieważ nie byłem w stanie rozwiązać tego problemu, w końcu udało mi się edytować mój układ, aby teraz można było go używać w trybie pionowym i poziomym.

Odpowiedz

11

Czy masz kod źródłowy, który możesz wyświetlić? To może pomóc w zidentyfikowaniu problemu.

Rzeczywiście miałem dokładnie ten sam problem. Ale działo się to tylko w przypadku niektórych moich działań.

Po zmianie orientacji ekranu system Android faktycznie niszczy i odtwarza aktywność.

Tak, miałem kod, który wyglądał tak.

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     setContentView(R.layout.displayscreen); 

     bottomButton = (Button) findViewById(R.id.bottomButton); 
     bottomButton.setOnClickListener(bottomButtonClick); 
     bottomButton.setTypeface(font); 
     bottomButton.setTextSize(16); 
} 

Zobacz, co się dzieje, to, że widok nie został poprawnie podłączony do menedżera okien. Postanowiłem więc, że oncreate może nie jest najlepszym miejscem do robienia tego.

Zamiast tego dodałem go do mojego wznowienia i działa. Podobnie jak:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.displayscreen); 

     bottomButton = (Button) findViewById(R.id.bottomButton); 
     bottomButton.setOnClickListener(bottomButtonClick); 
     bottomButton.setTypeface(font); 
     bottomButton.setTextSize(16); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

Niestety powoduje to również, że działalność nadal jest niszczona i odtwarzana. Dzwonię do onCreate i onResume dwa razy ... Nie dobrze, prawda?

Aby naprawić ten problem. Musisz dodać to do swojego manifestu Android dla swojej aktywności.

android:configChanges="keyboardHidden|orientation" 

przykład:

<activity 
    android:name="com.Test.Info.DisplayInfo" 
    android:configChanges="keyboardHidden|orientation" 
    android:label="@string/info"> 
</activity> 

Kod ten zapobiega zniszczyć/ponownego cyklu.

Mam nadzieję, że to pomoże!

Cheers

+1

Dzięki za napisanie tak długiej odpowiedzi, ale niestety to nie rozwiązało mojego problemu. –

+0

Bez problemu. Przepraszam, że ci nie pomogło. Następnym razem, jeśli dodasz kod źródłowy, pomoże ci to w śledzeniu konkretnego problemu. Miałem podobny problem i działało to dla mojego konkretnego problemu. Cieszę się, że to działa. – Dave

+1

Dzięki, twoja odpowiedź uratowała mnie Dave! Właściwie musisz ustawić "android: configChanges =" orientacja "' w manifeście i wywołać 'setRequestedOrientation()' na początku 'onCreate()';) –

9

Jeśli używasz

setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR); 

tymczasowo zablokować i

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

aby odblokować obracania ekranu, może wpadł następnego problem.

Jeśli użyjesz tej metody do zablokowania orientacji ekranu, a urządzenie nie ma domyślnej orientacji, przełączy się na domyślną orientację, niszcząc i tworząc swoją aktywność. Twoja aplikacja zawiesi się, ponieważ próbujesz zaktualizować jakiś zniszczony progressDialog.

Powiązane problemy