android - Adding PreferenceFragment to FragmentPagerAdapter -
i trying add preferencefragment fragmentpageradapter.
my class extends fragmentactivity, have tried fragmenttransaction, shown below trying add container , can't seem work. no errors thrown, in fact nothing happens.
main activity:
@override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); msectionspageradapter = new sectionspageradapter(getsupportfragmentmanager()); mviewpager = (viewpager) findviewbyid(r.id.pager); mviewpager.setadapter(msectionspageradapter); } activity_main.xml:
<android.support.v4.view.viewpager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" > </android.support.v4.view.viewpager> my options menu selection:
android.app.fragmentmanager fm; @override public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case r.id.menu_settings: jjsettings settings = new jjsettings(); fm = getfragmentmanager(); fragmenttransaction fragtrans = fm.begintransaction(); // tried `replace()` here well. same 'nothing happens' result. fragtrans.add(settings, "settings"); fragtrans.commit(); return true; case r.id.menu_help: menuhelp(); return true; default: return super.onoptionsitemselected(item); } } my settings fragment:
public class jjsettings extends preferencefragment { @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); addpreferencesfromresource(r.xml.settings); } } my preference stick fragments if possible, meaning i'd rather not extend preferenceactivity or take user activity calls preferencefragment, if @ possible. i'm hoping missed in research.
edit
public class sectionspageradapter extends fragmentpageradapter { private int _count = 2; public sectionspageradapter(fragmentmanager fm) { super(fm); } @override public object instantiateitem(viewgroup container, int position) { return super.instantiateitem(container, position); } @override public fragment getitem(int position) { switch (position) { case 0: return new jjmainfragment(); case 1: return new jjpendingfragment(); default: return null; } } public void setcount(int count) { this._count = count; } @override public int getcount() { return this._count; } @override public charsequence getpagetitle(int position) { switch (position) { case 0: return getstring(r.string.c_list).touppercase(locale.english); case 1: return getstring(r.string.c_pending).touppercase(locale.english); } return null; } }
this answer led me solution of using v13 support library, includes fragmentpageradapter uses bona-fide android.app.fragments can support preferencefragment.
assuming use eclipse , run new app wizard "scrollable tabs + swipe" navigation (which gives v4 pager boilerplate), here modifications need make upgrade v13:
- delete "android-support-v4.jar" file libs folder
- copy "android-support-v13.jar" sdk_path\extras\android\support\v13; if it's not there, use sdk manager install or update "extras/android support library"
then, in java file:
- change fragmentpageradapter import v4 v13
- change fragmentactivity plain activity
- change calls getsupportfragmentmanager getfragmentmanager
- import necessary classes android.app instead of android.support.v4
- (except: still need use v4 viewpager, it's compatible)
i've copied modified source below, verified on latest jellybean.
mainactivity.java:
package com.example.pagerwithpreferencesfragment; import java.util.locale; import android.app.activity; import android.app.fragment; import android.app.fragmentmanager; import android.os.bundle; import android.preference.preferencefragment; import android.support.v13.app.fragmentpageradapter; // instead of v4.app... import android.support.v4.view.viewpager; import android.view.gravity; import android.view.layoutinflater; import android.view.menu; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import android.widget.textview; public class mainactivity extends activity { // no longer fragmentactivity // these comments out-of-date; v13, not v4 /** * {@link android.support.v4.view.pageradapter} provide * fragments each of sections. use * {@link android.support.v4.app.fragmentpageradapter} derivative, * keep every loaded fragment in memory. if becomes memory * intensive, may best switch * {@link android.support.v4.app.fragmentstatepageradapter}. */ sectionspageradapter msectionspageradapter; /** * {@link viewpager} host section contents. */ viewpager mviewpager; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // create adapter return fragment each of 3 // primary sections of app. msectionspageradapter = new sectionspageradapter( getfragmentmanager()); // instead of getsupportfragmentmangager // set viewpager sections adapter. mviewpager = (viewpager) findviewbyid(r.id.pager); mviewpager.setadapter(msectionspageradapter); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate menu; adds items action bar if present. getmenuinflater().inflate(r.menu.main, menu); return true; } /** * {@link fragmentpageradapter} returns fragment corresponding * 1 of sections/tabs/pages. */ public class sectionspageradapter extends fragmentpageradapter { public sectionspageradapter(fragmentmanager fm) { super(fm); } @override public fragment getitem(int position) { // show compiles if (position == 0) { // should make public class elsewhere.. return new preferencefragment() { @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); addpreferencesfromresource(r.xml.settings_preferences); } }; } // getitem called instantiate fragment given page. // return dummysectionfragment (defined static inner class // below) page number lone argument. fragment fragment = new dummysectionfragment(); bundle args = new bundle(); args.putint(dummysectionfragment.arg_section_number, position + 1); fragment.setarguments(args); return fragment; } @override public int getcount() { // show 3 total pages. return 3; } @override public charsequence getpagetitle(int position) { locale l = locale.getdefault(); switch (position) { case 0: return getstring(r.string.title_section1).touppercase(l); case 1: return getstring(r.string.title_section2).touppercase(l); case 2: return getstring(r.string.title_section3).touppercase(l); } return null; } } /** * dummy fragment representing section of app, * displays dummy text. */ public static class dummysectionfragment extends fragment { /** * fragment argument representing section number * fragment. */ public static final string arg_section_number = "section_number"; public dummysectionfragment() { } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view rootview = inflater.inflate(r.layout.fragment_main_dummy, container, false); textview dummytextview = (textview) rootview .findviewbyid(r.id.section_label); dummytextview.settext(integer.tostring(getarguments().getint( arg_section_number))); return rootview; } } } settings_preferences.xml:
<?xml version="1.0" encoding="utf-8"?> <preferencescreen xmlns:android="http://schemas.android.com/apk/res/android"> <preferencecategory android:key="my_category_key" android:title="my title"> <checkboxpreference android:key="pref_key" android:title="title" android:summary="summary" android:defaultvalue="false" /> </preferencecategory> </preferencescreen> 
Comments
Post a Comment