التواصل مع الشظايا الأخرى

الإعلانات

التواصل مع الشظايا الأخرى

 

 

 

التواصل مع الشظايا الأخرى

 

لإعادة إستخدام مكونات واجهة مستخدم الشظايا، يجب أن تقوم ببناء كل مكون بشكلٍ مستقل ونموذجي تماماً، والذي يحدد مخططه وسلوكه الخاص.

بمجرد تحديدك لهذه الشظايا القابلة لإعادة الإستخدام، يمكنك ربطها بالنشاط وتوصيلها بمنطق التطبيق، لتحقيق واجهة المستخدم المركبة الشاملة.

في كثير من الأحيان، ستحتاج إلى شظية واحدة للتواصل مع شظية أخرى، على سبيل المثال لتغيير المحتوى بناءً على حدث المستخدم.

يتم إجراء جميع عمليات، توصيل شظية بشظية، إما من خلال ViewModel مشتركة أو من خلال النشاط المرتبط. يجب أن ألا ترتبط شظيتين بشكلٍ مباشر.

تتمثل الطريقة الموصى بها لتوصيل الشظايا، في إنشاء كائن ViewModel مشترك. يمكن لكلتا الشظايا الوصول إلى ViewModel من خلال النشاط الذي يحتويهم.

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

إلى الشظية الأخرى طالما أنها تراقب LiveData من ViewModel.

لمعرفة كيفية تنفيذ هذا النوع من الإتصالات، اقرأ قسم “مشاركة البيانات بين الشظايا” في دليل ViewModel.

إذا كنت غير قادر على إستخدام ViewModel مشترك للإتصال بين الشظايا، يمكنك تنفيذ تدفق الإتصالات يدوياً بإستخدام واجهات.

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

 

 

 

 

تعيين واجهة


للسماح لشظية بالإتصال بنشاطها، يمكنك تعيين واجهة في فئة “الشظايا” Fragment وتنفيذها داخل النشاط.

تلتقط الشظية تنفيذ الواجهة من خلال دالة ()onAttach لدورة حياتها ويمكن بعد ذلك إستدعاء دوال الواجهة من أجل التواصل مع النشاط.

 

إليك مثال لتوصيل شظية مع نشاط:

HeadlinesFragment

KOTLIN

class HeadlinesFragment : ListFragment() {
    internal var callback: OnHeadlineSelectedListener

    fun setOnHeadlineSelectedListener(callback: OnHeadlineSelectedListener) {
        this.callback = callback
    }

    // This interface can be implemented by the Activity, parent Fragment,
    // or a separate test implementation.
    interface OnHeadlineSelectedListener {
        fun onArticleSelected(position: Int)
    }

    // ...
}

JAVA

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener callback;

    public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener callback) {
        this.callback = callback;
    }

    // This interface can be implemented by the Activity, parent Fragment,
    // or a separate test implementation.
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    // ...
}

 

MainActivity

 

KOTLIN

class MainActivity : Activity(), HeadlinesFragment.OnHeadlineSelectedListener {
    // ...

    fun onAttachFragment(fragment: Fragment) {
        if (fragment is HeadlinesFragment) {
            fragment.setOnHeadlineSelectedListener(this)
        }
    }
}

JAVA

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    // ...

    @Override
    public void onAttachFragment(Fragment fragment) {
        if (fragment instanceof HeadlinesFragment) {
            HeadlinesFragment headlinesFragment = (HeadlinesFragment) fragment;
            headlinesFragment.setOnHeadlineSelectedListener(this);
        }
    }
}

 

الآن يمكن للشظية تقديم رسائل إلى النشاط عن طريق إستدعاء ()onArticleSelected (أو دوال أخرى في الواجهة)..

بإستخدام مثيل mCallback للواجهة OnHeadlineSelectedListener.

على سبيل المثال، يتم إستدعاء الدالة التاليه في الشظية عندما يقوم المستخدم بالنقر فوق عنصر القائمة.

تستخدم الشظية إستدعاء الواجهة لتسليم الحدث إلى النشاط الرئيسي.

 

KOTLIN

override fun onListItemClick(l: ListView, v: View, position: Int, id: Long) {
    // Send the event to the host activity
    callback.onArticleSelected(position)
}

JAVA

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // Send the event to the host activity
    callback.onArticleSelected(position);
}

 

 

 

تنفيذ الواجهة


من أجل تلقي إستدعاءات الحدث من الشظية، يجب أن يقوم النشاط الذي يستضيفه بتنفيذ الواجهة المعرفة في فئة الشظايا.

على سبيل المثال، يقوم النشاط التالي بتنفيذ الواجهة من المثال أعلاه.

 

KOTLIN

class MainActivity : Activity(), HeadlinesFragment.OnHeadlineSelectedListener {
    ...

    fun onArticleSelected(position: Int) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

JAVA

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

 

 

 

 

 

تسليم رسالة إلى شظية


يمكن للنشاط المستضيف تسليم الرسائل إلى شظية من خلال إلتقاط مثيل “الشظية” Fragment ..

بإستخدام ()findFragmentById ، ثم إستدعاء الدوال العامة للشظية مباشرةً.

على سبيل المثال، تخيل أن النشاط الموضح أعلاه قد يحتوي على شظية أخرى يتم إستخدامها لعرض العنصر المحدد بواسطة البيانات..

التي تم إرجاعها في دالة الإستدعاء المذكورة أعلاه. التواصل مع الشظايا الأخرى

في هذه الحالة، يمكن للنشاط تمرير المعلومات المستلمة في دالة الإستدعاء إلى الشظية الأخرى التي ستعرض العنصر:

 

KOTLIN

class MainActivity : Activity(), HeadlinesFragment.OnHeadlineSelectedListener {
    ...

    fun onArticleSelected(position: Int) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article

        val articleFrag = supportFragmentManager.findFragmentById(R.id.article_fragment) as ArticleFragment?

        if (articleFrag != null) {
            // If article frag is available, we're in two-pane layout...

            // Call a method in the ArticleFragment to update its content
            articleFrag.updateArticleView(position)
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...
            // Create fragment and give it an argument for the selected article
            val newFragment = ArticleFragment()
            val args = Bundle()
            args.putInt(ArticleFragment.ARG_POSITION, position)
            newFragment.arguments = args

            val transaction = supportFragmentManager.beginTransaction()

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment)
            transaction.addToBackStack(null)

            // Commit the transaction
            transaction.commit()
        }
    }
}

JAVA

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article

        ArticleFragment articleFrag = (ArticleFragment)
                getSupportFragmentManager().findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
            // If article frag is available, we're in two-pane layout...

            // Call a method in the ArticleFragment to update its content
            articleFrag.updateArticleView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected article
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}

 

لمعرفة المزيد حول تنفيذ الشظايا، اقرأ الشظايا. يمكنك أيضاً معرفة المزيد من خلال إستكشاف نموذج التطبيق ذي الصلة.

 


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

الإعلانات

اترك رد