【问题标题】:How can I add a PreferenceFragment in a ViewPager?如何在 ViewPager 中添加 PreferenceFragment?
【发布时间】:2018-03-11 22:52:43
【问题描述】:

我所有的片段都是 android.support.v4.app.Fragment 并且 Viewpager 扩展了 FragmentStatePagerAdapter,它也使用了 android.support.v4.app.Fragment。

我有一个扩展 PreferenceFragment 的 Fragment 类,我想将它与其他两个片段一起添加到我的 Viewpager 中。

我怎样才能做到这一点?

这是我的 ViewPager

public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

private ArrayList<Fragment> mFragments = new ArrayList<>();
private ArrayList<String> mFragmentsTitle = new ArrayList<>();

public void addFragment(Fragment fragment, String title){
    mFragments.add(fragment);
    mFragmentsTitle.add(title);
}

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

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

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

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


}

这是我的 PreferenceFragment 中的内容

public class GameNotesFragment extends PreferenceFragment {


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


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_game_notes, container, false);
    return view;
}

}

当我尝试添加它时:

mSectionsPagerAdapter.addFragment(new GameNotesFragment(), "Note");

它给了我

Wrong firt argument com.example.fragments.GameNotesFragment', required: 'android.support.v4.app.Fragment' 

【问题讨论】:

  • 你的问题到底是什么?
  • 问题是我无法在 viewpager 中添加 PrefrenceFragment
  • 首先,“我无法在viewpager中添加我的PrefrenceFragment”是什么意思?它是否显示编译错误?还是运行时错误(例如异常)?其次,我很确定你不应该在 PreferenceFragment 中覆盖 onCreateView(...)
  • 我编辑了我的问题。请检查一下!
  • 您使用了错误的基类。看看我的回答。

标签: android android-fragments android-viewpager


【解决方案1】:

PreferenceFragment 扩展了Fragment 类的平台变体。您需要的是一个 PreferenceFragmentCompat,它扩展了 Fragment 的支持库变体(注意不同的包)。

支持首选项需要您的 gradle 文件中的其他软件包:

implementation 'com.android.support:preference-v7:27.1.0'
implementation 'com.android.support:preference-v14:27.1.0'

另外,当您使用它时,请务必查看我为支持首选项的常见(并且非常烦人)错误创建的 bug fix lib

【讨论】:

  • PreferenceFragmentCompat is not found 我需要更改我的 gradle 吗?
  • 是的,您需要将支持首选项包添加到您的 gradle。检查我更新的答案。
  • 我忘记接受你的回答了,很抱歉。谢谢!
  • 当然,没问题。谢谢!
【解决方案2】:
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {

    private ArrayList<Fragment> mFragments = new ArrayList<>();
    private ArrayList<String> mFragmentsTitle = new ArrayList<>();

    public void addFragment(Fragment fragment, String title){
        mFragments.add(fragment);
        mFragmentsTitle.add(title);
    }

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public android.support.v4.app.Fragment getItem(int position) {
        android.support.v4.app.Fragment f = null;
        if (position == 0) {
            f = new GameNotesFragment();
        }

        if (position == 1) {
            f = new GameNotesFragment(); //replace your fragment 2
        }

        if (position == 2) {
            f = new GameNotesFragment();//replace your fragment 3
        }

        return f;
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {

        switch (position) {
            case 0:
                return getResources().getString(R.string.name1);
            case 1:
                return getResources().getString(R.string.name2);
            case 2:
                return getResources().getString(R.string.name3);
        return null;
    }
}

在活动中:

SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(MainActivity.this.getSupportFragmentManager());
tabLayout = v1.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));

【讨论】:

    猜你喜欢
    • 2016-04-08
    • 2016-03-09
    • 2014-09-25
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多