Android'de ekran döndürmeyi önleme


315

Bir AsyncTask başlatıyorum ve ekran döndürme yeniden başlatır çünkü dönmesini önlemek istiyorum faaliyetlerim var.

Bu etkinliği "Kullanıcı telefonunu deli gibi sallasa bile ekranı DÖNDÜRMEYİN" için bir yol var mı?



11
Ekran yönü değişikliği ve AsyncTasks ile başa çıkabilirsiniz. Ekran yönü değişikliklerini önlemek yalnızca tembel bir çözümdür. Ve bir AsyncTask'ı oryantasyon değişiklikleri arasında hayatta tutmak zor değil
Romain Guy


56
"Bir çözüm var ve zor değil" demek yerine, bir çözüm ya da bazı kod, Romain sağlamak çok daha yararlı olacaktır.
Peter vdL

2
kullanabilirsiniz setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy

Yanıtlar:


467

Ekle

android:screenOrientation="portrait" 

veya

 android:screenOrientation="landscape" 

<activity>manifest içindeki öğeye / öğelere


95
Bunun, uygulamanızdaki bir hatayı gizlediğini ve kullanıcıların bunun üzerinden geçme olasılığını azalttığını lütfen unutmayın. Ama yine de yapacaklar. Herhangi bir yapılandırma değişikliği etkinliğinizin yeniden başlamasına neden olabilir. Async görevi yeniden başlarken başa çıkmak için etkinliğinizi gerçekten yazmanız gerekir.
hackbod

1
Bu bir durumda benim için işe yaramadı. Uygulamayı açmadan önce ekranı yatay olarak ayarladım. Uygulamayı açtığımda ekran resme döndü ve ikinci bir çağrının eşzamansız hale gelmesine neden oldu.
user522559

2
"Dikey modda aç" VE "her zaman dikey modda kal " için ayarlamanız gerekir . Sadece 1 yapmak anlamsızdır.
Carol

1
@hackbod ne olursa olsun, bu "android uygulaması ekran döndürme önlemek," için 1 numaralı google hit ihtiyacım async görevleri ile ilgisi yok
chiliNUT

7
@hackbod Daha sonra bu sorunla başa çıkmak için faaliyetlerimizi nasıl doğru yazabiliriz?
user41805

127

Sen oto döndürme ekran önlemek için aşağıdaki mantığı takip edebilirsiniz ederken senin AsyncTaskçalışıyor:

  1. Mevcut ekran yönünüzü kullanarak etkinliğinizin içinde saklayın getRequestedOrientation().
  2. Düğmesini kullanarak otomatik ekran yönünü devre dışı bırakın setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. Çalıştırın / yürütün AsyncTask.
  4. AsyncTaskGeri yüklemenizin sonunda, önceki yönlendirme durumunuzu kullanarak geri yükleyin setRequestedOrientation(oldOrientation).

Activityİçinde bir (UI iş parçacığı üzerinde çalışır) özelliklerine erişmek için çeşitli yollar olduğunu lütfen unutmayın AsyncTask. AsyncTaskBir iç sınıf olarak uygulayabilir veya sınıfınızı Handlerdürten bir mesaj kullanabilirsiniz Activiy.


9
Seçilen cevaptan çok daha iyi.
Matej

3
harika fikir :) Geçerli ekran
yönünüzü saklamıyorsunuz

Bu inanılmaz görünüyor, @emre, teşekkürler! Öyle görünüyor "Çok iyi gerçek olamayacak kadar!" Sorun hakkında büyük miktarda tartışmaya dikkat edin: stackoverflow.com/q/3821423/294884 ... android uzmanları, burada herhangi bir olumsuzluk var mı ?! Tekrar teşekkürler .. çok.
Fattie

3
Bok !! Bu etmez İŞ cihazı PEYZAJ MODE BEGIN olursa. Ne oluyor be! Sux: O
Fattie,

@Emre, Bu kod bazı durumlarda çalışmaz. Örneğin, kullanıcı AsyncTask cihazınızın başlangıcı ile sonu arasındaki yönünü değiştirirse. O zaman yanlış yönelimi kurtarıp geri yüklersiniz.
Pacerier

27

Manifest dosyanızda, ekran döndürmeyi kilitlemek istediğiniz her Etkinlik için şunu ekleyin: yatay modda kilitlemek istiyorsanız:

<activity
        ...
        ...
        android:screenOrientation="landscape">

veya dikey modda kilitlemek istiyorsanız:

<activity
            ...
            ...
            android:screenOrientation="portrait">

24

Bunu yapmanın en kolay yolu

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

onCreate içinde, hemen sonra

setContentView(R.layout.activity_main);

yani...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

7

AndroidManifest'e girmek yerine bunu yapabilirsiniz:

screenOrientation = getResources().getConfiguration().orientation;
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
... AsyncTask

screenOrientation = getResources().getConfiguration().orientation;


@Override
protected void onPostExecute(String things) {
    context.setRequestedOrientation(PlayListFragment.screenOrientation);
    or 
    context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}

Buradaki tek dezavantaj, API seviye 18 veya daha üstünü gerektirmesidir. Yani temelde bu mızrağın ucu.


Bu bölüm, ev ve son uygulamalar düğmesini devre dışı bırakıyor ve SCREEN_ORIENTATION_FULL_SENSOR ile kilidi bıraktıktan sonra bile devre dışı durumda. Android
N.'de

6

Activity.java

@Override     
 public void onConfigurationChanged(Configuration newConfig) {       
        try {     
            super.onConfigurationChanged(newConfig);      
            if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {      
                // land      
            } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {      
               // port       
            }    
        } catch (Exception ex) {       
     }   

AndroidManifest.xml

 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name="QRCodeActivity" android:label="@string/app_name"
  android:screenOrientation="landscape" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

 </application>

2

AndroidManifest.xml dosyasında ACTIVITY ile ilgili aşağıdaki özellik yeterlidir:

android:configChanges="orientation"

Yani, tam etkinlik düğümü:

<activity android:name="Activity1"
          android:icon="@drawable/icon"
          android:label="App Name"
          android:excludeFromRecents="true"
          android:configChanges="orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

1

Ekle:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

1

AndroidManifest.xml'nize aşağıdakileri ekleyin

[app> src> ana> AndroidManifest.xml]

<activity android:name=".MainActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"/>

Misal:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.zzzzzz.yyyyy">

   <uses-permission android:name="A-PERMISSION" />

   <application>
      <activity android:name=".MainActivity"
                android:screenOrientation="portrait"
                android:configChanges="orientation">
      </activity>
   </application>

</manifest>

0

Eğer kullanıyorsanız Android Geliştirici Araçları (ADT) ve Eclipse size AndroidManifest.xml gidebilirsiniz -> Uygulama sekmesi -> inmek ve etkinliği seçin. Son olarak, tercih ettiğiniz yönü seçin. Birçok seçenekten birini seçebilirsiniz.


0

Aşağıdaki kodu manifest.xml dosyasına eklemelisiniz. Döndürmemesi gereken etkinlik, bu etkinliğe bu öğeyi ekleyin

android:screenOrientation="portrait"

Sonra dönmeyecek.


0

Bu şekilde deneyebilirsiniz

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itclanbd.spaceusers">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".Login_Activity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


0

Uygulama değiştirmenin ekran döndürmeyi önlemekten daha iyi bir yol olan AsyncTask'ı kullanmak yerine, etkinlik değişse bile verilerinizi güvende tutmak için AsyncTaskLoader'ı kullanın .


0

Ekran Döndürmesini Önle, Manifest'lerinize şu satırı ekleyin.

<activity
        android:name=".YourActivity"
        android:screenOrientation="portrait" />

Bu benim için çalışıyor.


0

kullanıcı "portrait"AndroidManifest.xml dosyanızdaki iyi bir çözüm gibi görünebilir. Ancak, belirli cihazları (manzarada en iyi şekilde çalışan), uygun yönlendirmeyi elde etmemek için portreye girmeye zorlar. En son Android sürümünde bir hata alırsınız. Bu yüzden önerim kullanmak daha iyi "nosensor".

<activity
        ...
        ...
        android:screenOrientation="nosensor">
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.