Gezinme, bağımsız değişkenleri tanımlayarak bir gezinme işlemine veri eklemenize olanak sağlar bir yer işaretidir. Örneğin, bir kullanıcı profili hedefi bir kullanıcı kimliği alabilir bağımsız değişkenini kullanarak bir hata bildiriminde bulunur.
Genel olarak yalnızca minimum miktarda veri iletmeyi
ekleyebilirsiniz. Örneğin, bir nesneyi almak için
nesnenin kendisini geçirmek yerine, kaydedilen tüm durumlar için toplam alan
Android'de sınırlıdır. Büyük miktarda veri iletmeniz gerekiyorsa
açıklandığı şekilde bir ViewModel
ViewModel'e genel bakış.
Hedef bağımsız değişkenlerini tanımlayın
Hedefler arasında veri aktarmak için önce bağımsız değişkeni alan hedefi şu adımları izleyin:
- Gezinme Düzenleyici'de bağımsız değişkeni alan hedefi tıklayın.
- Özellikler panelinde Ekle'yi (+) tıklayın.
- Açılan Bağımsız Değişken Bağlantısı Ekle penceresinde bağımsız değişken adını girin, bağımsız değişkenin null olup olmadığı ve bağımsız değişkene ait bir varsayılan değer gerekir.
- Ekle'yi tıklayın. Bağımsız değişkenin artık Bağımsız değişkenler içinde göründüğüne dikkat edin. Özellikler panelinde görünür.
- Ardından, sizi bu hedefe götürecek ilgili işlemi tıklayın. Artık Özellikler panelinde yeni eklenen bağımsız değişkeninizi görebilirsiniz. Bağımsız Değişken Varsayılan Değerleri bölümündeki
Bağımsız değişkenin XML biçiminde de eklendiğini görebilirsiniz. Metin sekmesini tıklayın. XML görünümüne geçin ve bağımsız değişkeninizin bağımsız değişkeni alan hedeftir. Aşağıda bir örnek gösterilmektedir:
<fragment android:id="@+id/myFragment" > <argument android:name="myArg" app:argType="integer" android:defaultValue="0" /> </fragment>
Desteklenen bağımsız değişken türleri
Gezinme kitaplığı aşağıdaki bağımsız değişken türlerini destekler:
Tür | app:argType söz dizimi | Varsayılan değerler için destek | Rotalar tarafından yönetiliyor | Boş değer atanabilir |
---|---|---|---|---|
Tam sayı | app:argType="integer" | Evet | Evet | Hayır |
Havada Süzülen | app:argType="float" | Evet | Evet | Hayır |
Uzun | app:argType="long" | Evet: Varsayılan değerler her zaman "L" ile bitmelidir sonek (ör. "123L"). | Evet | Hayır |
Boole | app:argType="boole" | Evet - "true" veya "false" | Evet | Hayır |
Dize | app:argType="dize" | Evet | Evet | Evet |
Kaynak Referansı | app:argType="reference" | Evet - Varsayılan değerler "@resourceType/resourceName" biçiminde olmalıdır (ör. "@style/myCustomStyle") veya "0" | Evet | Hayır |
Özel Parçalanabilir | app:argType="<type>", burada <type> Parcelable öğesinin tam sınıf adıdır |
Varsayılan "@null" değerini destekler. Diğer varsayılan değerleri desteklemez. | Hayır | Evet |
Özel Serileştirilebilir | app:argType="<type>", burada <type> Serializable öğesinin tam sınıf adıdır |
Varsayılan "@null" değerini destekler. Diğer varsayılan değerleri desteklemez. | Hayır | Evet |
Özel Sıralama | app:argType="<type>", burada <type> enum'un tam nitelikli adıdır | Evet - Varsayılan değerler, nitelendirilmemiş adla eşleşmelidir (ör. MyEnum.FAILED ile eşleşmesi için "BAŞARILI") | Hayır | Hayır |
Bağımsız değişken türü boş değerleri destekliyorsa
android:defaultValue="@null"
kullanarak null edinin.
Rotalar, derin bağlantılar ve bağımsız değişkenleriyle URI'lar dizelerden ayrıştırılabilir. Bu, Parsellers ve Önceki tabloda görüldüğü gibi serileştirilebilirler. Özel karmaşık verileri aktarmak için verileri ViewModel gibi başka bir yerde depolayın ya da veritabanını kullanmalıdır ve yalnızca gezinirken bir tanımlayıcı iletecek. ve navigasyon sonlandırıldıktan sonra verileri yeni konuma getirir.
Özel türlerden birini seçtiğinizde Sınıf Seçin iletişim kutusu görünür ve o tür için ilgili sınıfı seçmenizi ister. Proje sekmesi mevcut projenizden bir sınıf seçmenizi sağlar.
Gezinme kitaplığını kullanmak için <inrated type> (Tahmin türü) seçeneğini belirleyebilirsiniz verilen değere göre türü belirler.
Bağımsız değişkenin seçilen Type (Tür) değerini seçin. Aşağıdakileri göz önünde bulundurun:
- Enum dizileri ve kaynak referansı dizileri desteklenmez.
- Diziler, boş değer desteğinden bağımsız olarak boş değerleri destekler
değerlerine göre çalışır. Örneğin,
app:argType="integer[]"
,app:nullable="true"
ile şunları yapabilirsiniz: boş dizinin iletilmesinin kabul edilebilir olduğunu gösterir. - Diziler tek bir varsayılan değeri ("@null") destekler. Diziler şunları desteklemez başka bir varsayılan değer.
İşlemdeki hedef bağımsız değişkeni geçersiz kılma
Hedef düzeyindeki bağımsız değişkenler ve varsayılan değerler, hedefe gidin. Gerekirse bir bağımsız değişkeni tanımlarken işlem düzeyi. Bu bağımsız değişken, bağımsız değişkenle aynı ada ve türde olmalıdır belirtilen hedefte belirtilir.
Aşağıdaki XML, Yukarıdaki örnekte yer alan hedef düzeyinde bağımsız değişken:
<action android:id="@+id/startMyFragment"
app:destination="@+id/myFragment">
<argument
android:name="myArg"
app:argType="integer"
android:defaultValue="1" />
</action>
Verileri tür güvenliğiyle aktarmak için Güvenli Bağımsız Değişkenleri kullanma
Gezinme bileşeninde bulunan Güvenli Bağımsız Değişkenler adlı bir Gradle eklentisi tür açısından güvenli gezinme ve her tür öğeye erişim için basit nesne ve derleyici sınıfları bağımsız değişkenlerdir. Güvenli Bağımsız Değişkenler, bir cihazda gezinmek ve Çünkü bu, tür güvenliğini sağlar.
Gradle kullanmıyorsanız Güvenli Args eklentisi. Bu durumlarda, Paketleri kullanarak doğrudan ve verileri iletmek.
Projenize Safe Args eklemek için üst düzey build.gradle
dosyanıza aşağıdaki classpath
öğesini ekleyin:
Groovy
buildscript { repositories { google() } dependencies { def nav_version = "2.8.4" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } }
Kotlin
buildscript { repositories { google() } dependencies { val nav_version = "2.8.4" classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version") } }
Ayrıca, mevcut iki eklentiden birini de uygulamanız gerekir.
Java veya karma Java ve Kotlin modüllerine uygun Java dil kodu oluşturmak için bu satırı uygulamanızın veya modülünüzün build.gradle
dosyasına ekleyin:
Groovy
plugins { id 'androidx.navigation.safeargs' }
Kotlin
plugins { id("androidx.navigation.safeargs") }
Alternatif olarak, yalnızca Kotlin modüllerine uygun Kotlin kodu oluşturmak için şunları ekleyin:
Groovy
plugins { id 'androidx.navigation.safeargs.kotlin' }
Kotlin
plugins { id("androidx.navigation.safeargs.kotlin") }
AndroidX'e Taşıma bölümünde belirtildiği gibi, gradle.properties
dosyanızda android.useAndroidX=true
olmalıdır.
Güvenli Bağımsız Değişkenleri etkinleştirdikten sonra, oluşturduğunuz kod şunları içerir: her işlem için güvenli sınıflar ve yöntemler yazmanın yanı sıra her alıcı hedefi.
İşlemin gerçekleştiği her hedef için bir sınıf oluşturulur. Ad şu sınıfın sonuna eklenen kaynak hedefin adıdır: "Yol Tarifi" kelimesi. Örneğin, kaynak hedef bir parçaysa
SpecifyAmountFragment
adlı bir sürüm kullanıyorsanız, oluşturulan sınıfınSpecifyAmountFragmentDirections
.Bu sınıfta, kaynakta tanımlanan her işlem için bir yöntem bulunuyor seçeceğiz.
Bağımsız değişkeni iletmek için kullanılan her eylem için, bağımsız değişkeni adı, işleme göre belirlenir. Örneğin,
confirmationAction,
, sınıfın adıConfirmationAction
. Eğer işlemi,defaultValue
içermeyen bağımsız değişkenler içeriyorsa ilişkilendirilmiş işlem sınıfını kullanın.Alma hedefi için bir sınıf oluşturulur. Bu sınıfın adı: Hedefin adının sonuna "Args" kelimesini ekleyin. Örneğin, hedef parça, oluşturulan
ConfirmationFragment,
olarak adlandırılır sınıfının adıConfirmationFragmentArgs
. Bu sınıfınfromBundle()
özelliğini kullan yöntemini kullanın.
Aşağıdaki örnekte, bağımsız değişken ayarlamak için bu yöntemlerin nasıl kullanılacağı
navigate()
yöntem:
Kotlin
override fun onClick(v: View) { val amountTv: EditText = view!!.findViewById(R.id.editTextAmount) val amount = amountTv.text.toString().toInt() val action = SpecifyAmountFragmentDirections.confirmationAction(amount) v.findNavController().navigate(action) }
Java
@Override public void onClick(View view) { EditText amountTv = (EditText) getView().findViewById(R.id.editTextAmount); int amount = Integer.parseInt(amountTv.getText().toString()); ConfirmationAction action = SpecifyAmountFragmentDirections.confirmationAction(); action.setAmount(amount); Navigation.findNavController(view).navigate(action); }
Alma hedefinin kodunda getArguments()
yöntemini kullanın
paketinin içeriği
alın ve kullanın. -ktx
bağımlılıklarını kullanırken
Kotlin kullanıcıları, erişmek için by navArgs()
mülkü için yetkiyi de kullanabilir.
bağımsız değişkenlerdir.
Kotlin
val args: ConfirmationFragmentArgs by navArgs() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val tv: TextView = view.findViewById(R.id.textViewAmount) val amount = args.amount tv.text = amount.toString() }
Java
@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { TextView tv = view.findViewById(R.id.textViewAmount); int amount = ConfirmationFragmentArgs.fromBundle(getArguments()).getAmount(); tv.setText(amount + ""); }
Güvenli Bağımsız Değişkenleri global bir işlemle kullanın
Güvenli Bağımsız Değişkenleri
global eylem,
kök <navigation>
öğeniz için bir android:id
değeri sağlamanız gerekir:
aşağıdaki örnekte gösterilmektedir:
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_nav" app:startDestination="@id/mainFragment"> ... </navigation>
Gezinme, aynı olan <navigation>
öğesi için bir Directions
sınıfı oluşturur:
android:id
değerine göre. Örneğin, bir <navigation>
öğesi android:id=@+id/main_nav
ile değiştirildiğinde oluşturulan sınıf
MainNavDirections
. <navigation>
öğesindeki tüm hedefler
aynı kullanılarak ilişkili tüm genel işlemlere erişmek için oluşturulmuş yöntemler
yöntemlerine sahip olacaktır.
Paket nesneleriyle hedefler arasında veri iletme
Gradle kullanmıyorsanız hedefler arasında bağımsız değişkenleri iletmek için
(Bundle
nesne kullanılıyor). Bir Bundle
nesnesi oluşturup hedefe iletin
Aşağıdaki örnekte gösterildiği gibi navigate()
kullanılarak:
Kotlin
val bundle = bundleOf("amount" to amount) view.findNavController().navigate(R.id.confirmationAction, bundle)
Java
Bundle bundle = new Bundle(); bundle.putString("amount", amount); Navigation.findNavController(view).navigate(R.id.confirmationAction, bundle);
Alıcı hedefinizin kodunda getArguments()
yöntemini kullanarak
Bundle
öğesini alıp içeriğini kullanın:
Kotlin
val tv = view.findViewById<TextView>(R.id.textViewAmount) tv.text = arguments?.getString("amount")
Java
TextView tv = view.findViewById(R.id.textViewAmount); tv.setText(getArguments().getString("amount"));
Verileri başlangıç hedefine iletin
Verileri, uygulamanızın başlangıç hedefine aktarabilirsiniz. Öncelikle, reklamların nasıl
verileri barındıran bir Bundle
oluşturur. Daha sonra aşağıdakilerden birini kullanın
Bundle
öğesini başlangıç hedefine geçirme yaklaşımları:
NavHost
programınızı programatik olarak oluşturuyorsanızNavHostFragment.create(R.navigation.graph, args)
, buradaargs
verilerinizi saklayanBundle
.- Aksi takdirde,
NavController.setGraph()
aşırı yüklemelerinin ardından:- Grafiğin kimliğini kullanın:
navController.setGraph(R.navigation.graph, args)
- Grafiğin kendisini kullanın:
navController.setGraph(navGraph, args)
- Grafiğin kimliğini kullanın:
Başlangıç hedefinizdeki verileri almak için şu numarayı arayın:
Fragment.getArguments()
.
ProGuard ile ilgili dikkat edilmesi gereken noktalar
Kodunuzu küçültüyorsanız, Parcelable
,
Serializable
ve Enum
sınıf adlarının,
sürecidir. Bunu iki şekilde yapabilirsiniz:
- @Keep ek açıklamalarını kullanın.
- Keepnames kurallarını kullanın.
Aşağıdaki alt bölümlerde bu yaklaşımlar açıklanmaktadır.
@Keep ek açıklamalarını kullanma
Aşağıdaki örnekte model sınıf tanımlarına @Keep
ek açıklamaları eklenmiştir:
Kotlin
@Keep class ParcelableArg : Parcelable { ... } @Keep class SerializableArg : Serializable { ... } @Keep enum class EnumArg { ... }
Java
@Keep public class ParcelableArg implements Parcelable { ... } @Keep public class SerializableArg implements Serializable { ... } @Keep public enum EnumArg { ... }
Keepnames kurallarını kullanma
Ayrıca, proguard-rules.pro
dosyanıza aşağıda gösterildiği gibi keepnames
kuralları ekleyebilirsiniz.
aşağıdaki örnekte:
proGuard-rules.pro
...
-keepnames class com.path.to.your.ParcelableArg
-keepnames class com.path.to.your.SerializableArg
-keepnames class com.path.to.your.EnumArg
...
Ek kaynaklar
Navigasyon hakkında daha fazla bilgi edinmek için aşağıdakilere bakın: ek kaynaklar.