Büyük ekranlı tarif defteri

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.

Beş yıldızlı değerlendirme 1. Katman, farklı büyük ekran kriterlerini karşılıyor
Dört yıldızlı değerlendirme 2. Katman, optimize edilmiş büyük ekran ölçütlerini karşılıyor
Üç yıldızlı değerlendirme 3. Katman ve Büyük ekrana hazır olma ölçütlerini karşılıyor
İki yıldızlı değerlendirme Bazı büyük ekran özellikleri sağlar, ancak büyük ekran uygulaması kalite yönergelerine uygun değildir
Bir yıldızlı değerlendirme 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

Üç yıldızlı değerlendirme

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 verir
  • required ö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

İki yıldızlı değerlendirme

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ğin this olarak referansı kaldırılır.
  • Uygulama, ekran yönü ayarının yok sayıldığı çoklu pencere modunda başlatılabildiğinden computeCurrentWindowMetrics() yerine computeMaximumWindowMetrics() 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:

Medya oynatmayı harici klavyeyle duraklatma ve devam ettirme Boşluk tuşu

Dört yıldızlı değerlendirme

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

Oluşturma

  • onPreviewKeyEvent: Bir bileşenin, (veya alt öğelerinden biri) odaklandığında donanım önemli etkinliklerine müdahale etmesini sağlayan Modifier.
  • onKeyEvent: onPreviewKeyEvent ile benzer şekilde, bu Modifier 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

Beş yıldızlı değerlendirme

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 belirten MotionEvent 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) belirten MotionEvent sabit değeri.
  • FLAG_CANCELED: Yukarı giden işaretçinin istenmeyen bir dokunma etkinliğine neden olduğunu gösteren MotionEvent sabit değeri. Android 13 (API düzeyi 33) ve sonraki sürümlerde ACTION_POINTER_UP ve ACTION_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ümlerde FLAG_CANCELED olup olmadığını da kontrol edin.
  • Çok noktalı etkinlikler: Android 13 ve sonraki sürümlerde ACTION_POINTER_UP ve FLAG_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:

WebView durum yönetimi

Üç yıldızlı değerlendirme

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

Üç yıldızlı değerlendirme

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

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

Üç yıldızlı değerlendirme

Çı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:

  1. Sistemin şu anda çalışan etkinliği yeniden oluşturmasına izin verin. Siz de uygulamanızın durumunu yönetmeyle ilgilenin.
  2. 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.