تمرير البيانات بين الوجهات

الإعلانات

تمرير البيانات بين الوجهات

 

 

تمرير البيانات بين الوجهات

التنقل يتيح لك إرفاق بيانات، بعملية التنقل، عن طريق تعريف معطيات الوجهه.

على سبيل المثال، وجهة ملف تعريف المستخدم، قد تأخد المعطى “معرّف المستخدم” لتحديد المستخدم الذي سيتم عرضه.

بشكلٍ عام، يجب أن تفضل بشدة، القيام بتمرير الحد الأدنى فقط من البيانات بين الوجهات.

على سبيل المثال، يجب عليك تمرير مفتاح لإسترداد كائن، بدلاً من تمرير الكائن نفسه، حيث إن المساحة الإجمالية..

لكافة الحالات المحفوظة، محدودة على الأندرويد. إذا كنت بحاجة إلى تمرير كميات كبيرة من البيانات، فكر في إستخدام ViewModel ، كما هو موضح في مشاركة البيانات بين الشظايا.

 

 

 

 

تحديد معطيات الوجهة


لتمرير البيانات بين الوجهات، قم أولاً بتعريف المعطى، عن طريق إضافته إلى الوجهة التي تتلقاه، بإتباع الخطوات التالية:

1- في محرر التنقل، أنقر على الوجهة التي تستلم المعطى.

2- في لوحة السمات Attributes، أنقر فوق إضافه (+) Add .

في النافذة “إضافة رابط المعطى” Add Argument Link التي تظهر، أدخل أسم المعطى، نوع المعطى..

سواء كان المعطى خالياً، و قيمتة إفتراضية، إذا لزم الأمر.

4 – أنقر فوق إضافة Add. لاحظ أن المعطى يظهر الآن في قائمة المعطيات Arguments في لوحة السمات.

5- بعد ذلك، أنقر فوق الإجراء المطابق، الذي ينقلك إلى هذه الوجهة.

في لوحة السمات Attributes، يجب أن تشاهد الآن المعطى المضاف حديثاً، في القسم “القيمه الإفتراضية للمعطى” Argument Default Values.

6- يمكنك أيضاً، رؤية أن المعطى تمت إضافته في XML. أنقر فوق علامة التبويب نص Text للتبديل إلى عرض XML..

ولاحظ أن المُعطى قد تمت إضافته، إلى الوجهة التي تستلم المعطى. إليك مثال على ذلك:

<fragment android:id="@+id/myFragment" >
    <argument
        android:name="myArg"
        app:argType="integer"
        android:defaultValue="0" />
</fragment>

 

 

 

تجاوز معطيات الوجهة في الإجراء

 

يتم إستخدام المعطيات، على مستوى الوجهة والقيم الإفتراضية، بواسطة كافة الإجراءات التي تنتقل إلى الوجهة.

إذا لزم الأمر، يمكنك تجاوز القيمة الإفتراضية لمُعطى (أو تعيين قيمة واحدة، إذا لم تكن موجودة بالفعل)..

عن طريق تعريف مُعطى، على مستوى الإجراء. يجب أن يكون هذا المعطى من نفس الأسم ونفس النوع كالمعطى المُعلن عنه في الوجهة.

يوضح كود XML أدناه إجراءاً لديه مُعطى، يقوم بتجاوز، المعطى على مستوى الوجهة، من المثال أعلاه:

<action android:id="@+id/startMyFragment"
    app:destination="@+id/myFragment">
    <argument
        android:name="myArg"
        app:argType="integer"
        android:defaultValue="1" />
</action>

 

 

 

 

 

إستخدام معطيات آمنة لتمرير البيانات من النوع الآمن


يحتوي مكون بنية الملاحة، على مكون بناء Gradle إضافي، يسمى “المعطيات الآمنه” Safe Args و الذي يقوم بإنشاء..

كائنات بسيطة و فئات بناء، من أجل الوصول ذو النوع الآمن، إلى المعطيات المحددة للوجهات والإجراءات.

لإستخدام المعطيات الآمنة، قم بإضافة “مسار الفئه” classpath التالي، في ملف build.gradle ذو المستوى الأعلى:

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-beta01"
    }
}

 

يتيح لك هذا إستخدام أحد المكونين الإضافيين المتوفرين:

  • مكون androidx.navigation.safeargs والذي يقوم بتوليد كود جافا، مناسباً للجافا أو خليط من وحدات الجافا و الكوتلن.
  • مكون androidx.navigation.safeargs.kotlin والذي يقوم بتوليد كود كوتلن، مناسباً فقط لوحدات الكوتلن.

 

قم بتطبيق واحد فقط من هذه المكونات، على ملف البناء build.gradle الخاص بتطبيقك، كما هو موضح أدناه:

apply plugin: 'com.android.application'
apply plugin: 'androidx.navigation.safeargs.kotlin'

android {
   //...
}

 

بعد تمكين المكون الإضافي، فإن الكود الذي تم إنشاؤه، يحتوي على دوال النوع الآمن، لكل إجراء، إلى جانب وجهات الإرسال والإستلام. يتم وصف هذه الفئات أدناه:

  • يتم إنشاء فئة لكل وجهة، ينشأ فيها إجراء.

أسم هذه الفئة هو أسم الوجهة الأصلية، ملحقة بكلمة الإتجاهات “Directions”. على سبيل المثال، إذا كانت الوجهة الأصلية..

عبارة عن شظيه تسمى SpecifyAmountFragment ، فسيتم إستدعاء الفئة التي تم تكوينها إلى SpecifyAmountFragmentDirections.

هذه الفئه، تحتوي على داله لكل إجراء محدد في الوجهة الأصلية.

 

  • لكل إجراء يستخدم لتمرير مُعطى، يتم إنشاء فئة داخلية، يستند أسمها على الإجراء.

على سبيل المثال، إذا كان الإجراء يدعى ConfirmationAction ، فإن أسم الفئة يكون ConfirmationAction.

 

  • يتم إنشاء فئة لوجهة الإستقبال. أسم هذه الفئة هو أسم الوجهة، ملحقاً بكلمة مُعطى “Args”.

على سبيل المثال، إذا كانت الشظية الوجهة تُدعى ConfirmationFragment ، فإن الفئه التي تم تكوينها تُسمى ConfirmationFragmentArgs.

إستخدم دالة ()fromBundle الخاصه بهذه الفئة، لإسترداد المعطيات.

يوضح لك المثال التالي كيفية إستخدام هذه الدوال، لتعيين معطى وتمريره إلى دالة()navigate

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);
}

 

 

في كود الوجهة المستلمة، إستخدم دالة جلب المعطى ()getArguments لإستيراد الحزمة، وإستخدام محتوياتها.

عند إستخدام إعتمادات ktx- ، يمكن لمستخدمي كوتلن أيضاً، إستخدام ممثل الخاصية ()by navArgs للوصول إلى المعطيات.

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 + "")
}

 

 

 

 

إستخدام المعطيات الآمنه مع إجراء عام

 

عند إستخدام معطيات آمنه مع إجراء عام، يجب توفير قيمة android:id لعنصر <navigation> الرئيسي، كما هو موضح في المثال التالي:

<?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>

 

يقوم التنقل بإنشاء فئة إتجاهات Directions لعنصر <navigation> المستند على قيمة android:id.

على سبيل المثال، إذا كان لديك عنصر <navigation> مع android:id=@+id/main_nav ، فإن الفئة التي تم إنشاؤها تسمى MainNavDirections.

تقوم جميع الوجهات الموجودة في عنصر <navigation> بتوليد دوال للوصول إلى كافة الإجراءات العامة، المرتبطة بإستخدام نفس الدوال، كما هو موضح في القسم السابق.

 

 

 

 

تمرير البيانات بين الوجهات بإستخدام كائنات الحزمة


إذا كنت لا تستخدم Gradle، فلا يزال بإمكانك تمرير المعطيات بين الوجهات، بإستخدام كائنات Bundle.

قم بإنشاء كائن Bundle ثم قم بتمريره إلى الوجهة بإستخدام ()navigate ، كما هو موضح أدناه:

KOTLIN

var 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);

 

في كود الوجهة المستلمه، إستخدم الداله جلب المعطيات ()getArguments لإستيراد الحزمة Bundle وإستخدام محتوياتها:

KOTLIN

val tv = view.findViewById<TextView>(R.id.textViewAmount)
tv.text = arguments.getString("amount")

JAVA

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

 

الإعلانات