Yön değiştiğinde uygulamayı yeniden yüklemeyin


152

Ekran döndürüldüğünde değiştirmek için hiçbir şeye ihtiyacım yok. Benim app ilk yüklemeden ve cihazı dönen gerektiğini rasgele resim gösterimi değil başka rasgele resmi seçin. Bu davranışı nasıl durdurabilirim?


1
Ekran yönünü koddan kilitlemek (ve muhtemelen kilidini açmak) da mümkündür. Bunun için github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/…Screen.lockOrientation(this) numaralı telefonu arayın . Manifest'in kilidini açmaya izin verir.
gak

@Escobar Ceaser Bu soru için doğru çözüm nedir?
Prabs

Bunu programlı olarak kod içinde yapmak istiyorum.
pollaris

Yanıtlar:


249

Bunu yapmanın genellikle üç yolu vardır:

  1. Bazı cevapların önerdiği gibi, faaliyetinizin ilk kez yaratıldığı ve geri yüklendiği vakaları ayırt edebilirsiniz savedInstanceState. Bu, onSaveInstanceStateparametresini geçersiz kılarak ve kontrol ederek yapılır onCreate.

  2. Manifestinize android:screenOrientation="portrait"(veya "landscape") ekleyerek etkinliği tek bir yönde kilitleyebilirsiniz <activity>.

  3. Sisteme android:configChanges="orientation|screenSize", <activity>etiketi değiştirerek ekran değişikliklerini kendiniz yapmak istediğinizi söyleyebilirsiniz . Bu şekilde etkinlik yeniden oluşturulmaz, ancak bunun yerine bir geri arama alırsınız (bu sizin için yararlı olmadığından yok sayabilirsiniz).

Şahsen ben (3) ile giderdim. Tabii eğer uygulamayı yönlerden birine kilitlemek sizin için iyi ise, (2) ile de gidebilirsiniz.


13
Yani # 3 için tek yapmam gereken manifestoma bu satırı eklemek mi? Çünkü işe yaramıyor.
Jimmy D


16
@EscobarCeaser, Android 3.2 ve üstü için ihtiyacınız varandroid:configChanges="orientation|screenSize"
Pacerier

9
android:configChanges="orientation|screenSize"benim için çalışıyor. Pacerier
Don

1
lütfen 3. yanıt durumunuzu android:configChanges="orientation|screenSize"API> = 13 değeriyle güncelleyin , çünkü birçok kişi yanıtınızı ana olarak görüyor!
radistao

215

Xion'un yanıtı yakındı, ancak android:configChanes="orientation"uygulama 12 veya daha düşük bir API düzeyine sahip olmadığı sürece # 3 ( ) çalışmaz.

API seviyesi 13 veya üzeri, yön değiştiğinde ekran boyutu değişir, bu da yönelim değiştiğinde etkinliğin yok edilmesine ve başlatılmasına neden olur.

Aşağıda yaptığım gibi "screenSize" özelliğini eklemeniz yeterlidir:

<activity
    android:name=".YourActivityName"
    android:configChanges="orientation|screenSize">
</activity>

Şimdi, yönü değiştirdiğinizde (ve ekran boyutu değiştiğinde), etkinlik durumunu korur ve onConfigurationChanged()çağrılır. Bu, yön değiştiğinde ekranda ne varsa (örneğin: Web görünümünde web sayfası) kalır.

Bunu bu siteden öğrendim: http://developer.android.com/guide/topics/manifest/activity-element.html

Ayrıca, bu görünüşe göre kötü bir uygulamadır, bu nedenle Çalışma Zamanı Değişikliklerini İşleme ile ilgili aşağıdaki bağlantıyı okuyun:

http://developer.android.com/guide/topics/resources/runtime-changes.html


2
Teşekkürler ... "oryantasyon" ile "screenSize" ekledikten sonra çalışması
Pratik Butani

Samsung Galaxy Nexus android 4.2.1'de çalışıyor! android:configChanges="orientation|screenSize"
Vincent Ducastel

İnanılmaz. Ben aktivite yeniden yükleme ve baştan bir video ile vardı bir sorunu çözmek için saatlerce kod üzerinden çalışıyor. Ve çözüm buradaydı! ++++ 1
Mathias Asberg

6
Kötü uygulama? Pfft, gerçek hayattaki insanların son tarihleri ​​var ve eğer çalışıyorsa işe yarıyor;)
Kacy

Bu kötü bir uygulama ise neden bu kadar çok oy aldı?
Sharp Edge

26

Sadece AndroidManifest.xmletkinlik etiketlerinin içine ve içine ya da oraya gitmelisiniz, orada birisinin söylediği gibi bu kod satırını yazmalısınız:

android:configChanges="orientation|screenSize"

Yani, böyle bir şey olacak:

<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>

Umarım çalışır!


benim düzen-arazi düzenimi yüklemiyor. :( benim için çalışmadı
piyush poriya

16
<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

Sadece android:configChanges="orientation|screenSize"manifest dosyasının etkinlik sekmesine ekleyin .

Bu nedenle, yön değiştiğinde Etkinlik yeniden başlamaz.


İşe yarıyor. Ama her yönelim için ayrı bir düzen kullandığımda layout.xml ve layout-land.xml. her iki yön için de peyzaj düzenini uyguluyor. Ben sadece "yönlendirme" kullanırsanız, onun beklediğimden veriyor ama yeniden yükleniyor. Bu konuda yardımcı olabilir misiniz?
Karthikeyan Ve

1
@KarthikeyanVe Hile yapmaya çalışırken sorun bu. Sen edeceğiz sahip değişim düzeni için faaliyeti yeniden canlandırmak. Devam edin ve sadece onSaveInstanceState()ve kullanarak gerçek çözümü kullanın onCreate().
Marc Plano-Lesay

@ MarcPlano-Lesay ve bunu nasıl yapmalıyım?
Ahsan

@ Gerçek çözüm şu soruda bağlantılıdır: geliştirici.android.com
/guide/topics/resources/…

@ MarcPlano-Lesay Dikey ve yatay mod için ayrı bir düzenim var, uygulamamı yatay veya dikey modda açarsam iyi çalışır, ancak çalışma zamanında yönünü değiştirmeye çalıştığımda uygulamamı kapatır, ancak uygulamama giriş yaptığımda ve sonra MainActivity'ye gidin ve o etkinliği yeniden yükler ve iyi çalışır şekilde yönlendirmeyi değiştirmeye çalışın. Şimdi soru neden? Kodumda mantıksal bir hata var mı? Idk, ama uygulamada birkaç kez hata ayıklamayı denedim ve hiçbir şey bulamıyorum. Dahası, etkinliğimi yeniden başlatmak istemiyorum, neden yapılandırma değiştiğinde ilgili düzeni ayarlayamıyoruz?
Ahsan

10

Benim deneyimime göre, varsayılan olmayan bir davranışı körüklemek yerine, yön değişiklikleriyle düzgün bir şekilde ilgilenmek daha iyidir.

Şu anda görüntülenmekte olan görüntüyü kaydetmeli ve onSaveInstanceState()uygulamanız onCreate()tekrar çalıştığında düzgün bir şekilde geri yüklemelisiniz .


# 3 tamamen geçerli bir çözümdür. Bu problemi çözmek için yapılmış tam araçtır. Neden ayakkabı attığını söylüyorsun?
Pacerier

1
@ Pacerer Sadece belgeleri okuyun. "Not: Kullanımdan android:configChangeskaçınılmalı ve yalnızca son çare olarak kullanılmalıdır. Yapılandırma değişikliği nedeniyle yeniden başlatmanın düzgün bir şekilde nasıl yapılacağı hakkında daha fazla bilgi için lütfen Çalışma Zamanı Değişikliklerini İşleme başlıklı makaleyi okuyun ."
Marc Plano-Lesay

Kaydetme ve geri yükleme örneği gönderir misiniz?
pollaris

6

Bu çözüm açık ara en iyi çözümdür. Manifest dosyanıza ekleyin

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

Ve aktivite sınıfınıza aşağıdaki kodu ekleyin

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //your code
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  //your code

    }
}

4

manifest'teki tüm uygulama etkinliği etiketleri android:configChanges="keyboardHidden|orientation|screenSize"için ekleyin .


3

Sadece bunu AndroidManifest.xml

<activity android:screenOrientation="landscape">

Yani, bir etkinlik etiketi var, bunu başka bir parametre olarak ekleyin. Dikey yönlendirmeye ihtiyacınız varsa manzarayı dikey olarak değiştirin. Bu yardımcı olur umarım.


im döndürme yeteneği ekran döndürme almak için değil. Ben sadece benim app yeniden yüklemek istemiyorum ... bahsettiğim gibi.
Jimmy D

ps ... bu zaten çalışmıyor. yalnızca uygulamayı belirli bir yönde görüntülenmeye zorlar. Ekranı döndürmek hala etkinliği yeniden yükler
Jimmy D

3

Manifiest dosyasında her aktiviteye bunu ekleyin. Bu yardımcı olacak

android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"

screenLayout benim için çalıştı, splitscreen için app yeniden boyutlandırırken yenileme engelledi
Terren

2

Yukarıdaki tüm cevaplar benim için çalışmıyor. Yani, aşağıdaki gibi labelile söz sabit screenOrientation. Şimdi her şey yolunda

<activity android:name=".activity.VideoWebViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>


1

Görüntü ayrıntılarını onPause()veya cihazınıza kaydedin ve görüntüyü geri yüklemek için onStop()içinde kullanın onCreate(Bundle savedInstanceState).

DÜZENLE:

Gerçek süreç hakkında daha fazla bilgi burada ayrıntılı olarak http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle , Honeycomb'da önceki Android sürümlerinden farklı olduğu için ayrıntılı olarak açıklanmaktadır.


aslında bunu onSaveInstanceState () yönteminde
yapmalısınız


1

Pacerier'in belirttiği gibi,

android:configChanges="orientation|screenSize"


-1

En iyi çözüm olup olmadığını bilmiyorum, ama ben burada tarif:

Her şeyden önce, sınıf ile sertifika gerekir Uygulamanızın uygulaması bu tezahüründe:

<application
    android:name=".App"
    ...

İkincisi, benim sınıf App böyle mi:

public class App extends Application {
    public static boolean isOrientationChanged = false;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onConfigurationChanged(@NotNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            isOrientationChanged = true;
        }
    }

}

Üçüncüsü, Yön Değişikliği için bir bayrak ayarlamanız gerekir, benim durumumda, her zaman uygulama gezintisindeki önceki etkinlik çağrıldığında onu ayarladım, bu nedenle sonraki etkinlik oluşturulduğunda yalnızca bir kez çağrılır.

isOrientationChanged = false;

Ekranımın yönünü bu bağlamda her değiştirdiğimde, bu ayarı her değiştirdiğinde ayarlıyorum, yönelimde bir değişiklik olup olmadığını kontrol ediyor, eğer öyleyse, o bayrağın değerine göre doğrular.

Temel olarak, yönlendirmeyi değiştiren her anı çağırdığı, uygulamayı sürekli çökerten asenkron bir güçlendirme isteği yaptığımda kullanmak zorunda kaldım:

if (!isOrientationChanged) {
    presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}

En zarif ve güzel çözüm olup olmadığını bilmiyorum, ama en azından burada işlevsel :)


-2

Bu kodu onCreate, etkinliğinizde,WebView

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

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

1
Bu nasıl olurdu? Sadece çalışma zamanına açıkça bir şey söylemiyor musun, varsayılan olarak ne yapardı?
Danielson
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.