Fragment ها در اندروید(فرگمنت ها در اندروید)
شاید به ذهنتان خطور کرده باشد که بخواهید چندین اکتیوتی را در یک اکتیویتی واحد پیادسازی کنید. چنین امری با توجه به منطق برنامه نویس اندروید امری ناشدنی و غیراصولی است . قبل از معرفی Fragment ، این محدودیت همواره وجود داشته است چرا ما تنها می توانستیم یک اکتیوتی واحد را در آن واحد روی صفحه دستگاه اندروید نشان دهیم. بنابراین ما نمی توانیم صفحه اکتیوتی را تقسیم کنیم و قطعات مختلف را و جداگانه ای را در آن جاسازی کنیم. اما با معرفی Fragment ما انعطاف پذیری بیشتری پیدا کردیم و توانستیم بدون استفاده از اکتیوتی های متعدد در یک اکتیوتی که عملاً ناشدنی است با Fragment ها به این محدودیت غلبه کنیم.
حالا ما می توانیم یک اکتیوتی واحد داشته باشیم و چندین قطعه همانند اکتیوتی را در آن جاسازی کنیم از این رو مکانیزمی که برای این یک کار در نظر گرفته شده است استفاده از Fragment هاست . Fragment نشان دهنده یک رفتار یا بخشی از رابط کاربری در یک اکتیویتی است که با استفاده از آن می توان چندین Fragment را در یک اکتیویتی واحد با UI متنوعی که برای هریک تعریف می شود پیدا سازی کرد. همچنین نیز می توان یک Fragment را در چندین اکتیوتی پیاده سازی کرد.
Fragment همیشه در یک اکتیویتی جاسازی شود و چرخه زندگی Fragment به طور مستقیم تحت تاثیر چرخه عمر میزبان آنها یعنی اکتیوتی ها قرار دارد به عنوان مثال، زمانی که اکتیویتی متوقف می شود، همه ی Fragment ها در آن متعاقباً از بین می روند، با این حال، زمانی که یک اکتیویتی در حالت اجرا است شما می توانید هر چند Fragment را به صورت جداگانه به آن اضافه یا حذف کنید. هنگامی که یک Fragment را به عنوان بخشی از لایوت اکتیوتی به آن اضافه می کنید، آن را در ViewGroup در داخل سلسله مراتب ویو اکتیوتی مورد نظرتان تعریف می کنید البته شما می توانید یک Fragment را به لایوت اکتیوتی خود اضافه کنید، بدون اینکه آن بخشی از لایوت اکتیوتی شما باشد ؛ شما همچنین می توانید یک Fragment را بدون استفاده از رابط کاربر خود بصورت نامرئی در اکتیویتی خود بکار بگیرید .
به منظور درک بهتر آموزش توجه شما را به مثال زیر جلب می کنم.
اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را ایجاد کنید
اکلیپس :File ⇒ New Android ⇒ Application Project
اندروید استودیو :File ⇒ New ⇒ New Project
اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk و نوع اکتیویتی خود را از نوع blank انتخاب کرده و نام آن را MainActivity قرار دهید. بعد از لود کامل برنامه ، در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی activity_main را پیدا نمود و کدهای مندرج و پیش فرض آن را پاک کرده و کدهای xml زیر را به آن اضافه کنید:
<?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" 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.AppBarLayout> <include layout="@layout/content_main" /> </android.support.design.widget.CoordinatorLayout>
سپس فایل content_main را باز کرده و کدهای زیر را در درون ان می نویسیم:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context=".MainActivity" tools:showIn="@layout/activity_main"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="loadfragment1" android:id="@+id/loadfragment1" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="loadfragment2" android:id="@+id/loadfragment2" android:layout_below="@+id/loadfragment1" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="loadfragment3" android:id="@+id/loadfragment3" android:layout_below="@+id/loadfragment2" android:layout_centerHorizontal="true" /> <FrameLayout android:id="@+id/fragment_frame" android:layout_width="200dp" android:layout_height="200dp" android:layout_marginTop="92dp" android:layout_below="@+id/loadfragment3" android:layout_centerHorizontal="true" />
</RelativeLayout>
به منظور جابه جایی بین fragment ها لازم است سه fragment با نام های OneFragment , TwoFragmen , ThreeFragment ایجاد کرده و کدهای هریک را بطور مجزا وارد کنیم . از این رو ابتدا سه کلاس با نام های مذکور ایجاد می کنیم و هریک را به نوع Fragmet گسترش می دهیم به شکل زیر:
OneFragment.java
package examples.psrd.ir.myapplication; import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class OneFragment extends Fragment { public static OneFragment newInstance() { return new OneFragment(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.layuot_fragmen1, container, false); } }
فرگمنت دوم:
TwoFragment.java
package examples.psrd.ir.myapplication; /** * Created by selma on 01/15/2018. */ import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class TwoFragment extends Fragment { public static TwoFragment newInstance() { return new TwoFragment(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.layuot_fragmen2, container, false); } }
کلاس فرگمنت سوم
ThreeFragment.java
package examples.psrd.ir.myapplication; /** * Created by selma on 01/15/2018. */ import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ThreeFragment extends Fragment { public static ThreeFragment newInstance() { return new ThreeFragment(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.layuot_fragmen3, container, false); } }
همانطور که در کلاس های فوق دیده می شود لازم است که لایوت هریک از سه فرگمنت را در قسمت layout ایجاد کنیم از این رو سه لایوت xml با نام های layout_fragment3, layout_fragment2 , layout_fragment1 ایجاد می کنیم و کدهای هریک را به شکل زیر قرار می دهیم:
layout_fragment1.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#2d18e8"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Fragment1" android:textSize="30dp" android:gravity="center" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
layout_fragment2.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:background="#ff1542" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Fragment2" android:textSize="30dp" android:gravity="center" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
layout_fragment3.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#20ed34"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Fragment3" android:textSize="30dp" android:gravity="center" android:layout_centerVertical="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
ودر آخر کلاسMainactivity.java را به شکل زیر وارد می کنیم:
package examples.psrd.ir.myapplication; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { public Button Btnfragment1,Btnfragment2,Btnfragment3 ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); if (savedInstanceState == null) { loadOneFragment(); } Btnfragment1 = (Button)findViewById(R.id.loadfragment1); Btnfragment2 = (Button)findViewById(R.id.loadfragment2); Btnfragment3 = (Button)findViewById(R.id.loadfragment3); Btnfragment1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loadOneFragment(); } }); Btnfragment2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loadTwoFragment(); } }); Btnfragment3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { loadThreeFragment(); } }); } private void loadOneFragment() { OneFragment fragment = OneFragment.newInstance(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.fragment_frame, fragment); ft.commit(); } private void loadTwoFragment() { TwoFragment fragment = TwoFragment.newInstance(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.fragment_frame, fragment); ft.commit(); } private void loadThreeFragment() { ThreeFragment fragment = ThreeFragment.newInstance(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.fragment_frame, fragment); ft.commit(); } }
حال پروژه را اجرا کرده و از آن در آموزش هر چه بیشتر خود استفاده کنید. اگر مشکلی در اجرای کدها وجود دارد یا سوال مشخصی از نویسنده سایت دارید سوالات خود را در قسمت دیدگاه ها بیان کنید.
کپی برداری از محتوای سایت psrd، ممنوع بوده و پیگرد قانونی دارد. (تنها استفاده شخصی کاربران ، مجاز است) (کپی برداری توسط سایر وب سایت ها غیرقانونی بوده و در صورت رویت به ستادسازماندهی اطلاع داده خواهد شد.
0 دیدگاه