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.
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();