片段中由ViewPager控制的片段不会显示
我的应用程序中的顶级活动包含一个带有自定义ViewPager(禁用滑动手势)和FragmentPagerAdapter的固定选项卡栏。
这个标签栏允许访问三个不同的片段,并且在第一个片段中,我希望能够在与该片段相关的视图之间滑动。
最初我尝试使用ViewFlipper,但我无法获得与ViewPager一样的手势,所以现在我试图在片段中实现ViewPager。
我用于ViewPager的代码来自AnimationsDemo项目,该项目可以在此页面找到关于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>
由于这篇文章在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显示得很好,我可以在顶部看到文本“屏幕幻灯片片段”,并且我没有收到任何错误。 我实际上也可以在这个片段中滑动ViewPager。 当我向右滑动时,我可以看到左侧出现的蓝色指示符,表示我处于第一个片段,而当我向左滑动几次时,此指示符出现在右侧。 所以ViewPager实际上就在那里,碎片就不会出现。
我遇到了这个项目,这是关于一个嵌套的ViewPager,但它似乎至少需要API级别17。所以它可能不可能。
所以我的问题是,是否有办法让这些碎片出现(只支持4.0和更新),还是有另一种更有效的方式来切换碎片/视图(在这个寻呼机中碎片的所有视图都将完全在布局方面相同,唯一不同的是TextView中的文本)。 也许甚至有另一个线程完全解释了我完全错过的同一个问题。
解决这个问题很简单。 我将这个项目的代码和v4支持库一起使用。 我为什么不工作的问题是因为我在项目中也有v13支持库,它干扰了getChildFragmentManager()
。 由于v13在那里功能被识别,即使我从未真正使用过v13。
上一篇: Fragments controlled by a ViewPager in a Fragment do not appear
下一篇: Android.app Fragments vs. android.support.v4.app using ViewPager?