我的应用程序中的顶级活动包含一个固定标签栏,其中包含自定义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中的文本)。也许还有另一个线程正好解释了我完全错过的同一个问题。
答案 0 :(得分:1)
解决这个问题很简单。我使用了this项目中的代码和v4支持库。我之所以无法解决的问题是因为我在项目中也有v13支持库干扰了getChildFragmentManager()
。由于v13在那里,该功能被识别,即使我从未真正使用过v13。