getSupportFragmentManager在DialogFragment上无法编译

6
我该如何展示这个内容:

public class TagsDialog extends DialogFragment
{
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        builder.setView(inflater.inflate(R.layout.tags_dialog, null));
        builder.setMessage("This is a message").setTitle("TAGS");
        return builder.create();
    }
}

在我的 ViewPager 中的 Fragment 中:

    public class MyFragment extends Fragment
    {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {

    ...

            ImageView btnTags = (ImageView)view.findViewById(R.id.btnTags);
            btnTags.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View view)
                {

                    DialogFragment dlg = new TagsDialog();
                    //this line doesn't compile
                    dlg.show(getSupportFragmentManager(), "tags");

                }
            });
}
}

我已经尝试很久使它工作,但是getSupportFragmentManager一直未被解决... 有什么想法吗?
编辑:
我感觉这都是由于support FragmentManager与android.app.FragmentManager的区别引起的,但我不知道如何解决,因为我正在使用来自support库的ViewPager...
getSupportFragmentManager/以及所有相关的getFragManager方法,如parent和child,总是返回来自support lib的Manager,而show方法想要的是核心库中的。
导入如下:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;

FragmentManager fm = getActivity().getSupportFragmentManager(); // returns from support lib
DialogFragment dlg = new TagsDialog();
dlg.show(fm, "tags"); // wants core...

如果我只使用核心,则getSupportFragmentManager()getActivity()上不存在...

你说的“未解决”是什么意思?你有任何堆栈跟踪吗? - Snicolas
@Snicolas,它无法编译。你知道那条红色的波浪线。 - sprocket12
哪里?哪一行?请突出显示//罪魁祸首的那一行。 - Snicolas
就像我之前提到的那样,使用 getSupportFragmentManager 的那个。 - sprocket12
2个回答

14

你应该仔细检查你的导入。你不能同时使用support库和android核心API中的Fragment和FragmentManager。

如果你使用support库,就要全部使用support库里的东西(即android.support.v4.app);如果不是,则使用核心API包里的所有东西(android.app)。


因此,同样使用支持库中的Fragments和FragmentManager。 - Snicolas
1
问题已解决。通过使我的 DialogFragment 也来自 support lib,不匹配的问题已解决。 - sprocket12

4

这是我在ViewPager中的Fragment中所做的内容。无论何时触发DialogFragment的显示,代码都是相同的。

FragmentManager fm = getActivity().getSupportFragmentManager();
ConfirmDeleteDialog dialog = new ConfirmDeleteDialog();
dialog.setTargetFragment(RecipeFragment.this, REQUEST_CONFIRM_RC);
Bundle b = new Bundle();
b.putString(ConfirmDeleteDialog.EXTRA_CONFIRM_DIALOG_TYPE,
        ConfirmDeleteDialog.CONFIRM_DIALOG_TYPE.COMMIT.name());  // enum determines what to display
dialog.setArguments(b);
dialog.show(fm, "confirm delete");

我认为你可能漏掉了 *getActivity().*getSupportFragmentManager() 这部分代码。


不要使用getFragmentManager,而是从Activity中返回。请查看javadoc。 - Snicolas
然后,您需要确保您的Fragment和DialogFragment类都来自v4支持库。(以及FragmentManager) - Rick Falck
你可能是对的(他导入了错误的类),但是当从支持片段完成时,支持版本也需要getActivity()。 - Rick Falck
实际上,文档中并没有这样说:http://developer.android.com/reference/android/support/v4/app/Fragment.html#getFragmentManager() - Snicolas
有一个原因不使用那种方法,但我死活想不起来为什么了。 - Rick Falck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接