It's a example of using PreferenceFragment.
New a Android Application Project, AndroidPreferenceFragment, with Build SDK target Android 4.1 (API 16) and Minimum Required Android 3.0 (API 11), BlankActivity with Navigation Type of None.
Create /res/xml/preferences.xml to define our preferences.
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="PreferenceCategory A">
<CheckBoxPreference
android:key="checkbox_preference"
android:title="title_checkbox_preference"
android:summary="summary_checkbox_preference" />
</PreferenceCategory>
<PreferenceCategory
android:title="PreferenceCategory B">
<EditTextPreference
android:key="edittext_preference"
android:title="title_edittext_preference"
android:summary="summary_edittext_preference"
android:dialogTitle="dialog_title_edittext_preference" />
</PreferenceCategory>
</PreferenceScreen>
Create PrefsFragment.java extends PreferenceFragment to addPreferencesFromResource.
package com.example.androidpreferencefragment;
import android.os.Bundle;
import android.preference.PreferenceFragment;
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
}
Create SetPreferenceActivity.java to load PrefsFragment.
package com.example.androidpreferencefragment;
import android.app.Activity;
import android.os.Bundle;
public class SetPreferenceActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content,
new PrefsFragment()).commit();
}
}
Modify the main layout, /res/layout/activity_main.xml, to show the preference.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
tools:context=".MainActivity" />
<CheckBox
android:id="@+id/prefCheckBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="CheckBoxPreference" />
<TextView
android:id="@+id/prefEditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
The main activity, MainActivity.java.
package com.example.androidpreferencefragment;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.TextView;
public class MainActivity extends Activity {
CheckBox prefCheckBox;
TextView prefEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prefCheckBox = (CheckBox)findViewById(R.id.prefCheckBox);
prefEditText = (TextView)findViewById(R.id.prefEditText);
loadPref();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
/*
* Because it's onlt ONE option in the menu.
* In order to make it simple, We always start SetPreferenceActivity
* without checking.
*/
Intent intent = new Intent();
intent.setClass(MainActivity.this, SetPreferenceActivity.class);
startActivityForResult(intent, 0);
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
//super.onActivityResult(requestCode, resultCode, data);
/*
* To make it simple, always re-load Preference setting.
*/
loadPref();
}
private void loadPref(){
SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean my_checkbox_preference = mySharedPreferences.getBoolean("checkbox_preference", false);
prefCheckBox.setChecked(my_checkbox_preference);
String my_edittext_preference = mySharedPreferences.getString("edittext_preference", "");
prefEditText.setText(my_edittext_preference);
}
}
Finally, modify AndroidManifest.xml to add SetPreferenceActivity.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidpreferencefragment"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SetPreferenceActivity"
android:label="@string/title_activity_main" >
</activity>
</application>
</manifest>
Download the files.
Next:
- PreferenceFragment with ListPreference
Thank you very much fir this I have been looking all over for an example of this
ReplyDeleteThanks for the nice tutorial :)
ReplyDeleteExcellent. Couldn't find a working example anywhere but here :)
ReplyDeleteOH MY GOD Thank you!!!!!!!
ReplyDeleteI forgot I needed to modify the manifest lol.
Very good it works for deprecated method addpreferencesfromresource at API 11.
ReplyDeleteThanks a lot, the best well explained example of setting fragments
ReplyDeleteIf you would like to change a preference summary you would need to handle that preference somehow. The method findpreference() is deprecated and ever returns null in fragment preference, so, how do you do to change the preference summary?
ReplyDeleteThanks for your tutorial
hello,
ReplyDeleteAs my understanding, what deprecated is PreferenceActivity. That means you still can use findPreference() of PreferenceFragment.
I have a question about a line:
ReplyDeletegetFragmentManager().beginTransaction().replace(android.R.id.content,
new PrefsFragment()).commit();
I get an error under "R.id.content"
The error is: content cannont be resolved or is not field
I am wondering what am i suppose to replace "content"
what is the R.id.content pointing to?
Thank you Very much Worked a treat
ReplyDeleteBig thanks for the tutorial...but i have a problem, instead of showing the checkbox uncheck in the main activity, how would i mute the application sound on/off according the the checkbox in the prefs activity....????HELP
ReplyDeleteThis comment has been removed by the author.
ReplyDeleteI've been struggling with this problem for hours and hours where just replacing the fragments left the preferences fragment background as transparent and it would overlay on top of other content.
ReplyDeleteThis fixed that for me, so thanks!!
content cannont be resolved or is not field in "R.id.content"
ReplyDeleteThis helped so much, so good to have a bit of code to copy and integrate
ReplyDeleteHow to resolve situation when we have several of these PReferenceCategories with 2-3 preferencies..? When we add all of this fragments to the Activity Layout some of them will not be visible because they are out of screen. LinearLayout wrapped in a ScrollView makes just more troubles.. Any hints?
ReplyDeleteOHHH!!! GOD!! Thank youuu sooo muchhhh this is exactly what I was searching for Thank youu ToT !!
ReplyDeleteGreat tutorial! I couldnt find any clear documentation on how to conncect the pieces. Thank you
ReplyDelete