Jetpack Window Manager untuk Xamarin
Tip
Pengguna Xamarin.Forms harus mereferensikan dukungan Xamarin.Forms.DualScreen NuGet for Surface Duo, dengan DualScreenInfo
kelas dan TwoPaneView
.
Jetpack Window Manager ditujukan untuk pengembang yang bekerja dengan proyek Xamarin.Android.
Jetpack Window Manager menyediakan API standar untuk bekerja dengan semua perangkat yang dapat dilipat. Ini berisi dua kelas penting:
- DisplayFeature - Mengidentifikasi gangguan di permukaan layar datar berkelanjutan seperti engsel atau lipatan. Window Manager akan mengembalikan kumpulan fitur tampilan dari panggilan balik perubahan tata letak.
- FoldingFeature - Menyediakan informasi tentang fitur perangkat tertentu - sementara Surface Duo hanya memiliki satu fitur lipatan, ada kemungkinan perangkat lain mungkin memiliki lebih banyak. Kelas menyediakan
FoldingFeature
informasi tentang status bagian perangkat tersebut, dengan properti untukBounds
danIsSeparating
, dan metode untukOcclusionType
,Orientation
, danState
.
Sampel yang menggunakan Jetpack Window Manager tersedia di repositori surface-duo-sdk-xamarin-samples.
Catatan
Xamarin.AndroidX.Window.WindowJava NuGet dimaksudkan untuk menggantikan kebutuhan untuk menambahkan Xamarin.DuoSDK NuGet ke aplikasi Xamarin.Android.
Alih-alih menggunakan ScreenHelper
kelas untuk menentukan IsDualMode
atau ke GetHingeBoundsDip()
, Anda dapat menggunakan metode dan properti pada WindowInfoTracker
dan kelas terkait secara langsung.
Untuk menggunakan WindowInfoTracker
kode Anda, ikuti petunjuk di bawah ini (dari aplikasi sampel Xamarin.Android Window Manager):
Menambahkan dependensi
Untuk menambahkan NuGet yang menyediakan fitur Jetpack Window Manager:
Klik kanan pada proyek Xamarin.Android Anda dan pilih Kelola Paket NuGet...
Cari Xamarin.AndroidX.Window.WindowJava.
Pilih nomor versi tertinggi untuk ditambahkan ke proyek Anda (1.0.0.7 adalah versi stabil pertama dari API).
Menggunakan Jetpack Window Manager dalam kode Anda
Di kelas MainActivity , deklarasikan variabel untuk pelacak informasi jendela:
public class MainActivity : AppCompatActivity, IConsumer { WindowInfoTrackerCallbackAdapter wit;
Pastikan bahwa pernyataan dan
using AndroidX.Window.Java.Layout;
yang benarusing AndroidX.Window.Layout;
ditambahkan ke bagian atas file.Catatan
Aktivitas juga mengimplementasikan
IConsumer
, lihat langkah 4 di bawah ini untuk kode untuk metode yangAccept
diperlukan oleh antarmuka ini.Inisialisasi manajer jendela di aktivitas
OnCreate
Anda:protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); wit = new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.Companion.GetOrCreate(this));
Sekarang buat fungsi yang mengembalikan
IExecutor
implementasi sehingga kami menyediakannya ke panggilan balik sebagai parameter pertama dan akan dipanggil menggunakannya. Kita akan membuat yang berjalan pada utas UI, Anda dapat membuat yang berbeda yang tidak berjalan pada utas UI jika diperlukan.IExecutor runOnUiThreadExecutor() { return new MyExecutor(); } class MyExecutor : Java.Lang.Object, IExecutor { Handler handler = new Handler(Looper.MainLooper); public void Execute(IRunnable r) { handler.Post(r); } }
Tentukan kelas dalam untuk menangani panggilan balik saat tata letak perlu berubah. Aktivitas harus memiliki TextView yang dipanggil
layoutChange
sehingga metode ini dapat memperbarui teks yang ditampilkan:public void Accept(Java.Lang.Object newLayoutInfo) // Object will be WindowLayoutInfo { var newLayoutInfo = (newLayoutInfo as WindowLayoutInfo); // have to cast before use layoutChange.Text = newLayoutInfo.ToString(); configurationChanged.Text = "One logic/physical display - unspanned"; foreach (var displayFeature in newLayoutInfo.DisplayFeatures) { var foldingFeature = displayFeature.JavaCast<IFoldingFeature>(); if (foldingFeature != null) { alignViewToDeviceFeatureBoundaries(newLayoutInfo); if (foldingFeature.GetOcclusionType() == FoldingFeatureOcclusionType.None) { configurationChanged.Text = "App is spanned across a fold"; } if (foldingFeature.GetOcclusionType() == FoldingFeatureOcclusionType.Full) { configurationChanged.Text = "App is spanned across a hinge"; } configurationChanged.Text += "\nIsSeparating: " + foldingFeature.IsSeparating + "\nOrientation: " + foldingFeature.Orientation // FoldingFeatureOrientation.Vertical or Horizontal + "\nState: " + foldingFeature.State; // FoldingFeatureState.Flat or State.HalfOpened } else { Log.Info(TAG, "DisplayFeature is not a fold/hinge"); } } }
Catatan
Kelas
WindowLayoutInfo
memiliki koleksiDisplayFeature
item, satu atau beberapa di antaranya bisa menjadi instansFoldingFeature
. Instans fitur lipatan memiliki properti untukBounds
danIsSeparating
, dan metode untukOcclusionType
,Orientation
, danState
yang dapat Anda kueri untuk membuat keputusan tentang cara menyesuaikan tata letak Anda untuk status baru.OnStart
Dalam penimpaan, daftarkanAddWindowLayoutInfoListener
handler dan teruskan pelaksanaIConsumer
dan referensi ke aktivitas (karena mengimplementasikan ).protected override void OnStart() { base.OnStart(); wit.AddWindowLayoutInfoListener(this, runOnUiThreadExecutor(), this); // first `this` is the Activity context, second `this` is the IConsumer implementation }
Ingatlah untuk menghapus pendengar:
protected override void OnStop() { base.OnStop(); wit.RemoveWindowLayoutInfoListener(this); }
Ketika kode ini dijalankan, aktivitas akan diperbarui dengan postur perangkat saat ini dan fitur tampilan (jika membentur di lipatan atau engsel). Tambahkan kode tambahan ke panggilan balik untuk memeriksa informasi tambahan dalam
FoldingFeature
objek.
Sampel
Sampel Window Manager memperlihatkan informasi perangkat di layar seperti yang ditunjukkan pada cuplikan layar ini: