【问题标题】:getSupportFragmentManager failing in compatibility librarygetSupportFragmentManager 在兼容性库中失败
【发布时间】:2012-07-22 08:17:20
【问题描述】:

我在活动中显示一个对话框片段,尝试使用 show() 和 add() 方法。代码如下

HelpDialogFragment hdf = HelpDialogFragment.newInstance();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(hdf, "dialog");
ft.commit(); #crash here

我有时会从上面的代码中得到 IllegalStateException 错误,崩溃日志如下所示

java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1329)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532)
at com.delight.activities.HomeActivity.showHelp(HomeActivity.java:311)

行号HomeActivity.java 中的 311 是上面代码中提到的ft.commit()。我的活动从兼容性库(最新更新)中扩展了 FragmentActivity。如果我使用show() 方法,也会发生同样的崩溃。

HelpDialogFragment hdf = HelpDialogFragment.newInstance();
hdf.show(getSupportFragmentManager(), "dialog");  #same crash here

所以我得出一个结论,getSupportFragmentManager() 给我带来了问题,我不明白的是,据我所知,我在代码的哪一部分使用已被破坏的活动@ 987654327@ 应该将当前活动的经理返回给我。

我需要一些帮助来解决这个问题。

【问题讨论】:

  • 您可以发布您的活动代码吗?
  • 只是一个盲注,你有没有打电话给super.onCreate(savedInstanceState);作为你ActivityonCreate()的第一个声明?

标签: android android-fragments android-dialog android-dialogfragment


【解决方案1】:

查看对话框片段你只需要调用 dialogfrag.show(Fmanager,tag); 通过事务添加它会产生异常

【讨论】:

    【解决方案2】:

    使用 getFragmentManager 代替 getSupportFragmentManager

    dialog.show(getFragmentManager(), "submitting"); // The second parameter doesn't really matter.
    

    如果这不起作用,请扩展 DialogFragment 以执行此操作。关键是在构建对话框时使用您的 Activity 而不是使用支持库。

    dialog = new AlertDialogFragment(title, message);
    dialog.show(getFragmentManager(), "submitting");
    

    AlertDialogFragment:

        public class AlertDialogFragment extends DialogFragment {
    
            static final String TAG_TITLE = "title";
            static final String TAG_MSG = "message";
    
            public AlertDialogFragment(){
    
            }
    
            public AlertDialogFragment(String title, String message) {
                Bundle b = new Bundle();
                b.putString(TAG_TITLE, title);
                b.putString(TAG_MSG, message);
    
                setArguments(b);
            }
    
            public AlertDialogFragment newInstance(String title, String message) {
                AlertDialogFragment frag = new AlertDialogFragment();
                Bundle b = new Bundle();
                b.putString(TAG_TITLE, title);
                b.putString(TAG_MSG, message);
    
                frag.setArguments(b);
                return frag;
            }
    
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                String title = getArguments().getString(TAG_TITLE);
                String message = getArguments().getString(TAG_MSG);
                    // Use getActivity()!
                return new AlertDialog.Builder(getActivity()).setTitle(title)
                        .setMessage(message)
                        .setNegativeButton("Dismiss", new OnClickListener() {
    
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dismiss();
                            }
                        })
                        .setOnCancelListener(new OnCancelListener() {
    
                            @Override
                            public void onCancel(DialogInterface dialog) {
                                Log.d(TAG, "Dialog cancel");
                            }
                        }).create();
            }
    
            @Override
            public void onCancel(DialogInterface dialog) {
                Log.d(TAG, "Cancel Dialog");
                super.onCancel(dialog);
            }
    
            @Override
            public void onDismiss(DialogInterface dialog) {
                Log.d(TAG, "Dismiss Dialog");
                super.onDismiss(dialog);
            }
        }
    
    }
    

    【讨论】:

    • 不能在activity中使用getFragmentManager(),我认为它只能在fragment中使用。
    • @YashwanthKumar 您在(支持)FragmentActivity 中使用 getSupportFragmentManager() 和在(标准)Activity 中使用 getFragmentManager()
    【解决方案3】:

    你的类应该扩展 FragmentActivity 而不是 Activity。这为我解决了问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 2011-06-09
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      相关资源
      最近更新 更多