Hedefler arasında veri geçirme

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:

  1. Gezinme Düzenleyici'de bağımsız değişkeni alan hedefi tıklayın.
  2. Özellikler panelinde Ekle'yi (+) tıklayın.
  3. 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.
  4. 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.
  5. 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
  6. 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.
ziyaret edin.

İş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ın SpecifyAmountFragmentDirections.

    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ın fromBundle() ö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ı:

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.

Örnekler

Codelab'ler

Videolar