я получаю это исключение из некоторых моих пользователей:IllegalStateException, когда пользователь нажимает на кнопку Закрыть, чтобы отклонить DialogFragment
java.lang.IllegalStateException: Не удается выполнить это действие после того, как onSaveInstanceState на android.support .v4.app.FragmentManagerImpl.checkStateLoss (FragmentManagerImpl.java:1500) на android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManagerImpl.java:1518) при android.support.v4.app.BackStackRecord.commitInternal (BackStackRecord.java:634) at android.support .v4.app.BackStackRecord.commit (BackStackRecord.java:613) на android.support.v4.app.DialogFragment.dismissInternal (DialogFragment.java:201) на android.support.v4.app.DialogFragment.dismiss (DialogFragment.java:167) на com.myapp.myapp.HelpDialog $ 2.onClick (HelpDialog.java:228) на android.view.View.performClick (View.java:5201) на android.view.View $ PerformClick.run (View.java:21163) на android.os.Handler.handleCallback (Handler.java:746) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper. loop (Looper.java:148) в android.app.ActivityThread.main (ActivityThread.java:5443) в java.lang.reflec t.Method.invoke (Method.java) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java: 618)
вызов, который вызывает это исключение в методе DialogFragment onCreateView():
...
Button btn;
btn = (Button)v.findViewById(R.id.close_btn);
btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
dismiss();
}
});
отклонять вызывает потерю состояния, потому что действие выполняется после того, как onSaveInstanceState(). Как пользователь может нажать кнопку «Закрыть» после вызова onSaveInstanceState()?
EDIT. В DialogFragment есть внутренний просмотрщик. Я буду размещать только код dialogfragment и не то, что адаптер ViewPager или из fragmenttabs:
/**
*
*/
public class HelpDialog extends DialogFragment
{
final static String DIALOG_TAG = "help_dialog";
ViewPager mPager = null;
/**
*
*/
public HelpDialog()
{
CLog.i("HelpDialog.HelpDialog()", "Constructor called");
}
/**
* Create a new instance of WelcomeDialog.
*/
static HelpDialog newInstance()
{
HelpDialog d = new HelpDialog();
return d;
}
/**
*
*/
static boolean showNewInstance(FragmentActivity activity)
{
HelpDialog d = HelpDialog.newInstance();
if (d != null)
{
FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
Fragment prev = activity.getSupportFragmentManager().findFragmentByTag(HelpDialog.DIALOG_TAG);
if (prev != null)
{
ft.remove(prev);
}
// Create and show the dialog.
d.show(ft, HelpDialog.DIALOG_TAG);
return true;
}
return false;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
CLog.i("HelpDialog.onCreate()", "");
int style = DialogFragment.STYLE_NO_TITLE;
int theme = getTheme();
setStyle(style, theme);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
CLog.i("HelpDialog.onCreateDialog()", "");
return super.onCreateDialog(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
CLog.i("HelpDialog.onCreateView()", "");
final View v = inflater.inflate(R.layout.help_dialog, container, false);
DisplayMetrics displaymetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenWidth = displaymetrics.widthPixels;
int screenHeight = displaymetrics.heightPixels;
int min_width = (displaymetrics.widthPixels * 70)/100;
int min_height = (displaymetrics.heightPixels * 70)/100;
v.setMinimumWidth(min_width);
//v.setMinimumHeight(min_height);
CLog.i("HelpDialog.onCreateView()", "screenWidth " + screenWidth + " min_width " + min_width);
// Locate ViewPager in activity_main.xml
mPager = (ViewPager) v.findViewById(R.id.help_dlg_pager);
// Activate Fragment Manager
FragmentManager fm = this.getChildFragmentManager();//getActivity().getSupportFragmentManager();
// Capture ViewPager page swipes
ViewPager.SimpleOnPageChangeListener viewPagerListener = new ViewPager.SimpleOnPageChangeListener()
{
@Override
public void onPageSelected(int position)
{
super.onPageSelected(position);
}
};
mPager.setOnPageChangeListener(viewPagerListener);
// Locate the adapter class called ViewPagerAdapter.java
HelpDlgViewPagerAdapter viewpageradapter = new HelpDlgViewPagerAdapter(fm);
// Set the View Pager Adapter into ViewPager
mPager.setAdapter(viewpageradapter);
//mPager.setPageTransformer(true, new DepthPageTransformer());
mPager.setPageTransformer(true, new ZoomOutPageTransformer());
//Bind the title indicator to the adapter
CirclePageIndicator mIndicator = (CirclePageIndicator)v.findViewById(R.id.help_dlg_indicator);
mIndicator.setViewPager(mPager);
Button btn;
btn = (Button)v.findViewById(R.id.close_btn);
btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
CLog.i("HelpDialog", "onClick() - dismissing");
dismissAllowingStateLoss();
}
});
getDialog().getWindow().setBackgroundDrawableResource(R.color.transparent);//translucent_black);
getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
getDialog().setCanceledOnTouchOutside(false);
return v;
}
////
@Override
public void onAttach (Activity activity)
{
super.onAttach(activity);
CLog.i("HelpDialog.onAttach()", "");
}
@Override
public void onActivityCreated (Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
CLog.i("HelpDialog.onActivityCreated()", "");
}
@Override
public void onViewStateRestored (Bundle savedInstanceState)
{
super.onViewStateRestored(savedInstanceState);
CLog.i("HelpDialog.onViewStateRestored()", "");
}
@Override
public void onStart()
{
super.onStart();
CLog.i("HelpDialog.onStart()", "");
}
@Override
public void onStop()
{
super.onStop();
CLog.i("HelpDialog.onStop()", "");
}
@Override
public void onResume()
{
super.onResume();
CLog.i("HelpDialog.onResume()", "");
}
@Override
public void onPause()
{
super.onPause();
CLog.i("HelpDialog.onPause()", "");
}
@Override
public void onDestroyView()
{
super.onDestroyView();
CLog.i("HelpDialog.onDestroyView()", "");
}
@Override
public void onDestroy()
{
super.onDestroy();
CLog.i("HelpDialog.onDestroy()", "");
}
@Override
public void onDetach()
{
super.onDetach();
CLog.i("HelpDialog.onDetach()", "");
}
}
Должность полный код если возможно. – Drv
См. Это может быть вам поможет: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html –
см. Эту ссылку: https://www.hrupin.com/ 2013/05/how-to-fix-can-not-perform-this-action-after-onsaveinstancestate-on-android-fragments –