我想使用一个FragmentStatePageAdapter并同时显示3个项目.这可以通过覆盖getPageWidth()-Method 来完成:
@Override
public float getPageWidth(int position) {
return 0.33f;
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.但我的问题是,我现在想要集中关注中心页面.目前左页是重点...
我已经看到了这个问题:
目前:
期望: 
期望2(如果滚动到结尾): 
你会建议什么?
我在 viewpager 中有 4 个片段。和 FragmentStatePagerAdapter 在我的 viewpager 所在的活动中。FragmentStatePagerAdapter 的 newInstance() 方法将布局 id 作为参数,因此每个片段都有自己的布局:
ViewPager pager;
public class MainActivity extends FragmentActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pager = (ViewPager) findViewById(R.id.viewPager);
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));}
private static class MyPagerAdapter extends FragmentStatePagerAdapter {
FragmentManager fm;
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public MyPagerAdapter(FragmentManager fm) {
super(fm);
this.fm = fm;
}
@Override
public Fragment getItem(int pos) {
if(pos!=0){
pos = pos%4;
}
Fragment frag;
switch(pos) {
case 0: frag = FirstFragment.newInstance(R.layout.fire_room_wall1);
return frag; …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentstatepageradapter
我正在使用viewpager来显示图片.我基本上只需要三个片段:前一个要预览的图像,当前的显示图像和下一个要预览的图像.我想只显示上一张和下一张图片的预览,当用户实际滑动到它时,它会变为完整图像.所以我想只使用3个片段来实现这一点.代码如下:
private class ImagePagerAdapter extends FragmentStatePagerAdapter implements ViewPager.OnPageChangeListener {
private ImageFragment mImageFragment;
private ImagePreviewFragment mPreviousPreviewFragment;
private ImagePreviewFragment mNextPreviewFragment;
public ImagePagerAdapter(FragmentManager fm, ImageFragment image, ImagePreviewFragment previous, ImagePreviewFragment next) {
super(fm);
mImageFragment = image;
mPreviousPreviewFragment = previous;
mNextPreviewFragment = next;
}
@Override
public Fragment getItem(int position) {
if (position == mPager.getCurrentItem()) {
mImageFragment.display(position);
return mImageFragment;
}
if (position < mPager.getCurrentItem()) {
mPreviousPreviewFragment.display(position - 1);
return mPreviousPreviewFragment;
}
mNextPreviewFragment.display(position + 1);
return mNextPreviewFragment;
}
@Override
public int getCount() {
return 100;
}
@Override …Run Code Online (Sandbox Code Playgroud) illegalstateexception android-fragments android-viewpager fragmentstatepageradapter
我在使用 FragmentStatePagerAdapter 正确显示片段内的片段时遇到了问题。第一次一切正常加载,但下次视图是空白的。我试过这个和这个答案,但它没有解决问题。
所以基本上我有一个 FriendActivityFragment 加载在 MainActivity 中:
public class FriendActivityFragment extends Fragment {
private FriendsTabsPagerAdapter mAdapter;
private ViewPager mPager;
private SlidingTabLayout mTabs;
public FriendActivityFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mAdapter == null) {
//mAdapter = new FriendsTabsPagerAdapter(getActivity().getSupportFragmentManager());
mAdapter = new FriendsTabsPagerAdapter(getChildFragmentManager());
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_friend, container, false);
super.onCreate(savedInstanceState);
mPager = (ViewPager) view.findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mTabs = (SlidingTabLayout) view.findViewById(R.id.tabs);
mTabs.setDistributeEvenly(true); …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用ViewPager和FragmentStatePagerAdapter来显示4种不同的布局.布局1,3,4由ListView组成,第二布局包含SurfaceView Camera.现在,当我在水平滚动相机时,两个边缘都会闪烁.
我搜索谷歌,并找到不同的解决方案.比如1)给android减去边距:layout_gravity ="center".2)viewPager.requestTransparentRegion(viewPager);
在第一种情况下,它在第一次工作时很好,但是当从简历返回时,它从右边切割显示黑色矩形.
我也尝试过不同的父布局,但同样的情况发生了,并试图以编程方式给出边距,但找不到任何解决方案.
这是我的Camera xml.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_gravity="center"
android:layout_marginRight="-100dp"
android:layout_marginLeft="-100dp"
android:layout_height="match_parent"
android:visibility="visible" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这是我的片段适配器.
public class DashboardAdapter extends FragmentStatePagerAdapter {
public DashboardAdapter(FragmentManager fm) {
super(fm);
fragmentList = new ArrayList<>();
fragmentList.add(new InboxFragment());
fragmentList.add(new CameraFragment());
fragmentList.add(new ContactFragment());
fragmentList.add(new AddFriendsFragmnet());
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return InboxFragment.newInstance(position);
case 1:
return CameraFragment.newInstance(position);
case 2:
return ContactFragment.newInstance(position);
case 3:
return AddFriendsFragmnet.newInstance(position);
default:
return CameraFragment.newInstance(position);
}
}
@Override
public int getCount() …Run Code Online (Sandbox Code Playgroud) android-layout android-fragments android-viewpager fragmentpageradapter fragmentstatepageradapter
我有 3 个片段需要在 ViewPager 中。这些片段将保存从数据库中检索到的动态信息。我知道在方向改变时,活动和片段会被破坏和重新创建。但我对它的名字印象是,FragmentStatePagerAdapter 将保存片段的状态。显然,我错了,因为每次我对片段做一些事情,然后改变方向时,片段就会恢复到它在布局 xml 文件中的布局方式。
在调试时,我注意到在方向更改时,从未调用 Adapter 的 getItem() 方法 - 这意味着它没有重新创建。那么片段状态是如何恢复到其原始状态的呢?
如何使用 FragmentStatePagerAdapter 保存片段状态?
请注意,我一直在关注本教程并使用他们版本的SmartFragmentStatePagerAdapter.java类来动态管理片段。
以下是我的示例代码。
PageLoader.java - 此接口允许 MainActivity 在运行时动态管理片段页面的加载。
public interface PageLoader {
void loadPage(int from, int target);
}
Run Code Online (Sandbox Code Playgroud)
主活动.java
public class MainActivity extends AppCompatActivity implements PageLoader {
MyPagerAdapter adapter;
DirectionalViewPager pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get the ViewPager and set it's PagerAdapter so that it can display items
pager = (DirectionalViewPager) findViewById(R.id.vpPager);
adapter = …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentstatepageradapter
所以我在使用带有FragmentStatePagerAdapter的ViewPager时遇到这个问题然后我试图选择当前页面(即向用户显示第二页而不是第一页),我不时会得到这个例外.
问题似乎是并发性,因为viewpager仍在添加/初始化片段,即当我正在尝试设置当前页面时正在运行片段事务.像这样的东西:
pagerAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());
viewPager.setAdapter(pagerAdapter);
pagerAdapter.addItems(...) //Addings ID's here for each fragment, this is where the adapter notifies the viewpager
viewPager.setCurrentItem(1); //This is where the two transactions at the same time might happen
Run Code Online (Sandbox Code Playgroud)
问题是:我怎么知道viewpager什么时候完成片段初始化所以设置当前页面是安全的?
确切的例外是:
Fatal Exception: java.lang.IllegalStateException: FragmentManager is already executing transactions
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1631)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1272)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1646)
at android.view.View.measure(View.java:18916)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5972)
at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:703)
at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1367)
at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:768)
at android.view.View.measure(View.java:18916)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5972)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
at android.view.View.measure(View.java:18916)
at …Run Code Online (Sandbox Code Playgroud) 我想使用视图寻呼机实现底部导航,但我的应用程序因以下异常而崩溃。无法在这里找到确切的问题,有人可以帮助我吗?
java.lang.IllegalStateException: Fragment 已经添加:RepositoriesFragment{6b6a2f2} (3aaac6af-92a3-47bc-b3e5-fa3b29ac5d52) id=0x7f080166 android:switcher:2131231078.appragment(android.addFragmentFragmentFragmentFragment) :67) 在 androidx.fragment.app.FragmentManager.addFragment(FragmentManager.java:1563) 在 androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:405) 在 androidx.fragment.app.FragmentManager.executeOps(FragmentManager. java:2167) 在 androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990) 在 androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945) 在 androidx.fragment.appManagerFragmentActionFragment(FragmentManager.java:1990) .java:1847) 在 androidx。fragment.app.FragmentManager$4.run(FragmentManager.java:413) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os。 Looper.loop(Looper.java:201) at android.app.ActivityThread.main(ActivityThread.java:6823) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$ MethodAndArgsCaller.run(RuntimeInit.java:547) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)6823) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:873)6823) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 在 com.android.internal.os.ZygoteInit.main( ZygoteInit.java:873)
这是我实现的 HomePagerAdapter:FragmentPagerAdapter
class HomePageAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
private val instantiatedFragments: SparseArray<WeakReference<Fragment>> = SparseArray()
companion object {
const val FRAGMENT_INDEX_REPO = 0 …Run Code Online (Sandbox Code Playgroud) 我喜欢 的方法FragmentFactory,它可以将依赖项传递给构造函数中的片段。
我想将自定义FragmentFactory与FragmentStatePagerAdapter.
我在活动中托管视图寻呼机。我可以创建一个自定义片段工厂并将其分配给使用的活动
supportFragmentManager.fragmentFactory = CustomFragmentFactory()
Run Code Online (Sandbox Code Playgroud)
然后我可以用它supportFragmentManager来初始化我的FragmentStatePagerAdapter. 到目前为止还好。
我的问题是视图寻呼机中的片段显示依赖于位置的数据。
假设我有一个列表items和ItemFragment,它显示在显示 的视图寻呼机中items[position],因此有一个如下的构造函数:
class ItemFragment(val item: Item) : Fragment()
Run Code Online (Sandbox Code Playgroud)
我必须如何实现CustomFragmentFactoryandFragmentStatePagerAdapter的getItem(position: Int)函数才能实现与此等效的安全功能:
override fun getItem(position: Int) = ItemFragment(items[position])
Run Code Online (Sandbox Code Playgroud) android android-fragments fragmentstatepageradapter androidx android-fragmentfactory