FragmentPagerAdapter和之间有什么区别FragmentStatePagerAdapter?
关于FragmentPagerAdapterGoogle的指南说:
此版本的寻呼机最适合在有少量通常更多静态片段进行分页时使用,例如一组选项卡.用户访问的每个页面的片段将保留在内存中,但其视图层次结构可能在不可见时被销毁.这可能导致使用大量内存,因为片段实例可以保持任意数量的状态.对于较大的页面集,请考虑
FragmentStatePagerAdapter.
关于FragmentStatePagerAdapter:
当存在大量页面时,此版本的寻呼机更有用,更像列表视图.当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态.与
FragmentPagerAdapter在页面之间切换时可能更多的开销相比,这允许寻呼机保持与每个被访问页面相关联的更少的存储器 .
所以我只有3个片段.但它们都是具有大量数据的独立模块.
Fragment1处理一些数据(用户输入)并通过活动传递给它Fragment2,这很简单ListFragment.Fragment3也是一个ListFragment.
所以我的问题是:我应该使用哪种适配器?FragmentPagerAdapter还是FragmentStatePagerAdapter?
android android-fragments android-viewpager fragmentpageradapter fragmentstatepageradapter
FragmentStatePagerAdapter已从API 27中弃用。的替代方案是FragmentStatePagerAdapter什么?
private class MainPagerAdapter extends FragmentStatePagerAdapter {
MainPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment result = new DummyFragment();
return result;
}
@Override
public int getCount() {
return 5;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码显示FragmentStatePagerAdapter,getItem并super(fm);已弃用
所以我ViewPager在屏幕方向改变后从屏幕中删除(删除)一个页面时出现问题.我将尝试在以下几行中描述问题.
我正在使用FragmentStatePagerAdapter适配器ViewPager和一个小接口来描述无限视图寻呼机应该如何工作.它背后的想法是你可以滚动到右边,直到你到达结束ViewPager.如果您可以从API调用加载更多结果,则会显示进度页面,直到结果出现.
一切都很好,直到现在,问题来了.如果在这个加载过程中,我旋转屏幕(这不会影响API调用,这基本上是一个AsyncTask),当调用返回时,应用程序崩溃给我这个异常:
E/AndroidRuntime(13471): java.lang.IllegalStateException: Fragment ProgressFragment{42b08548} is not currently in the FragmentManager
E/AndroidRuntime(13471): at android.support.v4.app.FragmentManagerImpl.saveFragmentInstanceState(FragmentManager.java:573)
E/AndroidRuntime(13471): at android.support.v4.app.FragmentStatePagerAdapter.destroyItem(FragmentStatePagerAdapter.java:136)
E/AndroidRuntime(13471): at mypackage.OutterFragment$PagedSingleDataAdapter.destroyItem(OutterFragment.java:609)
Run Code Online (Sandbox Code Playgroud)
在库的代码中挖掘了一下之后,似乎mIndex片段的数据字段小于0这种情况,这就引发了异常.
以下是寻呼机适配器的代码:
static class PagedSingleDataAdapter extends FragmentStatePagerAdapter implements
IEndlessPagerAdapter {
private WeakReference<OutterFragment> fragment;
private List<DataItem> data;
private SparseArray<WeakReference<Fragment>> currentFragments = new SparseArray<WeakReference<Fragment>>();
private ProgressFragment progressElement;
private boolean isLoadingData;
public PagedSingleDataAdapter(SherlockFragment fragment, List<DataItem> data) {
super(fragment.getChildFragmentManager());
this.fragment = new WeakReference<OutterFragment>(
(OutterFragment) fragment);
this.data = data; …Run Code Online (Sandbox Code Playgroud) android android-viewpager android-pageradapter fragmentstatepageradapter
我有viewPager2和FragmentStateAdapter,还有Fragement1,2,3 4,我在fragment2,想去掉fragment3,在fragment2后显示fragment4。问题是它总是向我显示 fragment3(data),调试显示 fragment3 已被删除,但显示的页面仍然有 fragment3 内容。
适配器:
class TipsAdapter(
private val items: MutableList<TripPage>,
context: FragmentActivity
) : FragmentStateAdapter(context) {
private val fragmentFactory = context.supportFragmentManager.fragmentFactory
private val classLoader = context.classLoader
override fun getItemCount(): Int = items.size
override fun createFragment(position: Int): Fragment {
val pageInfo = items[position]
val fragment = fragmentFactory.instantiate(classLoader, pageInfo.fragmentClass.name)
fragment.arguments = Bundle().also { it.putParcelable(PAGE_INFO, pageInfo) }
return fragment
}
fun getFragmentName(position: Int) = items[position].fragmentClass.simpleName
fun removeFragment(position: Int) {
items.removeAt(position)
notifyItemRemoved(position)
notifyItemRangeChanged(position, items.size)
notifyDataSetChanged()
}
Run Code Online (Sandbox Code Playgroud)
}
删除片段代码:
if ((view_pager.adapter …Run Code Online (Sandbox Code Playgroud) android android-viewpager fragmentstatepageradapter android-viewpager2
我需要知道我的片段何时可见,我正在使用setMenuVisibility但我现在知道它不是一个好选择.我正在尝试在FragmentStatePagerAdapter片段上实现setUserVisibleHint,但它永远不会被调用.
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
public class Contacts extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_screen_contacts, container, false);
return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Log.d("MyFragment", "This never shows up.");
Toast.makeText(getActivity(), "Neither does this", Toast.LENGTH_LONG).show();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在运行API级别19,并在我的AndroidManifest上设置了最低API级别15.有什么办法可以获得setUserVisibleHint,我做错了什么?
我有一个使用ViewPager和FragmentStatePagerAdapter的Android应用程序.然而,我需要添加一个新功能,我必须知道滑动方向从一个片段视图移动到另一个,左或右.(也就是说,当我向左滑动时,我会做一件事,当我向右滑动时,我会做其他事情).
请注意,我不需要在滑动结束后发生事件.滑动发生时我必须做这些事件.我想过使用setOnPageChangeListener()但它并没有告诉我滑动方向.你能告诉我如何找出滑动方向吗?
谢谢.
android direction swipe android-viewpager fragmentstatepageradapter
我用ViewPager用Fragment.
但它一次加载两页.
有没有办法在viewpager中只加载一个页面?
android android-fragments android-viewpager fragmentstatepageradapter
我正在为我的项目使用 ViewPager2。我需要在带有 viewpager2 的片段中使用嵌套片段。在我尝试在片段(不是嵌套片段)之间导航之前,它就像魅力一样。
第一次在片段之间导航后,应用程序崩溃并显示下面解释的错误。
包含嵌套片段 OnCreateView 方法的片段:
View view = inflater.inflate(R.layout.orders_fragment, null);
ViewPager2 viewPager = view.findViewById(R.id.childViewPager);
TabLayout tabs = view.findViewById(R.id.tabs);
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager(),getLifecycle());
viewPager.setAdapter(sectionsPagerAdapter);
TabLayoutMediator.TabConfigurationStrategy tabConfigurationStrategy = (tab, position) -> {
String[] order_activity_tabs = getResources().getStringArray(R.array.situations);
for (int i=0; i<order_activity_tabs.length; i++) {
if(i==position)
tab.setText(order_activity_tabs[i]);
}
};
TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabs, viewPager, tabConfigurationStrategy);
tabLayoutMediator.attach();
return view;
Run Code Online (Sandbox Code Playgroud)
当我返回包含嵌套片段的片段时,它会崩溃
java.lang.IllegalStateException: Fragment no longer exists for key f#0: unique id 4fbe17b8-5e22-4e07-a543-4a79445ad39c
at androidx.fragment.app.FragmentManagerImpl.getFragment(FragmentManagerImpl.java:365)
at androidx.viewpager2.adapter.FragmentStateAdapter.restoreState(FragmentStateAdapter.java:549)
at androidx.viewpager2.widget.ViewPager2.restorePendingState(ViewPager2.java:350)
at androidx.viewpager2.widget.ViewPager2.dispatchRestoreInstanceState(ViewPager2.java:375)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4045) …Run Code Online (Sandbox Code Playgroud) android android-adapter android-fragments fragmentstatepageradapter android-viewpager2
我得到了一个ViewPager持有Fragments via FragmentStatePagerAdapter.让我们说寻呼机最初持有以下页面Fragment:
A - B - C - D
Run Code Online (Sandbox Code Playgroud)
当用户刷卡,他可以从移动A到B,B对C等,但也有情况下,当用户改变某些选项A页,他不能移动到B,但是C:
A - C - D
Run Code Online (Sandbox Code Playgroud)
然后用户返回A,修改某些内容并重新启用B:
A - B - C - D
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这种非常动态的行为?我无法Fragment在用户更改内容时随时添加s,然后重新填充ViewPager,因为它很慢并且会中断流程.
android android-adapter android-fragments android-viewpager fragmentstatepageradapter
我的适配器中有"内存泄漏"(引用将在后面解释).我目前正在使用嵌套片段来托管viewpager.
我的设置如下:
1.活动(托管片段A的空活动)
2.片段A - 使用Fragmentstatepageradapter托管viewpager的片段.每个viewpager页面都包含片段B.
3.片段B - 包含imageview的片段.
除非发生配置更改,否则一切都很好.监控堆,每次轮换发生时,它似乎增长100 kb.手动GCing不会释放内存.
我尝试过的事情:
1.用空白片段替换片段B - 出现同样的问题,因此不是造成问题的imageview.
2.删除片段A和B并旋转活动.没有发生内存泄漏,所以它不是活动.
3.在任何方向改变之前使用MAT并且在旋转大约50次之后使用MAT以使堆积起来.MAT显示了一个主要的嫌疑人,这是我的适配器类.它显示了7MB的保留堆(非常小的浅堆)观察者,如下所示:
array java.util.ArrayList @ 0x42079938 24 7,000,832
.\mObservers android.database.DataSetObservable @ 0x42053508 16 7,000,848
..\mObservable com.example.main.Adapter@ 0x4205a048 40 7,001,416
Run Code Online (Sandbox Code Playgroud)
为什么我在片段中使用viewpager:
1.我想通过设置setretaininstance(true)来保持适配器的状态以及与viewpager相关的其他变量.
2.配置更改后,我不重新创建适配器,而是使用旧的适配器连接到viewpager.
3.如果我不重用旧适配器但在配置更改后创建新适配器,则内存泄漏消失.
4.关闭活动并返回上一个活动后,内存泄漏也消失了.
有任何想法吗?非常感谢任何帮助.
谢谢,JC
android memory-leaks android-viewpager fragmentstatepageradapter