Android, beş yıldızlı büyük ekran uygulamalar için gereken tüm malzemeleri sağlar. Bu tarif defterindeki tarifler, belirli geliştirme sorunlarını çözmek için tercih ettiğiniz malzemeleri seçip bir araya getirir. Her yemek tarifi, büyük ekranda en iyi şef olmanıza yardımcı olacak en iyi uygulamaları, kalite kodu örneklerini ve adım adım talimatları içerir.
Yıldız puanları
Yemek tarifleri Büyük ekran uygulama kalitesi yönergelerine ne kadar uygun olduklarına göre yıldız puanına sahip olur.
1. Katman, farklı büyük ekran kriterlerini karşılıyor | |
2. Katman, optimize edilmiş büyük ekran ölçütlerini karşılıyor | |
3. Katman ve Büyük ekrana hazır olma ölçütlerini karşılıyor | |
Bazı büyük ekran özellikleri sağlar, ancak büyük ekran uygulaması kalite yönergelerine uygun değildir | |
Belirli bir kullanım alanının ihtiyaçlarını karşılıyor ancak büyük ekranları düzgün şekilde desteklemiyor. |
Chromebook kamera desteği
Google Play'de Chromebook kullanıcılarının fark edilmesini sağlayın.
Kamera uygulamanız yalnızca temel kamera özellikleriyle çalışabiliyorsa sırf ileri teknoloji telefonlarda bulunan gelişmiş kamera özelliklerini yanlışlıkla belirttiğiniz için uygulama mağazalarının Chromebook kullanıcılarının bu uygulamayı yüklemesini engellemesine izin vermeyin.
Chromebook'larda video konferans, anlık görüntü ve diğer uygulamalar için sorunsuz çalışan yerleşik bir ön (kullanıcıya yönelik) kamera bulunur. Ancak tüm Chromebook'larda arka (dünyaya doğru) kamera bulunmaz ve Chromebook'lardaki çoğu kullanıcıya dönük kamera otomatik odaklamayı veya flaşı desteklemez.
En iyi uygulamalar
Çok yönlü kamera uygulamaları, kamera yapılandırmasına bakılmaksızın tüm cihazları (ön kamerası olan cihazlar, arka kameralar ve USB ile bağlı harici kameralar) destekler.
Uygulama mağazalarının, uygulamanızı mümkün olan en fazla sayıda cihaza sunduğundan emin olmak için daima uygulamanız tarafından kullanılan tüm kamera özelliklerini belirtin ve özelliklerin gerekli olup olmadığını açıkça belirtin.
Malzemeler
CAMERA
izni: Uygulamanızın, cihazın kameralarına erişmesine izin verir<uses-feature>
manifest öğesi: Uygulama mağazalarına, uygulamanızın kullandığı özellikler hakkında bilgi verirrequired
özelliği: Uygulama mağazalarına, uygulamanızın belirtilen bir özellik olmadan çalışıp çalışamayacağını belirtir
Adımlar
Özet
CAMERA
iznini açıklayın. Temel kamera desteği sağlayan kamera özelliklerini belirtme. Her bir özelliğin gerekli olup olmadığını belirtin.
1. CAMERA
iznini bildirin
Uygulama manifest dosyasına aşağıdaki izni ekleyin:
<uses-permission android:name="android.permission.CAMERA" />
2. Temel kamera özelliklerini bildirme
Uygulama manifest dosyasına aşağıdaki özellikleri ekleyin:
<uses-feature android:name="android.hardware.camera.any" android:required="false" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
3. Her bir özelliğin gerekli olup olmadığını belirleme
Herhangi bir yerleşik veya harici kamerası olan ya da hiç kamerası olmayan cihazların uygulamanıza erişmesini sağlamak için android.hardware.camera.any
özelliğine ilişkin android:required="false"
değerini ayarlayın.
Arka kamerası, otomatik odaklama veya flaş olmayan Chromebook'lar gibi cihazlarda, uygulama mağazalarındaki uygulamanıza erişebilmeleri için diğer özelliklerde android:required="false"
ayarını yapın.
Sonuçlar
Chromebook kullanıcıları, uygulamanızı Google Play'den ve diğer uygulama mağazalarından indirip yükleyebilir. Telefon gibi tam özellikli kamera desteğine sahip cihazların da kamera işlevleri kısıtlanmayacaktır.
Uygulamanız tarafından desteklenen kamera özelliklerini açıkça ayarlayarak ve uygulamanızın gerektirdiği özellikleri belirterek uygulamanızı mümkün olduğunca fazla cihazın kullanımına sunmuş olursunuz.
Ek kaynaklar
Daha fazla bilgi için <uses-feature>
dokümanlarındaki Kamera donanımı özellikleri konusuna bakın.
Telefonlarda uygulama yönü kısıtlanır ancak büyük ekranlı cihazlarda geçerli olmaz
Uygulamanız dikey yönde telefonlarda harika bir şekilde çalıştığı için uygulamayı yalnızca dikey olarak kısıtladınız. Ancak büyük ekranlarda yatay yönde daha fazlasını yapma fırsatına sahipsiniz.
Uygulamayı küçük ekranlarda dikey yönle sınırlandırırken büyük ekranda yatay yönde etkinleştirmeyi nasıl sağlayabilirsiniz?
En iyi uygulamalar
En iyi uygulamalar, cihaz yönü gibi kullanıcı tercihlerine saygı gösterir.
Büyük ekran uygulama kalitesi yönergeleri, uygulamaların dikey ve yatay yönler, çoklu pencere modu ve katlanabilir cihazların katlanmış ve açılmış durumları da dahil olmak üzere tüm cihaz yapılandırmalarını desteklemesini önerir. Uygulamalar, düzenleri ve kullanıcı arayüzlerini farklı yapılandırmalar için optimize etmelidir ve uygulamalar, yapılandırma değişiklikleri sırasında durumu kaydedip geri yüklemelidir.
Bu yemek tarifi geçici bir önlem, biraz da büyük ekran desteği. Tüm cihaz yapılandırmaları için tam destek sağlamak üzere uygulamanızı iyileştirene kadar tarifi kullanın.
Malzemeler
screenOrientation
: Uygulamanızın cihaz yönü değişikliklerine nasıl tepki vereceğini belirtmenizi sağlayan uygulama manifesti ayarı- Jetpack WindowManager: Uygulama penceresinin boyutunu ve en boy oranını belirlemenizi sağlayan kitaplıklar grubu; API düzeyi 14'e geriye dönük uyumluluğa sahiptir
Activity#setRequestedOrientation()
: Çalışma zamanında uygulama yönünü değiştirebileceğiniz yöntem
Adımlar
Özet
Uygulamanın, uygulama manifest dosyasında varsayılan olarak yön değişikliklerini işlemesini sağlayın. Çalışma zamanında uygulama pencere boyutunu belirleyin. Uygulama penceresi küçükse manifest yönü ayarını geçersiz kılarak uygulamanın yönünü kısıtlayın.
1. Uygulama manifest'inde yön ayarını belirtin
Uygulama manifestinin screenOrientation
öğesini tanımlamaktan kaçınabilir (bu durumda yön varsayılan olarak unspecified
değerine ayarlanır) veya ekran yönünü fullUser
olarak ayarlayabilirsiniz. Kullanıcı sensöre dayalı döndürmeyi kilitlemediyse uygulamanız tüm cihaz yönlerini destekler.
<activity
android:name=".MyActivity"
android:screenOrientation="fullUser">
unspecified
ile fullUser
kullanımı arasındaki fark çok küçüktür ancak önemlidir. screenOrientation
değeri beyan etmezseniz yönü sistem seçer ve sistemin yönü tanımlamak için kullandığı politika cihazdan cihaza farklı olabilir. Diğer yandan, fullUser
belirtilmesi kullanıcının cihaz için tanımladığı davranışla daha yakından eşleşir: Kullanıcı sensöre dayalı döndürmeyi kilitlediyse uygulama, kullanıcının tercihini uygular. Aksi takdirde, sistem olası dört ekran yönünün herhangi birine (dikey, yatay, ters dikey veya ters yatay) izin verir. İlgili konu: android:screenOrientation
.
2. Ekran boyutunu belirleme
Manifest, kullanıcıların izin verdiği tüm yönleri destekleyecek şekilde ayarlandığında, uygulama yönünü ekran boyutuna göre programatik olarak belirtebilirsiniz.
Jetpack WindowManager kitaplıklarını modülün build.gradle
veya build.gradle.kts
dosyasına ekleyin:
Kotlin
implementation("androidx.window:window:version
") implementation("androidx.window:window-core:version
")
Modern
implementation 'androidx.window:window:version
' implementation 'androidx.window:window-core:version
'
Cihazın ekran boyutunu WindowMetrics
nesnesi olarak almak için Jetpack WindowManager WindowMetricsCalculator#computeMaximumWindowMetrics()
yöntemini kullanın. Yönün ne zaman kısıtlanacağına karar vermek için pencere metrikleri, pencere boyutu sınıflarıyla karşılaştırılabilir.
Windows boyut sınıfları, küçük ve büyük ekranlar arasındaki ayrılma noktalarını sağlar.
Ekran boyutunu belirlemek için WindowWidthSizeClass#COMPACT
ve WindowHeightSizeClass#COMPACT
ayrılma noktalarını kullanın:
Kotlin
/** Determines whether the device has a compact screen. **/ fun compactScreen() : Boolean { val metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this) val width = metrics.bounds.width() val height = metrics.bounds.height() val density = resources.displayMetrics.density val windowSizeClass = WindowSizeClass.compute(width/density, height/density) return windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.COMPACT || windowSizeClass.windowHeightSizeClass == WindowHeightSizeClass.COMPACT }
Java
/** Determines whether the device has a compact screen. **/ private boolean compactScreen() { WindowMetrics metrics = WindowMetricsCalculator.getOrCreate().computeMaximumWindowMetrics(this); int width = metrics.getBounds().width(); int height = metrics.getBounds().height(); float density = getResources().getDisplayMetrics().density; WindowSizeClass windowSizeClass = WindowSizeClass.compute(width/density, height/density); return windowSizeClass.getWindowWidthSizeClass() == WindowWidthSizeClass.COMPACT || windowSizeClass.getWindowHeightSizeClass() == WindowHeightSizeClass.COMPACT; }
- Not:
- Yukarıdaki örnekler bir etkinlik yöntemleri olarak uygulanır. Bu nedenle,
computeMaximumWindowMetrics()
bağımsız değişkeninde etkinliğinthis
olarak referansı kaldırılır. - Uygulama, ekran yönü ayarının yok sayıldığı çoklu pencere modunda başlatılabildiğinden
computeCurrentWindowMetrics()
yerinecomputeMaximumWindowMetrics()
yöntemi kullanılır. Uygulama penceresi cihaz ekranının tamamını kaplamadığı sürece uygulama pencere boyutunu belirlemenin ve yön ayarını geçersiz kılmanın bir anlamı yoktur.
computeMaximumWindowMetrics()
yöntemini uygulamanızda kullanılabilir hale getirmek için bağımlılık bildirmeyle ilgili talimatlar için WindowManager bölümüne bakın.
3. Uygulama manifesti ayarını geçersiz kıl
Cihazın kompakt ekran boyutuna sahip olduğunu belirledikten sonra, manifestin screenOrientation
ayarını geçersiz kılmak için Activity#setRequestedOrientation()
yöntemini çağırabilirsiniz:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requestedOrientation = if (compactScreen()) ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else ActivityInfo.SCREEN_ORIENTATION_FULL_USER ... // Replace with a known container that you can safely add a // view to where the view won't affect the layout and the view // won't be replaced. val container: ViewGroup = binding.container // Add a utility view to the container to hook into // View.onConfigurationChanged. This is required for all // activities, even those that don't handle configuration // changes. You can't use Activity.onConfigurationChanged, // since there are situations where that won't be called when // the configuration changes. View.onConfigurationChanged is // called in those scenarios. container.addView(object : View(this) { override fun onConfigurationChanged(newConfig: Configuration?) { super.onConfigurationChanged(newConfig) requestedOrientation = if (compactScreen()) ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else ActivityInfo.SCREEN_ORIENTATION_FULL_USER } }) }
Java
@Override protected void onCreate(Bundle savedInstance) { super.onCreate(savedInstanceState); if (compactScreen()) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER); } ... // Replace with a known container that you can safely add a // view to where the view won't affect the layout and the view // won't be replaced. ViewGroup container = binding.container; // Add a utility view to the container to hook into // View.onConfigurationChanged. This is required for all // activities, even those that don't handle configuration // changes. You can't use Activity.onConfigurationChanged, // since there are situations where that won't be called when // the configuration changes. View.onConfigurationChanged is // called in those scenarios. container.addView(new View(this) { @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (compactScreen()) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER); } } }); }
onCreate()
ve View.onConfigurationChanged()
yöntemlerine mantığı ekleyerek, maksimum pencere metriklerini elde edebilir ve etkinlik yeniden boyutlandırıldığında veya ekranlar arasında taşındığında (örneğin, cihaz döndürüldüğünde veya katlanabilir bir cihaz katlandığında ya da açıldığında) yön ayarını geçersiz kılabilirsiniz.
Yapılandırma değişikliklerinin ne zaman gerçekleştiği ve bu değişikliklerin etkinlik yeniden oluşturulmasına neden oldukları hakkında daha fazla bilgi edinmek için Yapılandırma değişikliklerini işleme başlıklı makaleyi inceleyin.
Sonuçlar
Uygulamanız artık küçük ekranlarda, cihazın döndürülmesinden bağımsız olarak dikey yönde kalmalıdır. Büyük ekranlarda uygulama yatay ve dikey yönleri desteklemelidir.
Ek kaynaklar
Uygulamanızı her zaman tüm cihaz yapılandırmalarını destekleyecek şekilde yeni sürüme geçirme konusunda yardım için aşağıdakilere bakın:
- Farklı ekran boyutlarını destekleme
- Yapılandırma değişikliklerini işleme
- Kullanıcı arayüzü durumlarını kaydetme
Medya oynatmayı harici klavyeyle duraklatma ve devam ettirme Boşluk tuşu
Büyük ekran optimizasyonu, videoların ve diğer medyaların oynatılmasını duraklatmak veya devam ettirmek için Boşluk çubuğuna basılması gibi harici klavye girişlerinin işlenebilmesini de içerir. Bu, özellikle harici klavyelere bağlanan tabletler ve genellikle harici klavyelerle gelen, ancak tablet modunda kullanılabilen Chromebook'lar için kullanışlıdır.
Medya, pencerenin tek öğesi olduğunda (tam ekran video oynatma gibi) tuşa basma etkinliklerine etkinlik düzeyinde veya Jetpack Compose'da ekran düzeyinde yanıt verin.
En iyi uygulamalar
Uygulamanız bir medya dosyası oynattığında, kullanıcılar fiziksel bir klavyedeki Boşluk tuşuna basarak oynatmayı duraklatıp devam ettirebilmelidir.
Malzemeler
KEYCODE_SPACE
: Boşluk çubuğu için anahtar kodu sabiti.
Oluşturma
onPreviewKeyEvent
: Bir bileşenin, (veya alt öğelerinden biri) odaklandığında donanım önemli etkinliklerine müdahale etmesini sağlayanModifier
.onKeyEvent
:onPreviewKeyEvent
ile benzer şekilde, buModifier
de bir bileşenin, odaklanıldığında donanımla ilgili önemli etkinliklere müdahale etmesini sağlar.
Görüntüleme sayısı
onKeyUp()
: Bir anahtar serbest bırakıldığında çağrılır ve bir etkinlik içindeki görünüm tarafından işlenmez.
Adımlar
Özet
Görünüm tabanlı uygulamalar ve Jetpack Compose'a dayalı uygulamalar klavye tuşlarına basmalara benzer şekilde yanıt verir: Uygulama, tuşa basma etkinliklerini dinlemeli, etkinlikleri filtrelemeli ve Boşluk tuşuna basma gibi seçili tuşlara yanıt vermelidir.
1. Klavye etkinliklerini dinleme
Görüntüleme sayısı
Uygulamanızdaki bir etkinlikte onKeyUp()
yöntemini geçersiz kılın:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { ... }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { ... }
Bu yöntem, basılan bir tuş her bırakıldığında çağrılır. Böylece, her tuş vuruşunda tam olarak bir kez etkinleşir.
Oluşturma
Jetpack Compose'u kullanarak ekranda tuş vuruşunu yöneten onPreviewKeyEvent
veya onKeyEvent
değiştiricisini kullanabilirsiniz:
Column(modifier = Modifier.onPreviewKeyEvent { event ->
if (event.type == KeyEventType.KeyUp) {
...
}
...
})
veya
Column(modifier = Modifier.onKeyEvent { event ->
if (event.type == KeyEventType.KeyUp) {
...
}
...
})
2. Boşluk çubuğuna basılmaları filtrele
Medya bileşeninize doğru etkinliği göndermek için onKeyUp()
yönteminde veya Oluşturma onPreviewKeyEvent
ve onKeyEvent
değiştirici yöntemlerinde KeyEvent.KEYCODE_SPACE
filtresi uygulayın:
Görüntüleme sayısı
Kotlin
if (keyCode == KeyEvent.KEYCODE_SPACE) { togglePlayback() return true } return false
Java
if (keyCode == KeyEvent.KEYCODE_SPACE) { togglePlayback(); return true; } return false;
Oluşturma
Column(modifier = Modifier.onPreviewKeyEvent { event ->
if (event.type == KeyEventType.KeyUp && event.key == Key.Spacebar) {
...
}
...
})
veya
Column(modifier = Modifier.onKeyEvent { event ->
if (event.type == KeyEventType.KeyUp && event.key == Key.Spacebar) {
...
}
...
})
Sonuçlar
Uygulamanız artık bir videoyu veya diğer medyaları duraklatmak ve devam ettirmek için Boşluk tuşu tuşuna basıldığında yanıt verebilir.
Ek kaynaklar
Klavye etkinlikleri ve bunların nasıl yönetileceği hakkında daha fazla bilgi edinmek için Klavye girişini işleme bölümüne bakın.
Ekran kaleminin avuç içini reddi
Ekran kalemi, büyük ekranlarda son derece üretken ve yaratıcı bir araç olabilir. Ancak kullanıcılar ekran kalemi kullanarak çizim yaparken, yazarken veya uygulamayla etkileşimde bulunurken bazen ekrana avuçlarıyla dokunurlar. Dokunma etkinliği, sistem tarafından yanlışlıkla avuç içi dokunma olarak algılanıp kapatılmadan uygulamanıza bildirilebilir.
En iyi uygulamalar
Uygulamanız gereksiz dokunma etkinliklerini tespit etmeli ve bunları yoksaymalıdır. Android, avuç içi dokunuşunu iptal etmek için MotionEvent
nesnesini gönderir. Avuç içi dokunma hareketinin neden olduğu hareketin reddedilip reddedilmeyeceğini belirlemek için nesnede ACTION_CANCEL
veya ACTION_POINTER_UP
ve FLAG_CANCELED
özelliklerini kontrol edin.
Malzemeler
MotionEvent
: Dokunma ve hareket etkinliklerini temsil eder. Bir etkinliğin göz ardı edilip edilmeyeceğini belirlemek için gereken bilgileri içerir.OnTouchListener#onTouch()
:MotionEvent
nesne alır.MotionEvent#getActionMasked()
: Bir hareket etkinliğiyle ilişkilendirilen eylemi döndürür.ACTION_CANCEL
: Bir hareketin geri alınması gerektiğini belirtenMotionEvent
sabit değeri.ACTION_POINTER_UP
: İlk işaretçi dışındaki bir işaretçinin yükseldiğini (yani cihaz ekranıyla temastan vazgeçtiğini) belirtenMotionEvent
sabit değeri.FLAG_CANCELED
: Yukarı giden işaretçinin istenmeyen bir dokunma etkinliğine neden olduğunu gösterenMotionEvent
sabit değeri. Android 13 (API düzeyi 33) ve sonraki sürümlerdeACTION_POINTER_UP
veACTION_CANCEL
etkinliklerine eklendi.
Adımlar
Özet
Uygulamanıza gönderilen MotionEvent
nesnelerini inceleyin. Etkinlik özelliklerini belirlemek için MotionEvent
API'lerini kullanın:
- Single-pointer etkinlikler -
ACTION_CANCEL
olup olmadığını kontrol edin. Android 13 ve sonraki sürümlerdeFLAG_CANCELED
olup olmadığını da kontrol edin. - Çok noktalı etkinlikler: Android 13 ve sonraki sürümlerde
ACTION_POINTER_UP
veFLAG_CANCELED
olup olmadığını kontrol edin.
ACTION_CANCEL
ve ACTION_POINTER_UP
/FLAG_CANCELED
etkinliklere yanıt verin.
1. Hareket etkinliği nesnelerini edinme
Uygulamanıza OnTouchListener
ekleyin:
Kotlin
val myView = findViewById<View>(R.id.myView).apply { setOnTouchListener { view, event -> // Process motion event. } }
Java
View myView = findViewById(R.id.myView); myView.setOnTouchListener( (view, event) -> { // Process motion event. });
2. Etkinlik işlemini belirleme ve işaretlemeleri
Tüm API düzeylerinde tek sayılık olay olduğunu belirten ACTION_CANCEL
olup olmadığını kontrol edin. Android 13 ve sonraki sürümlerde FLAG_CANCELED.
için ACTION_POINTER_UP
kontrol edin
Kotlin
val myView = findViewById<View>(R.id.myView).apply { setOnTouchListener { view, event -> when (event.actionMasked) { MotionEvent.ACTION_CANCEL -> { //Process canceled single-pointer motion event for all SDK versions. } MotionEvent.ACTION_POINTER_UP -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && (event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) { //Process canceled multi-pointer motion event for Android 13 and higher. } } } true } }
Java
View myView = findViewById(R.id.myView); myView.setOnTouchListener( (view, event) -> { switch (event.getActionMasked()) { case MotionEvent.ACTION_CANCEL: // Process canceled single-pointer motion event for all SDK versions. case MotionEvent.ACTION_UP: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && (event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) { //Process canceled multi-pointer motion event for Android 13 and higher. } } return true; });
3. Hareketi geri al
Avuç içi dokunmayı tanımladıktan sonra, hareketin ekrandaki efektlerini geri alabilirsiniz.
Avuç içi dokunma gibi istenmeyen girişlerin geri alınabilmesi için uygulamanızın kullanıcı işlemlerinin geçmişini saklaması gerekir. Örnek için Bir Android uygulamasında ekran kalemi desteğini geliştirme başlıklı makalede yer alan Temel bir çizim uygulaması uygulama bölümüne bakın.
Sonuçlar
Uygulamanız artık Android 13 ve sonraki API düzeylerinde çok noktalı etkinliklerde ve tüm API düzeylerinde tek noktalı etkinliklerde avuç içi dokunma işlemlerini tanımlayıp reddedebilir.
Ek kaynaklar
Daha fazla bilgi için aşağıdaki konulara bakın:
- Android 13 özellikleri ve API'leri - İyileştirilmiş avuç içi reddi
- Geliştirici kılavuzları
- Codelab — Android uygulamasında ekran kalemi desteğini geliştirme
WebView durum yönetimi
WebView
, durum yönetimi için gelişmiş bir sistem sunan, yaygın olarak kullanılan bir bileşendir. WebView
, yapılandırma değişikliklerinde durumunu ve kaydırma konumunu korumalıdır. Kullanıcı cihazı döndürdüğünde veya katlanabilir telefonu açtığında WebView
kaydırma konumunu kaybedebilir. Bu durum, kullanıcıyı tekrar WebView
öğesinin en üstünden önceki kaydırma konumuna kaydırmaya zorlar.
En iyi uygulamalar
WebView
öğelerinin yeniden oluşturulma sayısını en aza indirin. WebView
, durumunu yönetme konusunda iyidir ve mümkün olduğunca çok yapılandırma değişikliği yöneterek bu kaliteden yararlanabilirsiniz. Activity
yeniden oluşturma işlemi (sistemin yapılandırma değişikliklerini işleme şekli) WebView
öğesini de yeniden oluşturduğu için WebView
öğesinin durumunu kaybetmesi nedeniyle uygulamanız yapılandırma değişikliklerini işlemelidir.
Malzemeler
android:configChanges
: Manifest<activity>
öğesinin özelliği. Etkinlik tarafından işlenen yapılandırma değişikliklerini listeler.View#invalidate()
: Bir görünümün yeniden çizilmesine neden olan yöntem. Devralınan kaynak:WebView
.
Adımlar
Özet
WebView
durumunu kaydetmek için Activity
yeniden oluşturma işleminden mümkün olduğunca kaçının ve ardından WebView
öğesinin, durumunu korurken yeniden boyutlandırabilmesi için geçersiz kılmasına izin verin.
1. Uygulamanızın AndroidManifest.xml
dosyasına yapılandırma değişiklikleri ekleyin
Sistem tarafından değil, uygulamanız tarafından işlenen yapılandırma değişikliklerini belirterek yeniden etkinlik oluşturma işlemini önleyebilirsiniz:
<activity
android:name=".MyActivity"
android:configChanges="screenLayout|orientation|screenSize
|keyboard|keyboardHidden|smallestScreenSize" />
2. Uygulamanız her yapılandırma değişikliği aldığında WebView
geçersiz kılınır
Kotlin
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) webView.invalidate() }
Java
@Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); webview.invalidate(); }
Jetpack Compose'un Composable
öğelerini doğru şekilde yeniden boyutlandırmak için herhangi bir şeyi geçersiz kılmasına gerek olmadığından bu adım yalnızca görünüm sistemi için geçerlidir. Ancak Compose doğru şekilde yönetilmezse WebView
öğelerini sıklıkla yeniden oluşturur. Oluşturma uygulamalarınızda WebView
durumunu kaydetmek ve geri yüklemek için Accompanist WebView sarmalayıcısını kullanın.
Sonuçlar
Uygulamanızın WebView
bileşenleri, yeniden boyutlandırmadan yön değişikliğine, katlama ve açma işlemine kadar çeşitli yapılandırma değişikliklerinde durumlarını ve kaydırma konumlarını koruyor.
Ek kaynaklar
Yapılandırma değişiklikleri ve bunları yönetme hakkında daha fazla bilgi edinmek için Yapılandırma değişikliklerini işleme başlıklı makaleyi inceleyin.
RecyclerView durum yönetimi
RecyclerView
, grafik kaynaklarını minimum düzeyde kullanarak büyük miktarlarda veri görüntüleyebilir. RecyclerView
, öğe listesinde gezinirken yeni öğeler oluşturmak için ekranın dışına kaydırılan View
öğe örneğini yeniden kullanır.RecyclerView
Ancak, cihaz döndürme gibi yapılandırma değişiklikleri, RecyclerView
öğesinin durumunu sıfırlayarak kullanıcıları RecyclerView
öğelik listede tekrar önceki konumlarına kaydırmaya zorlayabilir.
En iyi uygulamalar
RecyclerView
tüm yapılandırma değişiklikleri sırasında durumunu (özellikle kaydırma konumunu) ve liste öğelerinin durumunu korumalıdır.
Malzemeler
RecyclerView.Adapter#setStateRestorationPolicy()
: Yapılandırma değişikliğinden sonraRecyclerView.Adapter
öğesinin durumunu nasıl geri yükleyeceğini belirtir.ViewModel
: Bir etkinlik veya parça için durumu korur.
Adımlar
Özet
RecyclerView
kaydırma konumunu kaydetmek için RecyclerView.Adapter
öğesinin durum geri yükleme politikasını belirleyin. RecyclerView
liste öğesinin durumunu kaydedin. Liste öğelerinin durumunu RecyclerView
bağdaştırıcısına ekleyin ve ViewHolder
öğesine bağlıyken liste öğelerinin durumunu geri yükleyin.
1. Adapter
eyaleti geri yükleme politikasını etkinleştir
RecyclerView
bağdaştırıcısının durum geri yükleme politikasını etkinleştirerek RecyclerView
öğesinin kaydırma konumunun, yapılandırma değişiklikleri genelinde korunmasını sağlayın. Politika spesifikasyonunu bağdaştırıcı oluşturucuya ekleyin:
Kotlin
class MyAdapter() : RecyclerView.Adapter() { init { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } ... }
Java
class MyAdapter extends RecyclerView.Adapter{ public Adapter() { setStateRestorationPolicy(StateRestorationPolicy.PREVENT_WHEN_EMPTY); } ... }
2. Durum bilgili liste öğelerinin durumunu kaydetme
EditText
öğeleri içeren öğeler gibi karmaşık RecyclerView
liste öğelerinin durumunu kaydedin. Örneğin, bir EditText
öğesinin durumunu kaydetmek için metin değişikliklerini yakalamak amacıyla onClick
işleyiciye benzer bir geri çağırma ekleyin. Geri çağırma işleminde, hangi verilerin kaydedileceğini tanımlayın:
Kotlin
input.addTextChangedListener( afterTextChanged = { text -> text?.let { // Save state here. } } )
Java
input.addTextChangedListener(new TextWatcher() { ... @Override public void afterTextChanged(Editable s) { // Save state here. } });
Geri çağırmayı Activity
veya Fragment
üzerinde beyan edin. Eyaleti depolamak için bir ViewModel
kullanın.
3. Liste öğesi durumunu Adapter
öğesine ekleyin
Liste öğelerinin durumunu RecyclerView.Adapter
cihazınıza ekleyin. Ana makineniz Activity
veya Fragment
oluşturulduğunda öğe durumunu bağdaştırıcıya iletin:
Kotlin
val adapter = MyAdapter(items, viewModel.retrieveState())
Java
MyAdapter adapter = new MyAdapter(items, viewModel.retrieveState());
4. Bağdaştırıcının ViewHolder
alanındaki liste öğesinin durumunu kurtar
RecyclerView.Adapter
içinde bir ViewHolder
öğesini bir öğeye bağladığınızda öğenin durumunu geri yükleyin:
Kotlin
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { ... val item = items[position] val state = states.firstOrNull { it.item == item } if (state != null) { holder.restore(state) } }
Java
@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { ... Item item = items[position]; Arrays.stream(states).filter(state -> state.item == item) .findFirst() .ifPresent(state -> holder.restore(state)); }
Sonuçlar
RecyclerView
cihazınız artık kaydırma konumunu ve RecyclerView
listesindeki her öğenin durumunu geri yükleyebilir.
Ek kaynaklar
Çıkarılabilir klavye yönetimi
Çıkarılabilir klavye desteği, büyük ekranlı cihazlarda kullanıcı üretkenliğini en üst düzeye çıkarmaya yardımcı olur. Android, bir cihaza her klavye takıldığında veya cihazdan çıkarıldığında bir yapılandırma değişikliği tetikler. Bu da kullanıcı arayüzü durumunun kaybına neden olabilir. Uygulamanız, durumunu kaydedip geri yükleyerek sistemin etkinlik yeniden oluşturma işlemini gerçekleştirmesine izin verebilir veya klavye yapılandırma değişiklikleri için etkinlik yeniden oluşturmayı kısıtlayabilir.
Her durumda, klavyeyle ilgili tüm veriler bir Configuration
nesnesinde depolanır. Yapılandırma nesnesinin keyboard
ve keyboardHidden
alanları, klavye türü ve kullanılabilirliği hakkında bilgi içerir.
En iyi uygulamalar
Büyük ekranlar için optimize edilen uygulamalar yazılım ve donanım klavyelerinden ekran kalemine, fareye, dokunmatik yüzeye ve diğer çevre birimi cihazlarına kadar her tür giriş cihazını destekler.
Harici klavye desteği, yapılandırma değişikliklerini içerir. Bu değişiklikleri şu iki yöntemden biriyle yönetebilirsiniz:
- Sistemin şu anda çalışan etkinliği yeniden oluşturmasına izin verin. Siz de uygulamanızın durumunu yönetmeyle ilgilenin.
- Yapılandırma değişikliğini kendiniz yönetin (etkinlik yeniden oluşturulmaz):
- Klavyeyle ilgili tüm yapılandırma değerlerini bildirin
- Yapılandırma değişiklik işleyicisi oluşturma
Genellikle metin girişi ve diğer girişler için kullanıcı arayüzünün hassas bir şekilde kontrol edilmesini gerektiren üretkenlik uygulamaları, yapılandırma değişikliklerini kendin yap yaklaşımından yararlanabilir.
Özel durumlarda, örneğin araçlara veya pencereleri düzenlemeye daha fazla yer açmak için bir donanım klavyesi takıldığında veya çıkarıldığında uygulamanızın düzenini değiştirmek isteyebilirsiniz.
Yapılandırma değişikliklerini dinlemenin tek güvenilir yolu bir görünümün onConfigurationChanged()
yöntemini geçersiz kılmak olduğundan, uygulama etkinliğinize yeni bir View örneği ekleyebilir ve klavyenin takılmasından veya çıkarılmasından kaynaklanan yapılandırma değişikliklerine görünümün onConfigurationChanged()
işleyicisinden yanıt verebilirsiniz.
Malzemeler
android:configChanges
: Uygulama manifestinin<activity>
öğesinin özelliği. Uygulamanın yönettiği yapılandırma değişiklikleri hakkında sistemi bilgilendirir.View#onConfigurationChanged()
: Yeni bir uygulama yapılandırmasının yayılmasına tepki veren yöntem.
Adımlar
Özet
configChanges
özelliğini tanımlama ve klavyeyle ilgili değerler ekleme. Etkinliğin görünüm hiyerarşisine bir View
ekleyin ve yapılandırma değişikliklerini dinleyin.
1. configChanges
özelliğini bildirin
keyboard|keyboardHidden
değerlerini halihazırda yönetilen yapılandırma değişiklikleri listesine ekleyerek uygulama manifest dosyasındaki <activity>
öğesini güncelleyin:
<activity
…
android:configChanges="...|keyboard|keyboardHidden">
2. Görünüm hiyerarşisine boş bir görünüm ekleme
Yeni bir görünüm tanımlayın ve işleyici kodunuzu görünümün onConfigurationChanged()
yöntemine ekleyin:
Kotlin
val v = object : View(this) { override fun onConfigurationChanged(newConfig: Configuration?) { super.onConfigurationChanged(newConfig) // Handler code here. } }
Java
View v = new View(this) { @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Handler code here. } };
Sonuçlar
Uygulamanız artık çalışmakta olan etkinliği yeniden oluşturmadan harici bir klavye takıldığında veya çıkarıldığında yanıt verir.
Ek kaynaklar
Klavye ekleme veya çıkarma gibi yapılandırma değişiklikleri sırasında uygulamanızın kullanıcı arayüzü durumunu nasıl kaydedeceğinizi öğrenmek için Kullanıcı arayüzü durumlarını kaydetme konusuna bakın.