انتقال داده از یک فرگمنت به فرگمنت دیگر در اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش انتقال داده از یک فرگمنت به فرگمنت دیگر در اندروید می پردازیم همانطور که قبلتر هم گفتم مبحث فرگمنت بسیار مهم است در ادمه می توانید پیش نمایشی از پاس دادن بین فرگمنت ها را مشاهده کنید.
به خاطر اینکه حجم فایل gif بالا است از لینک زیر استفاده کنید.
لینک
باید به Build.gradle خط زیر را اضافه کنید.
1 | compile 'com.android.support:design:24.0.0' |
ابتدا فایل 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 30 31 32 | <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> <android.support.design.widget.TabLayout android:id="@+id/tabs" style="@style/MyStyle" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabGravity="fill" app:tabMode="fixed" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> |
در بالا TabLayout قرار داده ایم و دو تا صفحه داریم و در زیر آن ViewPager داریم که صفحه فرگمنت های ما در آن قرار می گیرد.
وارد فایل style.xml شده در مسیر res/values قرار دارد و کد های زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> <style name="MyStyle" parent="Widget.Design.TabLayout"> <item name="tabIndicatorColor">#FFFF</item> <item name="tabIndicatorHeight">5dp</item> <item name="tabPaddingStart">8dp</item> <item name="tabPaddingEnd">8dp</item> </style> </resources> |
باید یک اداپتور برای ViewPager درست کنیم پس یک فایل به نام ViewPagerAdapter.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 | public class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { Fragment fragment = null; if (position == 0) { fragment = new FragmentOne(); } else if (position == 1) { fragment = new FragmentTwo(); } return fragment; } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { String title = null; if (position == 0) { title = "Tab-1"; } else if (position == 1) { title = "Tab-2"; } return title; } } |
حالا باید فرگمت ها را ایجاد کنیم یک فایل به نام fragment_one.xml در layout خود ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:fillViewport="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/inMessage" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/btnPassData" android:layout_margin="16dp" android:hint="Enter here" /> <Button android:id="@+id/btnPassData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="PASS DATA TO FRAGMENT TWO" /> </RelativeLayout> </ScrollView> |
یک فرگمنت دیگر با نام fragment_two.xml در همان مسیر ایجاد کرده و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/txtData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:layout_centerInParent="true" android:text="No data received" /> </RelativeLayout> |
کد مربوط به FragmentOne.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 38 39 40 41 42 43 44 | package ir.programchi; import android.content.Context; 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.Button; import android.widget.EditText; public class FragmentOne extends Fragment { SendMessage SM; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate( R.layout.fragment_one, container, false); return rootView; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Button btnPassData = (Button) view.findViewById(R.id.btnPassData); final EditText inData = (EditText) view.findViewById(R.id.inMessage); btnPassData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SM.sendData(inData.getText().toString().trim()); } }); } interface SendMessage { void sendData(String message); } @Override public void onAttach(Context context) { super.onAttach(context); try { SM = (SendMessage) getActivity(); } catch (ClassCastException e) { throw new ClassCastException("Error in retrieving data. Please try again"); } } } |
و کد مربوط به FragmentTwo.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 | 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; public class FragmentTwo extends Fragment { TextView txtData; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate( R.layout.fragment_two, container, false); return rootView; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); txtData = (TextView)view.findViewById(R.id.txtData); } protected void displayReceivedData(String message) { txtData.setText("Data received: "+message); } } |
و در آخر هم کد مربوط به 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 | package ir.programchi; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; public class MainActivity extends AppCompatActivity implements FragmentOne.SendMessage{ TabLayout tabLayout; ViewPager viewPager; ViewPagerAdapter viewPagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); viewPager = (ViewPager) findViewById(R.id.viewPager); viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(viewPagerAdapter); tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); } @Override public void sendData(String message) { String tag = "android:switcher:" + R.id.viewPager + ":" + 1; FragmentTwo f = (FragmentTwo) getSupportFragmentManager().findFragmentByTag(tag); f.displayReceivedData(message); } } |
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
سلام، خدا قوت
بنده میخوام دیتارو از یک اکتیویتی به یک فرگمنت بفرستم که در یک اکتیویتی دیگه قرار داره، ممنون میشم راهنمایی کنید که تو این حالت به چه شیوه باید عمل کرد.
سلام خیلی ممنون قبلا آن را آموزش داده ایم از لینک زیر استفاده کنید.
https://programchi.ir/2017/08/11/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A7%DA%A9%D8%AA%DB%8C%D9%88%DB%8C%D8%AA%DB%8C-%D8%A8%D9%87-%D9%81%D8%B1%DA%AF%D9%85%D9%86%D8%AA/
موفق باشید.
سلام،من چطور میتونم از یک فرگمنت برم ب یک فرگمنت دیگه با استفاده از اینتنت ؟
سلام و درود امکان استفاده از Intent برای Fragment ها وجود ندارد لازم است fragment را replace کرد که در آموزش های fragment سایت می توانید آن را پیدا کنید.
تیکه کد برای استفاده در ادامه قرار گرفته است.
موفق باشید.
سلام سایتتون واقعا یکی از سایت های محبوب من هستش
هر وقت مطلبی رو سرچ میکنم وقتی سایت شما رو میبینم قطعا از آموزش شما استفاده میکنم, هرچند کد ها رو توضیح نمیدین ولی کدهاتون به نتیجه میرسه…
# یه سوال
الان با این آموزش فقط یه مقدار از edit Text گرفته شد و انتقال یافت چه طور میتونم یه array list ارسال و دریافت کنم?
سلام و درود
آموزش Paracable رو بررسی کنید.
موفق و پیروز باشید.
سلام ممنون از آموزش شما
چطور میتونم یک عکس را از فرگمنت a به فرگمنت b ارسال کنم؟
اگر آموزش را دارید لینک برام بگذارید ممنونم از لطف شما