将PreferenceFragment添加到FragmentPagerAdapter

我正在尝试将PreferenceFragment添加到FragmentPagerAdapter

我的类扩展了FragmentActivity ,我已经尝试过FragmentTransaction ,如下所示,以及尝试添加到容器中,似乎无法获得任何工作。 没有错误被抛出,事实上没有任何反应。

主要活动:

 @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.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(); // I also tried `replace()` here as 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); } } 

我的设置 Fragment

 public class JJSettings extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } } 

如果可能的话,我倾向于坚持使用Fragments ,这意味着我宁愿不扩展PreferenceActivity或者将用户带到另一个调用PreferenceFragment Activity,如果可能的话。 我只是希望在研究中遗漏一些东西。


编辑

 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; } } 

  • 从片段设置自定义ActionBar标题
  • 从片段内部调用活动方法
  • 从片段调用DialogFragment(而不是FragmentActivity)?
  • 从片段类调用Web服务(API)的正确方法
  • 如何在android中实现显示和隐藏片段
  • Android非UI片段的用法
  • 在片段之间滑动
  • Android非UI片段用法
  • 这个答案让我得到了使用v13支持库的解决方案,其中包括一个使用真正的android.app.Fragments的FragmentPagerAdapter,因此它可以支持PreferenceFragment。

    假设您使用Eclipse并使用“Scrollable Tabs + Swipe”导航(它为您提供v4寻呼机样板)运行新的应用程序向导,以下是升级到v13时需要进行的修改:

    • 从libs文件夹中删除“android-support-v4.jar”文件
    • 从SDK_PATH \ extras \ android \ support \ v13复制“android-support-v13.jar”; 如果它不存在,请使用SDK管理器安装或更新“Extras / Android Support Library”

    然后,在Java文件中:

    • 将FragmentPagerAdapter从v4导入到v13
    • 将FragmentActivity更改为普通活动
    • 将对getSupportFragmentManager的调用更改为getFragmentManager
    • 从android.app而不是android.support.v4导入所有必需的类
    • (除了:您仍然需要使用v4 ViewPager,但它兼容)

    我已复制下面的修改后的源代码,在最新的Jellybean上进行了validation。

    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 are now out-of-date; v13, not v4 /** * The {@link android.support.v4.view.PagerAdapter} that will provide * fragments for each of the sections. We use a * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which * will keep every loaded fragment in memory. If this becomes too memory * intensive, it may be best to switch to a * {@link android.support.v4.app.FragmentStatePagerAdapter}. */ SectionsPagerAdapter mSectionsPagerAdapter; /** * The {@link ViewPager} that will host the section contents. */ ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create the adapter that will return a fragment for each of the three // primary sections of the app. mSectionsPagerAdapter = new SectionsPagerAdapter( getFragmentManager()); // instead of getSupportFragmentMangager // Set up the ViewPager with the sections adapter. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mSectionsPagerAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { // this is just to show it compiles if (position == 0) { // you should really make this a public class elsewhere.. return new PreferenceFragment() { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings_preferences); } }; } // getItem is called to instantiate the fragment for the given page. // Return a DummySectionFragment (defined as a static inner class // below) with the page number as its 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; } } /** * A dummy fragment representing a section of the app, but that simply * displays dummy text. */ public static class DummySectionFragment extends Fragment { /** * The fragment argument representing the section number for this * 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"?>      

    在此处输入图像描述

    文档

    我认为您需要为片段事务指定容器视图ID。 尝试为其提供ViewPager的ID。 或者,将ViewPager放在另一个容器中,给它一个id,并使用它。