Android中Fragment子類及其PreferenceFragment的創建過程演示
Fragment創建方式
Fragment有兩種使用方式:靜態方式 和 動態方式。
1. 靜態方式
第一步:先定義一個Fragment子類。
1
2
3
4
5
6
7
8
|
public
class
ExampleFragment extends
Fragment { @Override public
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) { return
inflater.inflate(R.layout.example_fragment, container, false ); }
} |
說明:ExampleFragment是Fragment的子類,它的佈局定義是example_fragment.xml文件。
第二步:定義Fragment子類對應的佈局文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<? xml
version = "1.0"
encoding = "utf-8" ?> android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "horizontal"
> < EditText
android:id = "@+id/edit_message" android:layout_width = "0dp" android:layout_height = "wrap_content" android:layout_weight = "1" android:hint = "@string/edit_message"
/> < Button android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/button_send" android:onClick = "sendMessage"
/> </ LinearLayout > |
說明:上面是example_fragment.xml的內容。
第三步:在需要用到該Fragment的Activity對應的佈局中使用該Fragment。
下面是引用Fragment的Activity的代碼:
1
2
3
4
5
6
7
8
9
10
|
public
class
FragmentLayoutTest extends
Activity { /**
Called when the activity is first created. */ @Override public
void
onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main);
}
} |
下面是main.xml的內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<? xml
version = "1.0"
encoding = "utf-8" ?> android:orientation = "vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > < TextView android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:text = "@string/fragment_intro" /> < fragment
android:name = "com.skw.fragmentlayouttest.ExampleFragment" android:id = "@+id/frag_example" android:layout_weight = "1" android:layout_width = "match_parent" android:layout_height = "match_parent" /> </ LinearLayout > |
說明:在該佈局文件中通過調用了先前自定義的ExampleFragment。
點擊查看:靜態方式的完整源碼
2. 動態方式
重複"上面的第一步和第二步",實現一個Fragment子類。
第三步:在需要用到該Fragment的Activity對應的佈局中使用定義一個FrameLayout。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<? xml
version = "1.0"
encoding = "utf-8" ?> android:orientation = "vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > < TextView android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:text = "@string/fragment_intro" /> < FrameLayout android:id = "@+id/frag_example" android:layout_width = "match_parent" android:layout_height = "match_parent" /> </ LinearLayout > |
第四步:在Activity中將Fragment填充到FrameLayout中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public
class
FragmentLayoutTest extends
Activity { @Override protected
void
onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); //
獲取FragmentManager FragmentManager
fragmentManager = getFragmentManager(); //
獲取FragmentTransaction FragmentTransaction
fragmentTransaction = fragmentManager.beginTransaction(); //
獲取ExampleFragment ExampleFragment
fragment = new
ExampleFragment(); //
將fragment添加到容器frag_example中 fragmentTransaction.add(R.id.frag_example,
fragment); fragmentTransaction.commit(); } } |
PreferenceFragment使用說明
1. 創建配置文件
新建res/xml/preferences.xml,內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
< PreferenceCategory android:title = "PreferenceCategory
A" > <!--
(01)
android:key是Preferece的id (02)
android:title是Preferece的大標題 (03)
android:summary是Preferece的小標題 --> < CheckBoxPreference android:key = "checkbox_preference" android:title = "title_checkbox_preference" android:summary = "summary_checkbox_preference"
/> </ PreferenceCategory > < PreferenceCategory android:title = "PreferenceCategory
B" > <!--
android:dialogTitle是對話框的標題 android:defaultValue是默認值 --> < EditTextPreference android:key = "edittext_preference" android:title = "title_edittext_preference" android:summary = "null" android:dialogTitle = "dialog_title_edittext_preference" android:defaultValue = "null"
/> <!--
android:entries是列表中各項的說明 android:entryValues是列表中各項的值 --> < ListPreference android:key = "list_preference" android:dialogTitle = "Choose
font" android:entries = "@array/pref_font_types" android:entryValues = "@array/pref_font_types_values" android:summary = "sans" android:title = "Font" android:defaultValue = "sans" />
</ PreferenceCategory > < PreferenceCategory android:title = "PreferenceCategory
C" > < SwitchPreference android:key = "switch_preferece" android:title = "title_switch_preferece" android:defaultValue = "true"
/> < SeekBarPreference android:key = "seekbar_preference" android:title = "title_seekbar_preference" android:max = "100" android:defaultValue = "30"
/> </ PreferenceCategory > </ PreferenceScreen > |
說明:PreferenceFragment的組件很多,包括CheckBoxPreference, EditTextPreference, ListPreference, SwitchPreference, SeekBarPreference, VolumePreference等。這些組建的屬性定義如下。
(01) android:key是Preferece的id,它是Preferece的唯一標識。
(02) android:title是Preferece的大標題。
(03) android:summary是Preferece的小標題。
(04) android:dialogTitle是對話框的標題。
(05) android:defaultValue是默認值。
(06) android:entries是列表中各項的說明。
(07) android:entryValues是列表中各項的值。
注意:SwitchPreference是API 14(Android4.0)才支持的。所以,要想使用SwitchPreference的話,必須在manifest中定義apk支持的最小版本。
<uses-sdk android:minSdkVersion="14" />
2. 自定義PreferenceFragment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
public
class
PrefsFragment extends
PreferenceFragment implements
SharedPreferences.OnSharedPreferenceChangeListener, Preference.OnPreferenceClickListener { private
static
final
String TAG = "##PrefsFragment##" ; private
static
final
String CHECK_PREFERENCE = "checkbox_preference" ; private
static
final
String EDITTEXT_PREFERENCE = "edittext_preference" ; private
static
final
String LIST_PREFERENCE = "list_preference" ; private
static
final
String SWITCH_PREFERENCE = "switch_preferece" ; private
static
final
String SEEKBAR_PREFERENCE = "seekbar_preference" ; private
Preference mEditText; @Override public
void
onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); //
Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); mEditText
= (Preference) findPreference(EDITTEXT_PREFERENCE); mEditText.setOnPreferenceClickListener( this ); } @Override public
void
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { //
Set summary to be the user-description for the selected value Preference
connectionPref = findPreference(key); if
(key.equals(CHECK_PREFERENCE)) { boolean
checked = sharedPreferences.getBoolean(key, false ); Log.d(TAG,
"CheckBox:
checked=" +checked); }
else
if
(key.equals(EDITTEXT_PREFERENCE)) { String
value = sharedPreferences.getString(key, "" ); connectionPref.setSummary(value); Log.d(TAG,
"EditText:
value=" +value); }
else
if
(key.equals(LIST_PREFERENCE)) { String
value = sharedPreferences.getString(key, "" ); connectionPref.setSummary(value); Log.d(TAG,
"List:
value=" +value); }
else
if
(key.equals(SWITCH_PREFERENCE)) { boolean
checked = sharedPreferences.getBoolean(key, false ); Log.d(TAG,
"Switch:
checked=" +checked); }
else
if
(key.equals(SEEKBAR_PREFERENCE)) { int
value = sharedPreferences.getInt(key, 0 ); Log.d(TAG,
"Seekbar:
value=" +value); }
} @Override public
boolean
onPreferenceClick(Preference preference) { SharedPreferences
sharedPreferences = preference.getSharedPreferences(); String
value = sharedPreferences.getString(preference.getKey(), "" ); Log.d(TAG,
"onPreferenceClick:
value=" +value); return
true ; } @Override public
void
onResume() { super .onResume(); getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener( this ); } @Override public
void
onPause() { getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( this ); super .onPause(); } } |