2

I'm trying to create a Preferencefragment or a PreferenceActivity using the tabs. Actually i can't do it and my code is simply: The MainActivity

public class MainActivity extends AppCompatActivity {

    private ViewPagerAdapter mSectionsPagerAdapter;
    private ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mSectionsPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPager = (ViewPager) findViewById(R.id.container);
        setupViewPager(viewPager);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new FirstFragment(), "ONE");
        adapter.addFragment(new SecondFragment(), "TWO");
        adapter.addFragment(new ThirdFragment(), "THREE");
        viewPager.setAdapter(adapter);
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }
}

and one of the fragment

public class FirstFragment extends Fragment{
    public FirstFragment () {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first, container, false);

        return view;
    }

}

As you can see it's empty. Now, i need replace the fragments with the preferencefragment. But i can't understand how implement them with tabs. How can i do it?

Daniel Nugent
  • 43,104
  • 15
  • 109
  • 137
Atlas91
  • 5,754
  • 17
  • 69
  • 141

1 Answers1

3

Not too long ago, this would not have been possible, due to PreferenceFragments not working well with the support library. With the latest version of the support v7 library, we now have the PreferenceFragmentCompat class, which will work in an AppCompatActivity, and will also work with your ViewPager and FragmentPagerAdapter.

Since you're using support library fragments with android.support.v4.app.FragmentPagerAdapter, this is the only option with your current configuration. Note that it is possible to use a TabLayout with non-support fragments, however you have to use the android.support.v13.app.FragmentPagerAdapter class, which does allow use of non-support fragments.

So to keep your current configuration and make it work, make your PreferenceFragment extend PreferenceFragmentCompat:

import android.os.Bundle; 
import android.support.v7.preference.PreferenceFragmentCompat; 
import android.view.View; 

public class MySettingsPrefFragment extends PreferenceFragmentCompat { 

    public MySettingsPrefFragment() { 
        // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        addPreferencesFromResource(R.xml.fragment_settings_pref); 
    } 

    @Override 
    public void onCreatePreferences(Bundle bundle, String s) { 

    } 
}

Add a new tab that corresponds to your PreferenceFragment:

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new FirstFragment(), "ONE");
    adapter.addFragment(new SecondFragment(), "TWO");
    adapter.addFragment(new ThirdFragment(), "THREE");
    adapter.addFragment(new MySettingsPrefFragment(), "SETTINGS"); //added
    viewPager.setAdapter(adapter);
}

And, that should be it!

Community
  • 1
  • 1
Daniel Nugent
  • 43,104
  • 15
  • 109
  • 137
  • Nice explanation, after work i'll try. Thanks anyway! I'll accept the answer as soon as possibile – Atlas91 Feb 02 '16 at 08:11
  • @End.Game Does it work? Does it require compile SDK 23? – TOP Nov 07 '16 at 04:10
  • I am trying to use Fragment Activity and Preference Fragment Together but app crashing while coming back to Fragment activity from Fragment Preference. Is this combination workable? can u guide. – Panache Feb 01 '17 at 14:05