使用支持库v13的ViewPager页面变换器

4
我的应用程序使用Android的ViewPager和FragmentStatePagerAdapter,它只需要支持Android 4.x或更高版本。我正在使用v13支持库来处理ViewPager,因此我不需要处理SupportFragments,我只需要使用Android.app.Fragment。一切都按预期工作,但现在我正在尝试向我的ViewPager添加一个PageTransformer,但遇到了问题。 ViewPager.setPageTransformer(bool, PageTransformer)未被识别为方法,PageTransformer也未被识别为类(我尝试了许多导入的组合,但无济于事)。使用v4支持库,ViewPager.setPageTransformer是一个方法,但如果我使用支持库v4,我必须使用SupportFragments,这我认为是不必要的,因为我支持的Android版本。
问题:support v13库的ViewPager是否支持PageTransformers?使用本地Fragments是否有任何好处,还是应该使用支持库v4?
编辑:我添加了文件的导入和相关代码,以展示我的问题。
import java.lang.reflect.Field;
import android.app.Fragment;
import android.app.FragmentManager;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

在我的类中(它没有继承任何东西),我正在尝试在这个方法中设置页面转换器:
public View createView(LayoutInflater inflater, ViewGroup container) {
        // Inflate the layout containing a title and body text.
        ViewGroup rootView = (ViewGroup) inflater
                .inflate(R.layout.carousel_fragment, container, false);


        mContainer = (PagerContainer) rootView.findViewById(R.id.pager_container);
        //PagerContainer makes it easy to display more than one page from the ViewPager
        //on screen at once
        mPager = mContainer.getViewPager();


        mAdapter = new MyPagerAdapter(MainActivity.getActivity().getFragmentManager());
        mPager.setAdapter(mAdapter);

        mPager.setOffscreenPageLimit(2);
        mPager.setPageMargin(10);
        mPager.setClipChildren(false);
        mPager.setCurrentItem(mPager.getAdapter().getCount()/2, false);

        mPager.setPageTransformer(false, new PageTransformer(){
            @Override
            public void transformPage(View page, float position) {
                // do something that isn't default behavior
            }
        });

        Field mScroller;
        try {
            mScroller = ViewPager.class.getDeclaredField("mScroller");

            mScroller.setAccessible(true); 
            CustomScroller scroller = new CustomScroller(MainActivity.getContext());

            mScroller.set(mPager, scroller);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } 

        return rootView;
    }

我遇到的具体错误是cannot find symbol: PageTransformersetPageTransformer方法也有类似的错误。我的项目使用了android-support-v13.jar但没有v4.jar,因为当我同时包含它们时会出现DEX错误。
我可能做错了什么,但还是无法解决问题。感谢您提供的任何帮助。
4个回答

1
我刚刚尝试了使用v13支持库,没有发现任何问题:
mPager.setPageTransformer(false, new PageTransformer() {

            @Override
            public void transformPage(View page, float position) {
                // TODO Auto-generated method stub

            }
        });

实际上,v4 jar 中的 ViewPager 与 v13 jar 中的完全相同。此外,PageTransformer 根本不依赖于 Fragment。你能提供一些代码吗?
编辑:
你缺少一个导入:
import android.support.v4.view.ViewPager.PageTransformer;

你的类里有这个东西吗?请确保你匿名的PageTransformer实际上是实现了android.support.v4.view.ViewPager.PageTransformer而不是其他什么东西。


谢谢您的回复。我在原问题中发布了代码,希望能更清楚地说明我的问题。我正在尝试使用mPager.setPageTransformer来实现您提出的内容,但仍然出现错误。我知道PageTransformer不依赖于片段,现在我明白了我的原始问题有些不清楚,希望我的代码片段能够帮助解决问题。 - peteross
我尝试导入PageTransformer,但是我得到了与PageTransformer相关的“找不到符号”错误。我正在使用Android Studio,我的问题可能是由于那里的一个错误吗?我尝试重新启动IDE和重新下载最新的兼容库,但这些也没有起作用。 - peteross
我刚在Android Studio尝试了一下,这个可以正常工作。此外,你也必须使用support v4。实际上,support v13只是v4的超集,它包含了v4的所有内容。ViewPager仅包含在v4包中。你是否正在使用Gradle正确导入Support库? - WonderCsabo

1
在build.gradle文件的dependencies中添加compile 'com.android.support:support-v13:23.1.1'

enter image description here


1
当我在“使用ViewPager进行屏幕滑动”教程上工作时,遇到了同样的问题,但是打包的v4支持库版本不包含PagerTransformer接口。因此,请删除该jar文件,并用Android->extras->support->v13文件夹中的版本进行替换。

0

希望这可以帮助你更进一步(我认为编译器未找到的符号是以下方法):

当针对HoneyComb以下的平台时,您可能想要使用View的这些方法(在PageTransformer实现类中),但这些方法在这些平台上不可用:

View view=findViewById(R.id.viewInsidePager);
view.setAlpha(1);
view.setTranslationX(0);
view.setScaleX(1);
view.setScaleY(1);

请使用以下方式:

ViewCompat.setAlpha(view,1);
ViewCompat.setTranslationX(view,0);
ViewCompat.setScaleX(view,1);
ViewCompat.setScaleY(view,1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接