本文目录
- 请问ViewPager和Fragment一起用,导致内存溢出,怎么解决啊
- viewpager切换fragment时,fragment会调用哪些生命周期
- ViewPager中怎么获取Fragment
- viewpager和fragment的区别
- android 从viewpager中删除一个fragment的方法怎么解决 在线等
- viewpager嵌套fragment懒加载怎么做的
- 如何获取viewpager中指定的fragment
请问ViewPager和Fragment一起用,导致内存溢出,怎么解决啊
1、不要直接将Fragement写在XML文件里,这样会导致Fragment对象无法销毁,产生内存溢出。在代码动态的new 和add Fragement才是正确的做法。 2、使用抽屉方法,在XML文件里放两个LinearLayout,然后在代码中将Fragment加进这两个LinearLayout中
viewpager切换fragment时,fragment会调用哪些生命周期
Fragment的生命周期初探:因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。当这样进行fragment transaction(转换)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代码看起来和Activity的类似。每当创建一个Fragment时,首先添加以下三个回调方法:onCreate():系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。 onCreateView():当第一次绘制Fragment的UI时系统调用这个方法,该方法将返回一个View,如果Fragment不提供UI也可以返回null。注意,如果继承自ListFragment,onCreateView()默认的实现会返回一个ListView,所以不用自己实现。 onPause():当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。将Fragment加载到Activity当中有两种方式:方式一:添加Fragment到Activity的布局文件当中 方式二:在Activity的代码中动态添加Fragment(荐)第一种方式虽然简单但灵活性不够。添加Fragment到Activity的布局文件当中,就等同于将Fragment及其视图与activity的视图绑定在一起,且在activity的生命周期过程中,无法切换fragment视图。第二种方式比较复杂,但也是唯一一种可以在运行时控制fragment的方式(加载、移除、替换)。
ViewPager中怎么获取Fragment
ViewPager中如何获取Fragment 在做项目时,遇到Fragment与Fragment、Fragment与Activity需要相互通信、传递数据以及进行互 操作的问题,查阅了官方文档,也实现了官方的例子,但实际项目是ViewPager+Fragment,按官方的例 子,总是获取不到Fragment的引用,如: HeadLinesFragment headLinesFrag = (HeadLinesFragment) getSupportFragmentManager().findFragmentById(R.id.headline_fragment); 这是因为在ViewPager里Fragment是new出来动态加到ViewPager里的,上需的Id只是Fragment的布 局文件的根Id,不是Fragment 的Id,故获取的Fragment为空 查询相关资料后,终于找到如下解决方案: 一般来讲,我们再使用viewpager的时候,是在代码中动态的添加fragment。此时,我们不能去指定 fragment的id,也不能指定他的tag,如果你一定要去指定tag,运行时会提示,tag已经被指定。那么,在动 态的添加了fragment之后,我们如何能获取到该fragment并修改其中的内容呢。两种方法: 第一种方法实际上是一种hack方法,并没有官方文档说明支持。代码如下: SomeFragment someFragment = getSupportFragmentManager().FindFragmentByTag(“android:switcher:” + R.id.viewpager + “:0″); if (someFragment != null) //可能没有实例化 { if (someFragment.getView() != null) { someFragment.updateView();//自定义方法更新 } } 这里要记住的就是”android:switcher:” + R.id.viewpager + “:0″ 这个字符窜表示的就是该 fragment的tag,其中0 是fragment 在viewpager中的位置。 第二种方法更正规,因为第一种方法对基于FragmentPagerAdapter的实现是有效的,但对于 FragmentStatePagerAdapter就无效了。因为FragmentStatePagerAdapter不会对传给 FragmentManager的Fragment设置tag. ViewPager pager = (ViewPager)findViewById(R.id.viewpager); FragmentStatePagerAdapter f = pager.getAdapter(); SomeFragment someFragment = (SomeFragment)f.instantiateItem(pager,position); instantiateItem(pager,position)方法会返回在position位置的fragment的引用。如果该 fragment 已经实例化了,再次调用instantiateItem(pager,position)的时候,该方法并不会调用 getItem()来再次实例化fragment,而是直接返回引用。 方法三更简单: Activity里的语句: mPagerAdapter = new DownloadSlidePagerAdapter(getSupportFragmentManager()); LocalVideoListFragment fragment = ((LocalVideoListFragment)mPagerAdapter.getItem(mCurrItem)); fragment.refresh(); DownloadSlidePagerAdapter: public class DownloadSlidePagerAdapter extends FragmentPagerAdapter { Fragment fragments = {new DownloadListFragment(),new LocalVideoListFragment()}; public DownloadSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return fragments; } @Override public int getCount() { return fragments.length; } } 直接获取new的实例对象应用
viewpager和fragment的区别
viewpager是一个滑动切换的视图或者说控件。fragment是一个轻量级的Activity。那么这个fragment可以放到这个Viewpager里面去运行。可以来回切换不同的选项卡,即切换了不同的fragment。
android 从viewpager中删除一个fragment的方法怎么解决 在线等
为了解决彻底删除fragment,我们要做的是:1.将FragmentPagerAdapter 替换成FragmentStatePagerAdapter,因为前者只要加载过,fragment中的视图就一直在内存中,在这个过程中无论你怎么刷新,清除都是无用的,直至程序退出; 后者 可以满足我们的需求。2.我们可以重写Adapter的方法--getItemPosition(),让其返回PagerAdapter.POSITION_NONE即可。 view plain copy以下为引用内容: @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return PagerAdapter.POSITION_NONE; } 我最后的代码: view plain copypackage com.yang.Adapter; import java.util.ArrayList; import android.content.Context; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.PagerAdapter; public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter { private static final String TAG = “MyFragmentPagerAdapter“; // private ArrayList《OpilistItem》 lists; private ArrayList《Fragment》 mList; private Context mContext; public MyFragmentPagerAdapter(FragmentManager fm, Context context) { super(fm); this.mContext = context; mList = new ArrayList《Fragment》(); } public void setLists(ArrayList《Fragment》 lists) { this.mList = lists; } public void UpdateList(ArrayList《Fragment》 arrayList) { this.mList.clear(); this.mList.addAll(arrayList); notifyDataSetChanged(); } @Override public Fragment getItem(int arg0) { // Fragment ft = null; // // ft = new DateShow(mContext); // for (int i = 0; i 《 lists.get(arg0).openplayitem.size(); i++) { // Log.i(TAG, // “arg0=“ + arg0 + “name=“ // + lists.get(arg0).openplayitem.get(i).moviename); // } // // Bundle args = new Bundle(); // args.putSerializable(“date_title“, lists.get(arg0).openplayitem); // ft.setArguments(args); // return ft; return mList.get(arg0); } @Override public int getCount() { return mList.size(); } @Override public int getItemPosition(Object object) { // TODO Auto-generated method stub return PagerAdapter.POSITION_NONE; } } 之前还有一个问题,就是在fragment中报空指针异常,是因为我要加载的动态加载的fragment只有一个,但是viewpager默认会去加载下一个,使得浏览流畅,从我注释的代码中可以看到,数据的传递是通过bundle,造成预加载的时候数据成空,造成空指针异常,解决的办法是在fragment的onCreateView方法中判断数据是否为空,然后再判断是不是生成并返回view。
viewpager嵌套fragment懒加载怎么做的
由于viewpager有预加载功能,所以有时候相邻的fragment加载大量数据的时候会卡顿,oom等,所以我们想要的效果就是viewpager显示那个fragment就加载那个,这样我们就用到了一个方法,具体代码如下:private boolean isCreate;@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {//super千万不能删,要不然不起作用super.setUserVisibleHint(isVisibleToUser);if (isVisibleToUser && isCreate) {getData();}}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {//调用此方法的时候表示布局已加载,这时候吧isCreate 设为true//表示控件布局已加载完成,此时加载数据就不会空指针啦//最好在这里调用,如果在oncreate中调用,那么第一页会调用两次加载数的方法,分别是:setUserVisibleHint和onActivityCreatedisCreate = true;if (myView == null)myView = inflater.inflate(R.layout.fragment_home_home, null);ViewGroup parent = (ViewGroup) myView.getParent();if (parent != null)parent.removeView(myView);return myView;}public void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);this.init(); //控件初始化//由于setUserVisibleHint在onCreateView之前就调用啦//所以,viewpager的第一页的时候是无法调用数据的,所以在 //这加一个加载数据的调用if (getUserVisibleHint()) {this.getData(); //得到数据}this.SomeThingListener(); //一些监听事件}
如何获取viewpager中指定的fragment
ViewPager中如何获取Fragment 在做项目时,遇到Fragment与Fragment、Fragment与Activity需要相互通信、传递数据以及进行互 操作的问题,查阅了官方文档,也实现了官方的例子,但实际项目是ViewPager+Fragment,按官方的例 子,总是获取不到Fragment的引用,如: HeadLinesFragment headLinesFrag = (HeadLinesFragment) getSupportFragmentManager().findFragmentById(R.id.headline_fragment); 这是因为在ViewPager里Fragment是new出来动态加到ViewPager里的,上需的Id只是Fragment的布 局文件的根Id,不是Fragment 的Id,故获取的Fragment为空 查询相关资料后,终于找到如下解决方案: 一般来讲,我们再使用viewpager的时候,是在代码中动态的添加fragment。此时,我们不能去指定 fragment的id,也不能指定他的tag,如果你一定要去指定tag,运行时会提示,tag已经被指定。那么,在动 态的添加了fragment之后,我们如何能获取到该fragment并修改其中的内容呢。两种方法: 第一种方法实际上是一种hack方法,并没有官方文档说明支持。代码如下: SomeFragment someFragment = getSupportFragmentManager().FindFragmentByTag(“android:switcher:” + R.id.viewpager + “:0″);