ارسال بيانات من الفراكمنت الى النافذة الام

activity : هي النافدة .
fragment :هي الفراكمنت
لعل ارسال البيانات من  النافذة سهل و ذلك عبر ارسال bundle بواسطة argument لكن ماذا عن العكس اي ارسال بيانات من  الفراكمنت الى النافذة لعلك مثلي استخدمت احد الطرق الملتوية لحل المشكلة لكن ما هي الطريقة الامثل لارسال للتواصل بينهما هناك طريقتان لا ثلاتة لهما الاولى و هي غالبا ستتجاهلها و هي عبر مكتبة viewModal التي شرحنها سابقا و الطريقة الثانية هي التي جئت لاسردها عليك اليوم يا صديقي .
سلسلة دروس Fragment

عزيزي المبرمج/المبرمجة اعلم ان غير هذه الطرق من bad practice اي ليس جيدة فقد يتوقف التطبيق كما حدث معي خلاصة القول استعمل هذه الطريقة :

1-ارسال البيانات من النافذة الى الفراكمنت

//ارسال
val fragment=Myfragment()
val bundle=Bundle()
bundle.putInt("Age",567)
bundle.putString("name","ابو ثعلبة")
fragment.arguments=bundle
supportFragmentManager.beginTransaction().add(R.id.host,fragment).commit()
//التقاط
val age = arguments.getInt("age")
val name = arguments.getString("name")


2-ارسال البيانات من الفراكمنت الى النافذة
  1. سنقوم بانشاء فراكمنت بسيطة
  2. 
    class myFragment :Fragment() {
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
      return inflater.inflate(R.layout.frag,container,false)
    
     }
     override fun onActivityCreated(savedInstanceState: Bundle?) {
      super.onActivityCreated(savedInstanceState)
    
     }
    }
    
    
  3. لاجل السماح للفراكمنت بالتواصل مع النافذة الام يجب انشاء  interface  في الفراكمنت و ربطه مع النافذة حيث يتم التقاط interface في  اول دورة من دورات الفراكمنت onAttatch بعدها نستدعي دالة interface للتواصل مع الواجهة
  4. ربط interface بالنافذة .
  5. ارسال البيانات من الفراكمنت الى النافدة لذلك سنفترض ان لدينا زر و حقل عند الضغط على الزر سياخذ ما ادخله المستخدم في الحقل و يرسله الى النافذة كما سبق و ذكرنا .
  6. 
    class myFragment :Fragment() {
     lateinit var onButtonClicked:OnButtonClicked
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
      return inflater.inflate(R.layout.frag,container,false)
    
     }
     override fun onActivityCreated(savedInstanceState: Bundle?) {
      super.onActivityCreated(savedInstanceState)
      //التنصت على الزر
      button.setOnClickListener {
       //اخد القيمة و ارسالها الى انترفيس   
       val name=field.text.toString()
       onButtonClicked.onButtonClicked(name)
      }
     }
     //الربط مع النافدة
     override fun onAttach(context: Context?) {
      super.onAttach(context)
      onButtonClicked=context as OnButtonClicked
     }
     interface OnButtonClicked {
      fun onButtonClicked(name: String)
     }
    }
    
  7. اخد القيمة من طرف النافدة :
  8. 
    class Main : AppCompatActivity() ,myFragment.OnButtonClicked{
     override fun onButtonClicked(name: String) {
      //افعل بها ما تريد
      Toast.makeText(this,"ismail",Toast.LENGTH_LONG).show()
     }
    
     override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.signin)
    
     }
    
    }
    
    
اخيرا صديقي اتمنى ان تكون قد ساعدتك باي حال و ان واجهت اي مشكلة راسلني على فايسبوك
المصادر :
هل ترغب في مثل هذه التدوينات

اسماعيل ايت بلا

ببساطة ارغب في تجربة جديدة من التعلم من خلال مشاركة ما تعلمه يجبرني ذلك على البحث لمدة طويلة مما يجعل الموقع جديرا بالثقة

اترك لنا تعليقا

الاشتراك بالقائمة البريدية

توصل باحدث مواضيعنا و كن على اطلاع باخر اخبار وتقنيات الاندرويد