قالب و افزونه وردپرس

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 دیدگاه

دیدگاهتان را بنویسید

Avatar placeholder

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *