0

我的应用程序中的顶部活动包含一个带有自定义 ViewPager(禁用滑动手势)和 FragmentPagerAdapter 的固定选项卡栏。

这个标签栏可以访问三个不同的片段,在第一个片段中,我希望能够在与该片段相关的视图之间滑动。

最初我尝试使用 ViewFlipper,但我无法获得与 ViewPager 相同的手势,所以现在我尝试在片段中实现 ViewPager。

我用于 ViewPager 的代码来自 AnimationsDemo 项目,可以在页面上找到有关 ViewPager 的信息。虽然我确实通过移除允许您使用按钮按下在视图之间切换的下部栏进行了一些小的调整。

这是我的片段的样子:

import android.app.Fragment;
import android.app.FragmentManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;    

public class NewsFragment extends Fragment {
    private static final int NUM_PAGES = 5;
    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;    

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

        mPager = (ViewPager) rootView.findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager());
        new setAdapterTask().execute();

        return rootView;
    }

    private class setAdapterTask extends AsyncTask<Void,Void,Void>{
          protected Void doInBackground(Void... params) {
                return null;
            }    

            @Override
            protected void onPostExecute(Void result) {
                       mPager.setAdapter(mPagerAdapter);
            }
    }

    /**
     * A simple pager adapter that represents 5 {@link ScreenSlidePageFragment} objects, in
     * sequence.
     */
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }    

        @Override
        public Fragment getItem(int position) {
            return ScreenSlidePageFragment.create(position);
        }    

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

以及属于它的 XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:id="@+id/textviewscreenslide"
        android:text="Screen slide fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" 
        />
    <android.support.v4.view.ViewPager
        android:layout_below="@+id/textviewscreenslide"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

由于 StackOverflow 上的这篇文章,我正在使用 AsyncTask ,因为我在快速切换选项卡项时偶尔会遇到该错误。

这就是我想要显示的片段的样子:

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;    

public class ScreenSlidePageFragment extends Fragment {
    public static final String ARG_PAGE = "page";
    private int mPageNumber;    

    public static ScreenSlidePageFragment create(int pageNumber) {
        ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_PAGE, pageNumber);
        fragment.setArguments(args);
        return fragment;
    }    

    public ScreenSlidePageFragment() {
    }    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPageNumber = getArguments().getInt(ARG_PAGE);
    }    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page, container, false);
        ((TextView) rootView.findViewById(android.R.id.text1)).setText(getString(R.string.title_template_step, mPageNumber + 1));
        return rootView;
    }    

    public int getPageNumber() {
        return mPageNumber;
    }
}

以及随之而来的 XML:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp">
        <TextView android:id="@android:id/text1"
            style="?android:textAppearanceLarge"
            android:textStyle="bold"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp" />
        <TextView style="?android:textAppearanceMedium"
            android:lineSpacingMultiplier="1.2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/lorem_ipsum" />
    </LinearLayout>
</ScrollView>

因此,当我运行程序时,包含 ViewPager 的片段看起来很好,我可以在顶部看到文本“屏幕幻灯片片段”,我没有收到任何错误。我实际上也可以在这个片段中滑动 ViewPager。当我向右滑动时,我可以看到左侧出现蓝色指示器,表明我在第一个 Fragment 处,当我向左滑动几次时,该指示器出现在右侧。所以 ViewPager 实际上是存在的,片段只是没有出现。

我遇到了这个项目,它是关于嵌套 ViewPager 的,但似乎这个项目至少需要 API 级别 17。所以它甚至不可能。

所以我的问题是,有没有办法让这些片段出现(仅支持 4.0 和更高版本)或者是否有另一种更有效的方法可以在片段/视图之间切换(此寻呼机中片段的所有视图将完全在布局方面相同,唯一的区别是 TextViews 中的文本)。也许甚至还有另一个线程完全解释了我完全错过的同一个问题。

4

1 回答 1

1

解决这个问题很容易。我将这个项目中的代码与 v4 支持库一起使用。我为什么它不起作用的问题是因为我在项目中也有 v13 支持库,它干扰了getChildFragmentManager(). 由于 v13 的存在,即使我从未真正使用过 v13,该功能也无法识别。

于 2013-10-30T23:45:29.263 回答