آموزش برنامه نویسی اندروید
آموزش اندروید فصل دوم قسمت هفتم – کار با اینتنت
خرداد ۱۶, ۱۳۹۵
آموزش SQL Server
آموزش SQL Server – قسمت هفدهم
خرداد ۲۱, ۱۳۹۵
آموزش برنامه نویسی اندروید

آموزش برنامه نویسی اندروید

در قسمت شانزدهم آموزش اندروید مبحث فرگمنت ها را آموزش میدهیم (آموزش fragment در برنامه نویسی اندروید). به علاوه توضیحاتی درباره ماهیت فرگمنت ها و چرخه زندگی آنها مثالی ساده برای این مبجث نیز ذکر کرده ایم که در ادامه بیشتر درباره این مبحث صحبت خواهیم کرد.

آموزش اندروید فصل دوم قسمت هشتم – فرگمنت

توجه : برای مشاهده تصاویر در سایز اصلی بر روی آنها کلیک کنید.

فرگمنت ها

در آموزش های پیش آموختیم که یک اکتیویتی چیست و چگونه میتوان از آن استفاده کرد.در صفحه های کوچک (مثل گوشی های هوشمند) یک اکتیویتی تمام صفحه را اشغال میکند پس با استفاده از چند نما(View) به رابط کاربری برنامه خود شکل میدهیم.یک اکتیویتی اصولا ظرفی برای نماها است.اما اگر برنامه در یک صفحه نمایش بزرگتر مانند تبلت نمایش داده شود کاملا به هم ریخته خواهد شد چرا که نمایش شما برای صفحه کوچکتر طراحی شده و برای صفحه های بزرگتر نیز میبایستی دوباره چینش صوت بگیرد.این حالت باعث پیچیدگی در طراحی نما خوهد شد.

ایده بهتر برای رفع این مشکل ایجاد چند اکتیویتی کوچک است که هرکدام دارای نمای خود باشد.در زمان یک اکتیویتی میتواند شامل چندین اکتیویتی کوچک باشد که البته جهت آن بستگی جهت صفحه نمایش دارد(عمودی یا افقی) در اندروید ۳ به بالا این اکتیویتی های کوچک را فرگمنت ها گویند.

تصور کنید فرگمنت یک نوع دیگر از اکتیویتی است.فرگمنت ها برای نمایش نما بوجود می آیند کاملا مثل اکتیویتی ها. فرگمنت ها همیشه در دل اکتیویتی ها جای میگیرند برای مثال تصویر زیر را در نظر بگیرید

آموزش کاربردی اندروید-قسمت شانزدهم

طبق تصویر فوق تصور کنید Fragment 1 یک لیست از عناوین کتاب است و Fragment 2 حاوی یک TextView و ImageView و… میباشد.

حال فرض کنید برنامه را درون یک دستگاه اندروید در حالت عمودی(مثل یک گوشی هوشمند) اجر کنیم اجرا کنیم در این صورت ممکن است فرگمنت ۱ در یک اکتیوتی و فرگمنت ۲ در اکتیویتی دیگر قرار گیرد هرگاه کابر آیتمی را از لیت فرگمنت ۱ انتخاب کند فرگمنت ۲ اجرا شود.

آموزش کاربردی اندروید-قسمت شانزدهم

حال اگر برنامه را به صورت افقی درون دستگاهی مانند تبلت نمایش دهیم هردو فرگمنت کنار یکدیگر اجرا میشوند

آموزش کاربردی اندروید-قسمت شانزدهم

از این بحث میتوان چنین دریافت که فرگمنت ها راه حل جامعی را برای رفع مشکل نماها در رابط کاربری اندروید ارایه میدهند. فرگمنت ها از بخش های کلیدی برنامه اندروید شما هستند میتوانند به صورت پویا اضافه و حذف شوند تا بهترین رابط کاربری را برای دستگاه بوجود آورند.

چرخه زندگی فرگمنت ها

همانند اکتیوتی ها فرگمنت ها نیز چرخه زندگی دارند هنگام ایجاد یک فرگمنت حالات زیر رخ میدهد

  • ()onAttach
  • ()onCreate
  • ()onCreateView
  • ()onActivityCreated

وقتی بک فرگمنت نمایش داده میشود حالات زیر رخ میدهد

  • ()onStart
  • ()onResume

وقتی بک فرگمنت به حالت Background یا پس زمینه میرود و بدون آنکه نابود شود از حالت نمایش پنهان شود

  • ()onPause
  • ()onStop

وقتی که فرگمنت نابود میگردد(یعنی زمانی که یک اکتیوتی میزبان فرگمنت را نابود میکند)

  • ()onPause
  • ()onStop
  • ()onDestroyView
  • ()onDestroy
  • ()onDetach

همانند اکتیویتی ها میتوان یک وهله از فرگمنت را به وسیله شی Bundle در حالت زیر بازیابی کرد

  • ()onCraeate
  • ()onCreateView
  • ()onActivityCreate
.

بیشتر حالاتی که ممکن است برای فرگمنت اتفاق بیفتد شبیه حالاتی است که برای اکتیویتی آن اتفاق می افتد چند حالت که مختص فرگمنت ها هستند به شرح ذیل است :

  • ()onAttached : وقتی که فرگمنتی به اکتیویتی ملحق میشود فراخوانی میگردد.
  • ()onCreatedView : برای ایجاد view در فرگمنت فراخوانی میشود.
  • ()onActivityCreated : وقتی که متد ()onCreate اکتیوتی تمام شد فراخوانی میشود.
  • ()onDestroyView : وقتی که view فرگمنت حذف شود فراخوانی میگردد.
  • ()onDetach : وقتی که فرگمنتی از اکتیویتی جدا شود فراخوانی میگردد.

نکته قابل توجه دررابطه با تفاوت اکتیویتی ها و فرگمنت این است که زمانی که اکتیوتی به پس زمینه میرود درواقع back stack قرار میگیرد.این نکته به اکتیویتی اجازه میدهد تا وقتی کابر دکمه back رافشرد اکتیویتی قابل برگشت باشد. اما در مورد فرگمنت ها این اتفاق به صورت خودکار صورت نمیپذیرد و در back stack قرار نمیگیرند مگر اینکه متد ()addToBackStack را در تراکنش های فرگمنت به صورت صریح فراخوانی کنید.

حال یک مثال ساده برای فرگمنت ها آموزش میدهیم که براساس افقی یا عمودی بودن صفحه دستگاه یکی از فرگمنت هارا نمایش میدهد

ابتدا پروژه جدیدی با نام FragmentsPrj ایجاد کرده و دو فایل xml با نام های fragment1 و fragment 2 در مسیر res/layout ایجاد کرده و محتویاتشان را چنان تغییر میدهیم

محتوی fragment1 که تنها یک textview ایجاد کرده و در صورت افقی بودن نشان داده میشود

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="this is Landscape Fragment"

android:textColor="#000000"

android:textSize="25px" />

محتوی fragment 2 که در صورت عمودی بودن دستگاه نشان داده میشود

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="this is Portrate Fragment"

android:textColor="#000000"

android:textSize="25px" />

حال درون فایل activity_main.xml چنین کدنویسی میکنیم

<fragment

android:name="com.example.fragments"

android:id="@+id/fragment1"

android:layout_weight="1"

android:layout_width="0dp"

android:layout_height="match_parent" />

<fragment

android:name="com.example.fragments"

android:id="@+id/fragment2"

android:layout_weight="2"

android:layout_width="0dp"

android:layout_height="match_parent" />

حال دو کلاس جاوا برای دو فرگمنت ایجاد شده با نام های Fragment1 و Fragment2 ایجاد کرده و درون فایل Fragment1.java چنین کدنویسی میکنیم

import android.app.Fragment;

import android.os.Bundle;

import android.view.*;

public class Fragment1 extends Fragment {

        @Override

        public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState)

        {
                 //--Inflate the layout for this fragment--

                 return inflater.inflate(R.layout.fragment1, container, false);
        }
}

و درون فایل Fragment2.java نیز بدین صورت

import android.app.Fragment;

import android.os.Bundle;

import android.view.*;

public class Fragment2 extends Fragment {

        @Override

        public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState)

        {
                 //--Inflate the layout for this fragment--

                 return inflater.inflate(R.layout.fragment2, container, false);
        }
}

حال در MainActivity.java برای مشخص کردن اکتیویتی مناسب و نمایش آن چنین کدنویسی میکنیم

import android.os.Bundle;

import android.app.Activity;

import android.app.FragmentManager;

import android.app.FragmentTransaction;

import android.content.res.Configuration;

import android.view.WindowManager;

public class MainActivity extends Activity {

   @Override

   protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      Configuration config = getResources().getConfiguration();

      FragmentManager fragmentManager = getFragmentManager();

      FragmentTransaction fragmentTransaction =

      fragmentManager.beginTransaction();

      // Check the device orientation and act accordingly 

      if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {

         // Landscape mode of the device

         Fragment1 f1 = new Fragment1();

         fragmentTransaction.replace(android.R.id.content, f1);

      }else{

           // Portrait mode of the device

         Fragment2 f2 = new Fragment2();

         fragmentTransaction.replace(android.R.id.content, f2);

      }

      fragmentTransaction.commit();

   }

}

حال میتوان برنامه را اجرا کرد و نتیجه ا بسته به دستگاه اجرا کننده مطابق شکل زیر ببینید

آموزش کاربردی اندروید-قسمت شانزدهم

روش کار

یک فرگمنت بسیار به اکتیویتی شباهت دارد چرا که دارای کلاس جاوا است و همچنین رابط کاربری خود را از xml بارگذاری میکند.کلاس جاوایی که برای فرگمنت نوشته میشود باید کلاس پایه fragment را بسط دهد

public class Fragment2 extends Fragment {

برای ترسیم رابط کاربری یک فرگمنت متد onCreateView() را override میکنیم این متد یک شی از نوع View را برمیگرداند

@Override

        public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState)

        {

             //--Inflate the layout for this fragment--

             return inflater.inflate(R.layout.fragment2, container, false);

        }

در اینجا از شی LayoutInflater برای برجسته کردن رابط کاربری از فایل xml موردنظر (در این مورد R.layout.fragment2) استفاده شده.آرگومان container به ViewGroup والد اشاره داردکه همان اکتیویتی است که شما سعی دارید آن را در فرگمنت Enable کنید. آرگومان savedInstanceState به شما این قابیت را میدهد تا فرگمنت را به حالت ذخیره شده قبلی بازگردانید.

برای افزودن فرگمنت به اکتیویتی نیز از عنصر <fragment> استفاده میکنیم.

<fragment

android:name="com.example.fragments"

android:id="@+id/fragment1"

android:layout_weight="1"

android:layout_width="0dp"

android:layout_height="match_parent" />

به این نکته دقت کنید که به هر فرگمنت یک شناسه منحصر به فرد اختصاص دهید. میتوان این کار را به وسیله ویژگی های android:id یا android:tag انجام داد.

مدرس : خانم مهندس داودی نژاد

آموزش اندروید فصل دوم قسمت هفتم

آموزش اندروید فصل دوم قسمت نهم

پاسخ دهید

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