2016-07-13 4 views
0

я получаю это исключение из некоторых моих пользователей: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()", "");  
    } 


} 
+0

Должность полный код если возможно. – Drv

+0

См. Это может быть вам поможет: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html –

+0

см. Эту ссылку: https://www.hrupin.com/ 2013/05/how-to-fix-can-not-perform-this-action-after-onsaveinstancestate-on-android-fragments –

ответ

0
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; 
} 

Вы забыли совершить сделку. Добавьте это: ft.commit(); после ft.remove(prev);

Смежные вопросы