我有一个带有fagmentpageradapter和viewpager的parentfragment。每个页面显示另一个包含imageview的片段。为了避免outofmemoryerrors,我只希望当前显示的片段在imageview中加载其图像。因此,我必须在当前显示的片段中加载imageview,并回收未显示片段中的图像。
父片段:
public class DatenFragment extends Fragment {
private List<Data> mData;
private ViewPaver mViewPager;
private MyFragmentPagerAdapter mAdapter;
public DatenFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_daten, container, false);
mViewPager = (MyViewPager) rootView.findViewById(R.id.view_pager);
mViewPager.setOnPageChangeListener(this);
mAdapter = new MyFragmentPagerAdapter(getChildFragmentManager(),mData);
mViewPager.setAdapter(mAdapter);
return rootView;
}
@Override
public void onPageSelected(int position) {
mAdapter.setCurrentPosition(position);
mAdapter.loadFotos();
}
}
碎片PageRadapter:
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private int mPos = -1;
private List<Data> mData;
public MyFragmentPagerAdapter(FragmentManager fm, List<Data> data) {
super(fm);
mData = data;
}
public void loadFotos(){
EingabeFragment currentFragment;
currentFragment = (EingabeFragment) getItem(mPos);
currentFragment.loadFoto();
currentFragment = (EingabeFragment) getItem(mPos-1);
currentFragment.unloadFoto();
currentFragment = (EingabeFragment) getItem(mPos+1);
currentFragment.unloadFoto();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Fragment getItem(int position) {
return EingabeFragment.createFrom(mData.get(position),position);
}
public void setCurrentPosition(int position) { mPos = position; }
}
分页器显示的片段:
public class EingabeFragment extends Fragment {
private int mPos;
private Data mData;
private ImageView mImageView;
public EingabeFragment() { }
public void loadFoto(){
if(mData.hasFoto()) {
mImageView.setImageBitmap(Utils.loadFoto(mData.getFoto()));
Log.d("DEBUG", "Foto loaded for " + mData.getId());
}
}
public void unloadFoto(){
if(mData.hasFoto()) {
Drawable drawable = mImageView.getDrawable();
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
bitmap.recycle();
Log.d("DEBUG","Foto unloaded for " + mData.getId());
}
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_eingabe, container, false);
mImageView = (ImageView) rootView.findViewById(R.id.image_view);
return rootView;
}
public int getPosition() { return mPos; }
static public EingabeFragment createFrom(Data data, int fragmentPosition){
EingabeFragment eingabeFragment = new EingabeFragment();
eingabeFragment.mData = data;
eingabeFragment.mPos = fragmentPosition;
return eingabeFragment;
}
}
在适配器的 loadFotos() 函数中,getItem() 函数返回所示片段的新实例。因此,视图尚未创建,并且 mImage 视图为空。我需要一种方法来访问寻呼机中显示的片段,以在此片段中加载图像。
在从我的视图中选择的页面上页面:
@Override
public void onPageSelected(int position) {
EingabeFragment f = (EingabeFragment) mAdapter.getItem(mAdapter.getCurrentPosition());
f.onPauseFragment();
EingabeFragment f2 = (EingabeFragment) mAdapter.getItem(position);
f2.onResumeFragment();
mAdapter.setCurrentPosition(position);
}
Eingabefragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_eingabe, container, false);
mRootView = rootView;
imageViewFoto = (ImageView) rootView.findViewById(R.id.imageView_foto);
//Load other UI...
mInitialized = true;
return rootView;
}
@Override
public void onPauseFragment() {
Log.d("DEBUG",mMessung.getId().toString() + " Pause");
if(mInitialized) {
unloadFoto();
Log.d("DEBUG",mMessung.getId().toString() + " Unloaded Foto");
} else {
Log.d("DEBUG",mMessung.getId().toString() + " View is null");
}
}
@Override
public void onResumeFragment() {
Log.d("DEBUG",mMessung.getId().toString() + " Resume");
if(mInitialized) {
loadFoto();
Log.d("DEBUG",mMessung.getId().toString() + " Unloaded Foto");
} else {
Log.d("DEBUG",mMessung.getId().toString() + " View is null");
}
}
现在,我的日志在左右滑动后提供了以下信息:
104 Pasue
104 View is null
105 Resume
105 View is null
105 Pause
105 View is null
104 Resume
104 View is null
对于正确的片段,将调用暂停和恢复,但 mImageView 为空
实现ViewPager。并在OnPageChangeListener的onPageSelected()方法上加载片段中的图像
@Override
public void onPageSelected(int position) {
//show image
((Your Fragment) mFragments.get(position)).loadImage();
}
有一些工作要做,
如果您的片段扩展android.support.v4.app.Fragment
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
//fragment is visible do what ever you want to do..
}else {
// handle here
}
}
或者对于其他解决方案,您可以按照此链接,创建一个接口并回调,以便您现在可以在onResume()
中找到哪个片段。
对于第二个解决方案,onResume()
在onCreateView
之前第一次调用,因此您需要在您的片段中进行布尔检查,例如容纳FirstTime=true
,在加载方法检查中全局设置它
(!lodingFirstTime) {
//loadfoto method
}
在你的第一个片段的onCreateView中
(lodingFirstTime) {
lodingFirstTime = false;
//loadfoto method
}
我有一个带选项卡指示器的viewPager。ViewPager是带有FragmentPagerAdapter的setAdaper。 我几乎不了解FragmentPagerAdapter的内部是如何工作的。我注意到邻居片段被恢复(调用OnResume),即使邻居还不可见。 我把更新方法放在OnResume中,以为片断是最新的,它就会更新。 广告横幅刷新 我希望页脚中设置的广告横幅在向左滑动一次或向右
我注意到SectionsPagerAdapter的getItem()方法在重新访问后从未被调用。请问我如何让我的片段在viewpager显示后,重新访问?
在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。是否有像这样的方法,每次片段出现在屏幕上时都会调用它?等是在创建片段之后调用的,而不是在片段出现在屏幕上时调用的,因此它们对我不起作用。我的问题可以用哪种方法?
本文向大家介绍Android中ViewPager获取当前显示的Fragment,包括了Android中ViewPager获取当前显示的Fragment的使用技巧和注意事项,需要的朋友参考一下 前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment类似的方
问题内容: 我在angularjs中有一个视图,我只是想显示当前日期(格式化)。我认为应该显示当前日期。 问题答案: 您必须首先在控制器中创建日期对象: 控制器: 视图: JSFiddle示例 角度日期过滤器参考
我试图在片段中填充一个具有自定义布局的listView。但是,当我启动应用程序时,listview的内容没有加载(这是使用数组适配器获得的)。下面是加载listView的代码: 这里是我的CustomAdapter的代码: } 这是列表项布局的xml: 这里是主要布局: 我没有收到任何错误消息,但是当我启动应用程序时,listView中没有显示任何项目,并且永远不会调用我的适配器的getView方