آموزش ارسال داده از اکتیویتی به فرگمنت در اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش ارسال داده از اکتیویتی به فرگمنت در اندروید می پردازیم فرگمنت ها و اکتیویتی ها مهمترین بخش ها در برنامه نویسی هستند توصیه می کنم این مبحث را به خوبی یاد بگیرید در این آموزش خواهید دید به سادگی داده ها را از اکتیویتی به فرگمنت ارسال خواهیم کرد با ما همراه باشید.
باید سه کار انجام شود .
اولین کار استفاده از bundle برای قرار دادن داده
1 2 | Bundle data = new Bundle(); data.putString("key_value", "Programchi.ir"); |
دومین کار SetArguments برای پاس دادن دیتا
1 | fragmentName.setArguments(data); |
در بالا fragmentName نام فرگمنتی است که شما ساخته اید.
سومین کار دریافت یا GetArguments
1 | String getArgument = getArguments().getString("key_value"); |
شاید کمی گیج شده باشید در ادامه به یک آموزش کاربردی خواهیم دید.
ما یک فایل به نام activity_main.xml داریم که کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/setDefaultFragment" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="Default Fragment" /> <Button android:id="@+id/setArgumentFragment" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="Argument Fragment" /> </LinearLayout> <!-- Frame Layout for placing Fragments --> <FrameLayout android:id="@+id/fragmentContainer" android:layout_width="fill_parent" android:layout_height="fill_parent"> </FrameLayout> </LinearLayout> |
دو دکمه برای قرار دادن و به دست آوردن داده قرار دارد و یک Frame Layout داریم که برای نمایش fragment مون داریم.
یک فایل به نام fragmentlayout.xml در layout خود درست کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ff00" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/fragmentText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Default Text" android:textColor="#ffffff" android:textSize="20sp" /> </LinearLayout> |
حالا باید کد های مربوط به فرگمنت را قرار دهید پس یک فایل به نام DefaultFragment.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package com.fragmentsetargument_demo; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * Created by Jefferson on 07/10/17. */ public class DefaultFragment extends Fragment { //Simple Fragment public DefaultFragment() { } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragmentlayout, container, false); } } |
یک فایل دیگر به نام ArgumentFragment.java ایجاد کرده و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package ir.programchi; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Created by Jefferson on 07/10/17. */ public class ArgumentFragment extends Fragment { public ArgumentFragment() { } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentlayout, container, false);//Inflate Layout TextView text = (TextView) view.findViewById(R.id.fragmentText);//Find textview Id String getArgument = getArguments().getString("data"); text.setText(getArgument);//set string over textview return view;//return view } } |
و در آخر کد مربوط به MainActivity.java همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package ir.programchi; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static Button defaultFragment, argumentFragment; private static FragmentManager fragmentManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentManager = getSupportFragmentManager();//Get Fragment Manager //Find Ids defaultFragment = (Button) findViewById(R.id.setDefaultFragment); argumentFragment = (Button) findViewById(R.id.setArgumentFragment); defaultFragment.setOnClickListener(this); argumentFragment.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.setDefaultFragment: fragmentManager.beginTransaction().replace(R.id.fragmentContainer, new DefaultFragment()).commit(); break; case R.id.setArgumentFragment: Fragment argumentFragment = new ArgumentFragment();//Get Fragment Instance Bundle data = new Bundle();//Use bundle to pass data data.putString("data", "This is Argument Fragment");//put string, int, etc in bundle with a key value argumentFragment.setArguments(data);//Finally set argument bundle to fragment fragmentManager.beginTransaction().replace(R.id.fragmentContainer, argumentFragment).commit(); break; } } } |
این آموزش هم به پایان رسید.
موفق و موید باشید.
سلام، ممنون از مطالب آموزشی خوبتون.
یه بار دیگه سوالم رو اینجا مطرح میکنم 🙂
تو این آموزش ما دیتا رو از اکتیویتی میفرستیم به فرگمنتی که تو خود اکتیویتی داریم لود میکنیم….
اما من میخوام مثلا دیتا رو از اکتیویتی 1 بفرستم به فرگمنتی در اکتیویتی2…آیا باید ابتدا دیتا رو از اکتیویتی 1 بفرستم به اکتیویتی 2 و بعد از اکتیویتی 2 بفرستم به فرگمنت؟؟؟ یا اینکه مستقیم میشه دیتا رو از اکتیویتی 1 فرستاد به فرگمنتی در اکتیویتی 2…
ممنون میشم راهنمایی کنید 🙂
سلام اگر کمی به آموزش دقت می کردید می توانستید کد زیر را از آن بیرون بکشید برای انتقال مثل زیر عمل کنید (ساده ترین مثالی که میشه مثال زد)
کد اکتیویتی اول
گد فرگمنت که دیتا گرفته می شود.
موفق باشید.
سلام، ممنون از پاسختون.
با اینکه این شیوه رو امتحان کرده بودم اما کار نکرد برام…. با استفاده از اینتنت اما جواب گرفتم.
در اکتیویتی اول :
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(“message”, data);
startActivity(intent);
و در فرگمنت اکتیویتی دوم :
SecondActivity activity = (SecondActivity) getActivity();
String data= activity.getIntent().getExtras().getString(“message”);
سلام وقتتون بخیر.
من یک اکتیویتی دارم که داخلش یک tabLayut با دو فرگمنت هست . یک سری اطلاعات رو قرار از این اکتویتی به یکی از این فرگمنت ها انتقال بدم و از همین روش bundle استفاده میکنم ولی موقع دریافت اطلاعات در فرگمنت داده ها رو دریافت نمیکنه و این اررور رو میده
java.lang.NullPointerException: Attempt to invoke virtual method ‘java.lang.String
android.os.Bundle.getString(java.lang.String)’ on a null object reference
چه جوری باید این مشکل رفع کنم
https://stackoverflow.com/a/46828366
این روش هم با bundle گفته بود رو انجام دادم ولی بازهم همون اررور رو میده