【发布时间】:2016-04-21 10:59:05
【问题描述】:
我有一个ViewPager,其中包含我生成的几个Fragments,并为其提供了独特的布局。这些Fragments 只是用户不应该与之交互的静态布局的占位符。 (类似于预览页面)。
这是包含Fragments 和ViewPager 的活动:
public class KidPreviewActivity extends FragmentActivity implements IKidPreviewView, PreviewFragment.OnFragmentInteractionListener {
private KidPreviewPresenter mPresenter;
private ViewPager mPager;
private PreviewSlidePagerAdapter mPagerAdapter;
private static final int NUM_PAGES = 6;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_kid_preview);
// hide navigation bar
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
Button returnToLauncherBtn = (Button) findViewById(R.id.kidPreviewReturnToLauncherBtn);
EditText emailET = (EditText) findViewById(R.id.kidPreviewParentEmail);
mPresenter = new KidPreviewPresenter(getApplicationContext());
mPresenter.attachView(this);
returnToLauncherBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.backToLauncher();
}
});
mPager = (ViewPager) findViewById(R.id.previewPager);
mPagerAdapter = new PreviewSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
CircleIndicator indicator = (CircleIndicator) findViewById(R.id.cIndicator);
indicator.setViewPager(mPager);
} //-onCreate
@Override
protected void onDestroy() {
super.onDestroy();
if (isFinishing()) {
mPresenter.destroy();
}
}
@Override
public void onError(Message msg) {
Utils.DisplayError(this, msg);
}
@Override
public void onDisconnected() {
ActivityHelper.handleDisconnected(this);
}
@Override
public void backToLauncher() {
finish();
}
@Override
public void notifyParents() {
}
@Override
public void onFragmentInteraction(Uri uri) {
}
private class PreviewSlidePagerAdapter extends FragmentStatePagerAdapter {
public PreviewSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
PreviewFragment currentFrag = PreviewFragment.newInstance(R.layout.kid_preview_flipper_one);
switch (position) {
case 0:
currentFrag = PreviewFragment.newInstance(R.layout.kid_preview_flipper_one);
break;
case 1:
currentFrag = PreviewFragment.newInstance(R.layout.kid_preview_flipper_two);
break;
case 2:
currentFrag = PreviewFragment.newInstance(R.layout.kid_preview_flipper_three);
break;
case 3:
currentFrag = PreviewFragment.newInstance(R.layout.kid_preview_flipper_four);
break;
case 4:
currentFrag = PreviewFragment.newInstance(R.layout.kid_preview_flipper_five);
break;
case 5:
currentFrag = PreviewFragment.newInstance(R.layout.kid_preview_flipper_six);
break;
}
return currentFrag;
}
@Override
public int getCount() {
return NUM_PAGES;
}
}
但是,在加载此活动时,我在滑动/滑动 viewpager 项目时变得非常缓慢。
带有如下消息:
04-21 06:56:13.238 1897-1897/com.myApp.myAppDev I/Choreographer: Skipped 97 frames! The application may be doing too much work on its main thread.
04-21 06:56:14.933 1897-2281/com.myApp.myAppDev E/OpenGLRenderer: GL error: Out of memory!
有什么方法可以解决这个问题/优化这个问题使其不会锁定活动?
我不确定为什么它在主线程上做“太多工作”,据我所知我没有在主线程上做太多工作?
Fragment newInstance:
public static PreviewFragment newInstance(int layoutSelected){
PreviewFragment fragment = new PreviewFragment();
Bundle args = new Bundle();
args.putInt(ARG_LAYOUT, layoutSelected);
fragment.setArguments(args);
return fragment;
}
其他PreviewFragment方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
layoutSelected = getArguments().getInt(ARG_LAYOUT);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(layoutSelected, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
【问题讨论】:
-
@user3505534 正如您从我的代码中看到的那样,我已经遵循了本指南。可悲的是,这无济于事。
-
可能是附加片段代码?构造函数、onCreate 等?
标签: android android-fragments android-viewpager