FRAGMENT   های خاص

FRAGMENT های خاص

بسم الله الرحمن الرحیم

FRAGMENT   های خاص  (SPECIALIZED FRAGMENTS)

فصل چهارم-بخش سوم

در فصل  دوم   شما  با  Fragmetn ها و  ویژگی های  آنها اشنا  شده اید   و   یاد  گرفتید که  Fragment ها   از نسخه   اندروبد  3.1 به بعد ارائه شده  است. به استفاده از Fragment  ها  شما  می توانید  ui   خود به   استفاده  از       rearranging کردن  Fragmentها   درون   activity به    به صورت  دلخواه (customize)     در آورد. شما را  قادر  می سازد شما  برنامه  ی ایجاد کنید که  بر روی دستگاه های مختلف  به اندازه های   مختلف  صفحه نمایش اجرا   شود 

شمایاد گرفتید که Fragmet  ها درواقع activityهای کوچکی(mini-activities)   هستند که  که  چرخه  زندگی(Life  Cycle) خودشان  را  دارند.

برای ایجاد یک  Fragmet  شمایک   کلاس  که   از کلاس   پایه Fragment مشتق شده است   نیاز دارید.

در  کنار  کلاس پایه Fragment  شما   می  توانید  از  زیر  کلاس   (subClass)های دیگر  کلاس Fragmentبرای   ایجاد یک Fragment   خاص (specialized fragments)  استفاده کنید.

در ادامه 3 زیرکلاس  (SubClass) Fragment ‌را شرح می هیم:

ListFragment, DialogFragment, PreferenceFragment.

بسم الله الرحمن الرحیم

FRAGMENT   های خاص  (SPECIALIZED FRAGMENTS)

فصل چهارم-بخش سوم

در فصل  دوم   شما  با  Fragmetn ها و  ویژگی های  آنها اشنا  شده اید   و   یاد  گرفتید که  Fragment ها   از نسخه   اندروبد  3.1 به بعد ارائه شده  است. به استفاده از Fragment  ها  شما  می توانید  ui   خود به   استفاده  از       rearranging کردن  Fragmentها   درون   activity به    به صورت  دلخواه (customize)     در آورد. شما را  قادر  می سازد شما  برنامه  ی ایجاد کنید که  بر روی دستگاه های مختلف  به اندازه های   مختلف  صفحه نمایش اجرا   شود 

شمایاد گرفتید که Fragmet  ها درواقع activityهای کوچکی(mini-activities)   هستند که  که  چرخه  زندگی(Life  Cycle) خودشان  را  دارند.

برای ایجاد یک  Fragmet  شمایک   کلاس  که   از کلاس   پایه Fragment مشتق شده است   نیاز دارید.

در  کنار  کلاس پایه Fragment  شما   می  توانید  از  زیر  کلاس   (subClass)های دیگر  کلاس Fragmentبرای   ایجاد یک Fragment   خاص (specialized fragments)  استفاده کنید.

در ادامه 3 زیرکلاس  (SubClass) Fragment ‌را شرح می هیم:

ListFragment, DialogFragment, PreferenceFragment.

 

ListFragment

ListFragment یک Fragment   می باشد   که شامل یک  ListView, می باشد لیستی   از  ایتم ها  را از  یک   منبع  داده  (Data  Source ) مانند  Array  یا یک   Cursor.  را نمایش می  دهد

ListFragment ها  بسیار  مفید می باشند.زمان  های وجودداردکه که شما  می خواهیدیک Fragment شامل لیستی از داه های باشد   وFragmet دیگر جزئیات مربوط به ایتم انتخاب شده باشد   را نمایش  دهید که برای نمایش داده های از ListFragmet استفاده می  کنیم

پروژه جدیدی بانام ListFragmentExample. ایجاد کنید

 

فایل main.xml را به صورت زیر تغییر دهید.  

<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:orientation=”horizontal” >
<fragment
android:name=”net.learn2develop.ListFragmentExample.Fragment1”
android:id=”@+id/fragment1”
android:layout_weight=”0.5”
android:layout_width=”0dp”
android:layout_height=”200dp” />
<fragment
android:name=”net.learn2develop.ListFragmentExample.Fragment1”
android:id=”@+id/fragment2”
android:layout_weight=”0.5”
android:layout_width=”0dp”
android:layout_height=”300dp” />

یک فایل  Xml  با   نام  fragment1.xmlدر مسیر res/layout ایجاد کنید  وآنرا  به صورت زیر  تغییر  دهید.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
</LinearLayout>

یک  فایل  جاوا با  نا م   Fragment1.  ایجاد  کنید

package com.MehrdadJavidi.listfragmentexample;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class Fragment1 extends ListFragment {
String[] presidents = {
"Dwight D. Eisenhower",
"John F. Kennedy",
"Lyndon B. Johnson",
"Richard Nixon",
"Gerald Ford",
"Jimmy Carter",
"Ronald Reagan",
"George H. W. Bush",
"Bill Clinton",
"George W. Bush",
"Barack Obama"
};
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1, container, false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, presidents));
}
public void onListItemClick(ListView parent, View v,
int position, long id)
{
Toast.makeText(getActivity(),
"You have selected " + presidents[position],
Toast.LENGTH_SHORT).show();
}
}

برانامه را با کلید F11اجرا   کنید

 

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

بر روی  یک  ایتم از  ListView کلیک  نمایید.   پیغامی  به  شما نمایش می دهد.

توضیحات

درابتدا  شما یک فایل Xmlایجادکردید که  دارای  یک  عنصر ListView  می باشد 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
</LinearLayout>

برای  ایجاد  یک  ListFragment  کلاس  مورد  نظرباید   از کلاسListFragment  (ارث بری کند)مشتق شود.

public class Fragment1 extends ListFragment {

سپس  یک آرایه از نام رئیس جمهور ها را تعریف کردید.

String[] presidents = {
"Dwight D. Eisenhower",
"John F. Kennedy",
"Lyndon B. Johnson",
"Richard Nixon",
"Gerald Ford",
"Jimmy Carter",
"Ronald Reagan",
"George H. W. Bush",
"Bill Clinton",
"George W. Bush",
"Barack Obama"
};

در رویداد onCreate()  شما  متد setListAdapter() را که مربوط ListView  می باشد را استفاده کردید.

شی   ArrayAdapter  آرایه   که می  خواهید در  listView نمایش  داده شود را  مدیریت می کند. در این مثال شما نحوه ای نمایش  عناصر را  در حالتsimple_list_item_1 تنظیم کرده اید

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, presidents));
}

متدonListItemClick()  زمانی  که ایتمی از  ListView انتخای شد  اجرا می شود.


public void onListItemClick(ListView parent, View v,
int position, long id)
{
Toast.makeText(getActivity(),
"You have selected " + presidents[position],
Toast.LENGTH_SHORT).show();
}
}

در اخر هم شمادو Fragment  برای  Activityتعرف کرده اید.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<fragment
android:name="com.MehrdadJavidi.ListFragmentExample.Fragment1"
android:id="@+id/fragment1"
android:layout_weight="0.5"
android:layout_width="0dp"
android:layout_height="200dp" />
<fragment
android:name="com.MehrdadJavidi.ListFragmentExample.Fragment1"
android:id="@+id/fragment2"
android:layout_weight="0.5"
android:layout_width="0dp"
android:layout_height="300dp" />
</LinearLayout>

DialogFragment

یکی  دیگراز  از  Fragmetn  های که  شما می توانیدتعرف کنید  dialog fragment میباشد .dialog fragment ها  در  بالا تر از  activity ‌قرار   می گیرد.و  زمانی    های  کاربرد  دارد  که  شما  می  خواهید  قبل از  اجرای  یک عملیات     نظر  کاربر  و   پاسخ  کاربر را  را  دریافت  کنید.  و  سپس عملیات  موردنظر  اجرا  شود .

با استفاده  از  Dialog Fragmet  ها  باید  کلاس   مورد  نظر از  کلاس پایهDialogFragment  مشتق   شود(ارث بری کند  Extend  شود )

در  ادامه آن را  با  یک  مثال  شرح می  دهیم.

 

پروژه  جدیدی  به نام DialogFragmentExample. ایجاد کنید.

یک  فایل  جاوا به نام Fragment1.  ایجاد کنید.

دستورات زیر را به صورت  زیر وارد نمایید.

package com.MehrdadJavidi.dialogfragmentexample;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
public class Fragment1 extends DialogFragment {
static Fragment1 newInstance(String title) {
Fragment1 fragment = new Fragment1();
Bundle args = new Bundle();
args.putString("title", title);
fragment.setArguments(args);
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String title = getArguments().getString("title");
return new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.ic_launcher)
.setTitle(title)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
((MainActivity)
getActivity()).doPositiveClick();
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
((MainActivity)
getActivity()).doNegativeClick();
}
}).create();
}
}

و فایلmainActivity.java   به صورت زیر تغیر  دهید.

package com.MehrdadJavidi.dialogfragmentexample;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Fragment1 dialogFragment = Fragment1.newInstance(
"Are you sure you want to do this?");
dialogFragment.show(getFragmentManager(), "dialog");
}
public void doPositiveClick() {
/**---perform steps when user clicks on OK---*/
Log.d("DialogFragmentExample", "User clicks on OK");
}
public void doNegativeClick() {
/**---perform steps when user clicks on Cancel---*/
Log.d("DialogFragmentExample", "User clicks on Cancel");
}
}

برنامه  را  با F11  اجراکنید

توضیحات

برای   ساخت DialogFragment  اولین  کاری که  باید انجام دهید. باید کلاسی تعرفکنیدکه از  کلاس   DialogFragment   مشتق  شده باشد.

public class Fragment1 extends DialogFragment {}

در  این  مثال شما  یک  ایجاد alert dialog کرده اید.که یک  DialogWindows  می باشد. که  یک   پیام  را  با  دکمه های   تعیین  شده به شما  نمایشد  می  دهد.  درون کلاس Fragment1   یک  متدnewInstance()  تعریف  کرده ایم.


static Fragment1 newInstance(String title) {
Fragment1 fragment = new Fragment1();
Bundle args = new Bundle();
args.putString("title", title);
fragment.setArguments(args);
return fragment;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String title = getArguments().getString("title");
return new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.ic_launcher)
.setTitle(title)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
((MainActivity)
getActivity()).doPositiveClick();
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
((MainActivity)
getActivity()).doNegativeClick();
}
}).create();
}

 در اینجا شما یک alert dialog  با  دو دکمه  ok , Cancel ایجاد کردید

برای  نمایش  آن  شما ابتدا یک نمونه  از آن ایجاد می  کنید.سپس   متدshow() را فراخوانی  می کنید.

Fragment1 dialogFragment = Fragment1.newInstance(
"Are you sure you want to do this?");
dialogFragment.show(getFragmentManager(), "dialog");

همچنین  شما   دومتد doPositiveClick() and doNegativeClick()  رااستفاده کره اید.  که زمانی  که بر روی دکمه های  ok  , Cncel کلیک کریم  اجرا  شوند.

public void doPositiveClick() {
/**---perform steps when user clicks on OK---*/
Log.d("DialogFragmentExample", "User clicks on OK");
}
public void doNegativeClick() {
/**---perform steps when user clicks on Cancel---*/
Log.d("DialogFragmentExample", "User clicks on Cancel");
}

PreferenceFragment

برنامه های  اندروید عموما قسمتی را برای  ذخیر ه سازی  تنظیمات شخصی کاربر  فراهم میاورند.

به عنوان  مثال ممکن  است  به  کاربر  امکان  دسترسی  به منابع را با login   کردن   را بدهید تعیین  کنید  به  چه  منابعی  می توانید  دسترسی  داشته باشد. بایید این  اطلاعات  ذخیره شود. در  اندروید  برای  ذخیره  این  موارد میتواندی از PreferenceActivity  برای نمایش  داده هاو  یرایش استفاده  کنید.  در  اندروید  3  و   بالاتر  شما میتوانید ازکلاس   PreferenceFragment استفاده  کنید   

 

 

 

پروژه جدیدی   به نام PreferenceFragmentExample.  ایجادکنید.  فولدری   به نام  xml  را در  مسیر res  ایجاد  کنید  سپس   فایلی   به نام  در آن preferences.xml  ایجادکنید

در  یک  فایل preferences.xml دستورات زیر  راوارد  کنید


<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Category 1">
<CheckBoxPreference
android:title="Checkbox"
android:defaultValue="false"
android:summary="True of False"
android:key="checkboxPref" />
</PreferenceCategory>
<PreferenceCategory android:title="Category 2">
<EditTextPreference
android:name="EditText"
android:summary="Enter a string"
android:defaultValue="[Enter a string here]"
android:title="Edit Text"
android:key="editTextPref" />
<RingtonePreference
android:name="Ringtone Preference"
android:summary="Select a ringtone"
android:title="Ringtones"
android:key="ringtonePref" />
<PreferenceScreen
android:title="Second Preference Screen"
android:summary=
"Click here to go to the second Preference Screen"
android:key="secondPrefScreenPref">
<EditTextPreference
android:name="EditText"
android:summary="Enter a string"
android:title="Edit Text (second Screen)"
android:key="secondEditTextPref" />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>

یک کلاس  جاوا  به نام Fragment1. ایجاکنید.

دستوارت زیر  را در آن وارد نمایید.



package com.MehrdadJavidi.preferencefragmentexample;
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class Fragment1 extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**---load the preferences from an XML file---*/
addPreferencesFromResource(R.xml.preferences);
}
}

 فایل به صورت mainActivity.java زیر  تغییر   دهید.

package com.MehrdadJavidi.preferencefragmentexample;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
fragmentTransaction.replace(android.R.id.content, fragment1);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}

برنامه  را  با زدن F11اجرا نمایید.

 زمانی  که بر روی Edit Text کلیک می  کنید

زمانی  که بر روی Second Preference Screen کلیک می کنید

توضیحات

برا ی  استفاه ازpreferences  در برنامه اندروید شما  باید  ابتدا  یک فایل  xml به نام  ایجادpreferencesکنید 

 و درون آن انواع Element  های  Xml راتعریف نماید. فایل xml   به شما  اجازه می دهد  آنواع  که  ایتم های که نیاز داربد در برنامه persist  شود  را   تعریف  کنید.

برای ایجادpreference fragment  شما  باید  یک  کلاس که  ازکلاس  PreferenceFragmentمشتق  شده است را  ایجادکنید

public class Fragment1 extends PreferenceFragment {}

برای load  لودکردن  فایل preferencesشما  از  متدaddPreferencesFromResource() استفاده  می  کنید.

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**---load the preferences from an XML file---*/
addPreferencesFromResource(R.xml.preferences);

برای  نمایش preference fragment  شما از  کلاسهای FragmentManager  وFragmentTransaction استفاده  می کنید


FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
fragmentTransaction.replace(android.R.id.content, fragment1);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

شما نیازدارید  که preference fragment را  بهback stack  رابا استفاده از addToBackStack() اضافه  کنید  از این رو کاربر  می توانید  را باکلیک  بر روی  دکمه Back ان ها را  dismissکند

شما می توانید   فایل   را  DDMS مشاهده   کنید

در  فصل 6  شما  با  جزئیات   بیشتری  آشنای می شوید.   و به شما  آموزش  می دهیم   که  چگونه می توانیند  در فایل          بخوانید و  ویرایش   کنید

توضیحات

شما یک لیست از   تنظیمات  کاربر را برای  برنامه  کاربری  ایجاد  کردید. شما در ابتا  نیاز دارید  تا یک فایل preferences xml  ایجاد  کنید  شما  انوتع داده های  که می خواهخدی در برنامه    ماندار گار باشد را   تعریف می کنید.

برای  ایجاد  Fragment  مخصوص preference   شما باید ا ز  کلاس    پایه   PreferenceFragment  مشتق  بگیرید

public class Fragment1 extends PreferenceFragment {
}

برای لود کردن فایل preference شما از addPreferencesFromResource() استفاده می کنید


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**---load the preferences from an XML file---*/
addPreferencesFromResource(R.xml.preferences);
}
برای نمایش preference در activity شما از کلاس FragmentManager و FragmentTransaction استفاده کردید
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction =
fragmentManager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
fragmentTransaction.replace(android.R.id.content, fragment1);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس