不显示由片段中的ViewPager控制的片段

时间:2013-10-30 16:27:03

标签: android android-layout android-fragments android-viewpager android-pageradapter

我的应用程序中的顶级活动包含一个固定标签栏,其中包含自定义ViewPager(禁用滑动手势)和FragmentPagerAdapter。

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

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

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

这就是我的Fragment的样子:

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>

由于this在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的Fragment看起来很好,我可以在顶部看到文本“Screen slide fragment”,我没有收到任何错误。我实际上也可以在这个片段中滑动ViewPager。当我向右滑动时,我可以看到左边出现的蓝色指示符,我在第一个片段,当我向左滑动几次时,此指示符出现在右侧。所以ViewPager实际上就存在了,片段就没出现了。

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

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

1 个答案:

答案 0 :(得分:1)

解决这个问题很简单。我使用了this项目中的代码和v4支持库。我之所以无法解决的问题是因为我在项目中也有v13支持库干扰了getChildFragmentManager()。由于v13在那里,该功能被识别,即使我从未真正使用过v13。