قسمت های دیگر این مطلب:

Fragmentها را در این قسمت به صورت عملی به شما آموزش می‌دهیم.

فرض کنید بخواهید یک اکتیویتی را درون اکتیویتی دیگر استفاده کنید، راه کار چیست؟

برای حل این چالش از Fragmentها استفاده می‌کنیم، در واقع Fragment‌ها مانند یک Sub Activity هستند و به صورت مستقل به عملیات خود می‌پردازند.

مثلا فرض کنید در چند لایه می‌خواهیم یک بخش مشترک داشته باشیم، برای این کار ناگزیریم از Fragment استفاده می‌کنیم.

بر روی فولدر layout راست کلیک کرده و از New گزینه Layout resource File را انتخاب می‌کنیم و نام فایل جدید را fragment می‌گذاریم. سورس این لایه جدید را به شکل زیر ویرایش می‌کنیم:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="150dp"
              android:background="#2d7d9a">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_gravity="center_horizontal"/>

    <RadioButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New RadioButton"
        android:id="@+id/radioButton"/>

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"/>
</LinearLayout>

در لایه فوق EditText و RadioButton و Button را درون یک LinearLayout قرار دادیم. در ضمن به LinearLayout ارتفاعی برابر 150dp و رنگ با کد #2d7d9a اختصاص دادیم.

ظاهر این لایه به شرح زیر خواهد بود:

استفاده از Fragment ها

از مسیر java پروژه روی پکیج برنامه خود راست کلیک کرده و از New گزینه Java Class را انتخاب کنید، و به این کلاس نیز یک نام دلخواه مانند NewFragment بدهید. کلاس جدید را از کلاس Fragment اندروید extends کنید:

package hitos.ir.hitosapp;
import android.app.Fragment;

public class NewFragment extends Fragment {
}

توجه کنید Fragment‌ها مانند اکتیویتی‌ها چرخه حیات خاص به خود را دارند. مثلا متد onCreateView عملکردی مشابه متد onCreate اکتیویتی دارد.

متد onCreateView را ایجاد می‌کنیم و نتیجه مانند زیر خواهد بود:

public class NewFragment extends Fragment {
  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return super.onCreateView(inflater, container, savedInstanceState);
  }
}

دستورهای مقابل return را پاک کرده و از دستور زیر استفاده کنید:

  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment, container, false);
  }

همانطور که در بالا می‌بینید onCreateView سه ورودی دارد که باید با inflater یک خروجی با سه پارامتر ایجاد کنیم. اولین پارامتر خروجی نیز لایه fragment ایجاد شده توسط ماست.

حال به لایه activity_main.xml رفته و درون آن یک Fragment مانند زیر ایجاد می‌کنیم:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    tools:context="hitos.ir.hitosapp.MainActivity">

    <fragment
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:name="hitos.ir.hitosapp.NewFragment"
        android:id="@+id/fragment"
        android:layout="@layout/fragment"/>
</RelativeLayout>

در سطرهای 9 الی 14 یک fragment ایجاد کردیم و عرض را fill_parent و طول را wrap_content تعیین کردیم. با android:name آدرس کلاس NewFragment و با android:layout آدرس لایه fragment را تعیین می‌کنیم.

نتیجه اجرای برنامه فوق در ماشین مجازی مانند زیر خواهد بود:

Fragment‌ها در طراحی اندروید

فراخوانی Fragment‌ها از Activity

در این بخش فرا می‌گیریم به جای فراخوانی Fragment‌ها از درون لایه نمایش بدون ویرایش این لایه فراگمنت را از اکتیویتی فراخوانی کنیم.

لایه نمایش activity_main به صورت زیر است:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    tools:context="hitos.ir.hitosapp.MainActivity"
    android:id="@+id/my_layout">
</RelativeLayout>

در سطر 8 به RelativeLayout یک id اضافه کردیم.

متد onCreate اکتیویتی اصلی به شکل زیر ویرایش خواهد شد:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    NewFragment newFragment = new NewFragment();

    FragmentManager manager = getFragmentManager();
    manager.beginTransaction().add(R.id.my_layout, newFragment).commit();
  }

در سطر 6 newFragment را از روی کلاس NewFragment ایجاد شده در مراحل قبل تولید می‌کنیم.

در سطر 8 یک مدیریت کننده Fragment به Activity خود اضافه کردیم.

در سطر 9 با beginTransaction بهره برداری از Fragment‌ها را با add کردن newFragment به لایه با شناسه my_layout و commit کردن عملیات به اتمام می‌رسانیم.

نتیجه اجرای برنامه فوق در ماشین مجازی مانند زیر خواهد بود:

استفاده از Fragment ها

فراخوانی Fragment‌ها درون لایه نمایش با یک کلید

در این قسمت قصد داریم یک کلید به لایه کاربری نرم افزار خود اضافه کنیم تا با کلیک کردن روی آن Fragment در همان صفحه لود شود.

همانطور که در قسمت پنجم آموزش گفتیم، در پنل Palette شش لایه مختلف وجود دارد که در این قسمت قصد داریم از FrameLayout استفاده کنیم.

اگر کلاس MainActiviy را ویرایش کردید دستورهای اضافه شده قسمت‌های قبل را از آن پا کنید.

لایه نمایش اصلی نرم افزار خود را به صورت زیر ویرایش می‌کنیم:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    tools:context="hitos.ir.hitosapp.MainActivity"
    android:id="@+id/my_layout">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment Button"
        android:id="@+id/button"/>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:id="@+id/frame_layout">
    </FrameLayout>
</RelativeLayout>

به لایه RelativeLayout یک شناسه با نام my_layout دادیم.

در سطرهای 10 تا 14 یک کلید با شناسه button ایجاد کردیم.

در سطرهای 16 تا 19 یک FrameLayout با شناسه frame_layout ایجاد کردیم.

کلاس MainActivity مانند زیر خواهد بود:

public class MainActivity extends AppCompatActivity {

  private Button button;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button = (Button) findViewById(R.id.button);

    button.setOnClickListener(new View.OnClickListener(){
      @Override
      public void onClick(View v) {
        NewFragment newFragment = new NewFragment();
        FragmentManager manager = getFragmentManager();
        manager.beginTransaction().replace(R.id.frame_layout, newFragment).commit();
      }
    });
  }
}

در سطر 3 یک متغیر از نوع Button و با نام button ایجاد کردیم.

در سطر 10 متغیر button را به Button موجود در لایه نمایش متصل کردیم.

در سطرهای 12 تا 19 کدهای لازم برای عملکرد کلید button را اضافه کردیم.

در سطر 15 از روی کلاس NewFragment یک نمونه با نام newFragment ایجاد کردیم.

در سطر 16 یک manager برای Fragment ایجاد کردیم.

در سطر 17 با beginTransaction و replace کردن محتویات درون FrameLayout با کلاس newFragment و commit کردن عملیات به اتمام می‌رسد.
نتیجه مانند زیر خواهد بود:

آموزش Fragment ها

پس از کلیک کردن روی کلید داریم:

آموزش Fragment‌ها و اندروید

قسمت‌های بعدی آموزش اندروید را از دست ندهید.

تگ ها: android / اندرویدandroid studio