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?
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?
Yanıtlar:
Bunu yapmanın genellikle üç yolu vardır:
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.
Manifestinize android:screenOrientation="portrait"(veya "landscape") ekleyerek etkinliği tek bir yönde kilitleyebilirsiniz <activity>.
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.
android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"benim için çalışıyor. Pacerier
android:configChanges="orientation|screenSize"API> = 13 değeriyle güncelleyin , çünkü birçok kişi yanıtınızı ana olarak görüyor!
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
android:configChanges="orientation|screenSize"
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!
<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.
onSaveInstanceState()ve kullanarak gerçek çözümü kullanın onCreate().
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 .
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 ."
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
}
}
manifest'teki tüm uygulama etkinliği etiketleri android:configChanges="keyboardHidden|orientation|screenSize"için ekleyin .
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.
Manifiest dosyasında her aktiviteye bunu ekleyin. Bu yardımcı olacak
android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
@Override
protected void onSaveInstanceState(Bundle b)
{
super.onSaveInstanceState(b);
String str="Screen Change="+String.valueOf(screenChange)+"....";
Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
screenChange=true;
}
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.
sadece kullan : android:configChanges="keyboardHidden|orientation"
Pacerier'in belirttiği gibi,
android:configChanges="orientation|screenSize"
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 :)
Bu kodu onCreate, etkinliğinizde,WebView
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
Screen.lockOrientation(this)numaralı telefonu arayın . Manifest'in kilidini açmaya izin verir.