【问题标题】:Error when invoking a function/method?调用函数/方法时出错?
【发布时间】:2017-05-30 03:09:24
【问题描述】:

由于某种原因,当我调用 addFrag 函数/方法来填充片段和字符串标题时出现错误。我正在使用适配器创建一个简单的ViewPager。顺便说一句,这一切都在一个片段中。代码如下:

public class HomeFragment extends Fragment {

    private View view;
    private ViewPager viewPager;
    private TabLayout tabLayout;
    private PagerAdapter adapter;

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

        viewPager = (ViewPager) view.findViewById(R.id.viewpager);
        setUpViewPager(viewPager);

        tabLayout = (TabLayout) view.findViewById(R.id.sliding_tabs);
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
            }
        });
        return view;
    }



    private void setUpViewPager(ViewPager viewPager) {
        adapter = new ViewPagerAdapter(getChildFragmentManager());
        adapter.addFrag(new ContentFragment(), "ONE");
        adapter.addFrag(new ContentFragment(), "TWO");
        adapter.addFrag(new ContentFragment(), "THREE");
        viewPager.setAdapter(adapter);
    }


}

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

    //Default Fragment Constructor
    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }


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

    @Override
    public int getCount() {
        return fragmentList.size();
    }
    public void addFrag(Fragment fragment, String title){
        fragmentList.add(fragment);
        tabTitles.add(title);
    }
    @Override
    public CharSequence getPageTitle(int position){
        return tabTitles.get(position);
    }

}

当我尝试输入 adapter.addFrag(new ExampleFragment(), "Hello"); 时,我收到一个错误,无法解析方法 addFrag。任何帮助将不胜感激。

【问题讨论】:

  • 什么是ContentFragment()
  • ContentFragment() 是片段的实例,例如,我将创建一个名为 ContentFragment 的新类并扩展 Fragment。

标签: java android android-fragments android-viewpager android-tablayout


【解决方案1】:

adapter 被声明为 PagerAdapter,而不是 ViewPagerAdapter。因此,您可以在adapter 上使用的唯一方法是为PagerAdapter 定义的方法。编译器不知道adapter 在那个时候实际上是ViewPagerAdapter——我可以说它会,因为我在上面看到了赋值adapter = new ViewPagerAdapter(...),但是不允许编译器注意到(这些是语言的规则)。而是:

ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());

使用viewPagerAdapter 调用您的addFrag 方法,并最终分配adapter = viewPagerAdapter;

【讨论】:

  • 谢谢@ajb!!你已经解决了我的问题,我不敢相信我用 PagerAdapter 替换了 ViewPagerAdapter!
【解决方案2】:

private PagerAdapter adapter; 更改为private ViewPagerAdapter adapter;

将转换适配器键入ViewPagerAdapter,然后调用addFlag

((ViewPagerAdapter)adapter).addFlag(new ContentFragment(), "ONE");

【讨论】:

  • 感谢您的评论,Type cast 总有一天会派上用场的。
猜你喜欢
  • 1970-01-01
  • 2015-02-06
  • 2011-06-16
  • 1970-01-01
  • 2012-07-22
相关资源
最近更新 更多