当用户单击“关闭”按钮以关闭DialogFragment时,IllegalStateException

时间:2016-07-13 09:36:48

标签: android illegalstateexception dismiss

我从一些用户那里得到了这个例外:

  

java.lang.IllegalStateException:之后无法执行此操作   onSaveInstanceState at   android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManagerImpl.java:1500)     在   android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManagerImpl.java:1518)at at   android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634)     在   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)at   android.view.View.performClick(View.java:5201)at   android.view.View $ PerformClick.run(View.java:21163)at   android.os.Handler.handleCallback(Handler.java:746)at   android.os.Handler.dispatchMessage(Handler.java:95)at   android.os.Looper.loop(Looper.java:148)at   android.app.ActivityThread.main(ActivityThread.java:5443)at   java.lang.reflect.Method.invoke(Method.java)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:728)     在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()后,用户如何单击“关闭”按钮?

修改即可。 DialogFragment里面有一个viewpager。我将只发布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()", "" );       
    }


}

1 个答案:

答案 0 :(得分: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 );