Android-getActivity()从dialogFragment返回null

Android-getActivity()从dialogFragment返回null,android,android-viewpager,android-dialogfragment,Android,Android Viewpager,Android Dialogfragment,我对碎片相当陌生,所以如果这是非常基本的,我道歉 我的应用程序包含一个ViewPager,可以使用ListView在多个不同的选项卡之间滑动。单击一个特定的ListView项时,我想打开一个显示一些选项的对话框片段。我的意图是让DialogFragment处理click事件,并将所选对话框项反馈给调用它的片段。为此,我提供了对MainActivity(包含ViewPager)的回调,并将该信息向下提供给正确的ViewPager片段 我注意到,我的DialogFragment在getActivit

我对碎片相当陌生,所以如果这是非常基本的,我道歉

我的应用程序包含一个ViewPager,可以使用ListView在多个不同的选项卡之间滑动。单击一个特定的ListView项时,我想打开一个显示一些选项的对话框片段。我的意图是让DialogFragment处理click事件,并将所选对话框项反馈给调用它的片段。为此,我提供了对MainActivity(包含ViewPager)的回调,并将该信息向下提供给正确的ViewPager片段

我注意到,我的DialogFragment在getActivity()上返回null,我认为这是因为我的DialogFragment没有正确地连接到我的MainActivity。我怎样才能做到这一点?考虑到我对回调还不熟悉,而且大多数其他处理片段的示例都是针对标准片段的,而不是来自ViewPager的片段,我发现要解决这个问题有点困难

我的对话框如何识别正确的活动?我应该将片段附加到FragmentManager吗?如果是,它是否应该与ViewPager片段连接到同一个FragmentManager

这是我的代码,尽管我不确定它会有多大帮助

CalibrationFragment.java-调用DialogFragment。(不确定这样做是否正确。)

ModeDialogFragment.java-我的DialogFragment

public class ModeDialogFragment extends DialogFragment{

    public static ModeDialogFragment newInstance(int title) {
        ModeDialogFragment frag = new ModeDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);

        return frag;
    }

    public void onAttach(Activity activity){
        super.onAttach(activity);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");
        final Context mContext = getActivity();
        getActivity().getFragmentManager().beginTransaction().add(newInstance(R.string.mode_calibration), "my_fragment").commit();
        // Trying to add my dialog to the MainActivity, not working.

        final CharSequence[] modeItems = {
                "Option 1", "Option 2", "Option 3"
        };
        final int checkedItem = 2; // Make final for now, resolve this later

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(getResources().getString(R.string.mode_calibration));
            builder.setSingleChoiceItems(modeItems, checkedItem, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                // Handle the selection here

                ((MainActivity)getActivity()).updateModeData();
            }
        });
        return(builder.create());
    }
}
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

ModeDialogFragment modeDialog = ModeDialogFragment.newInstance(R.string.mode_calibration);
String title = makeFragmentName(R.id.pager, 3); // makeFragmentName as specified in MainActivity.java
modeDialog.show(ft, title);
MainActivity.java

    public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
        // Initialise variables
        private Context mContext;
        // [Others...]

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            // Initialisation
            viewPager = (ViewPager) findViewById(R.id.pager);
            actionBar = getActionBar();
            mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    }

   public Fragment findFragmentByPosition(int position) {
        int viewId = R.id.pager;
        //FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter();
        return getSupportFragmentManager().findFragmentByTag(
                makeFragmentName(viewId, position));
    }

    // Needed to identify a fragment from ViewPager
    private static String makeFragmentName(int viewId, int position)
    {
         return "android:switcher:" + viewId + ":" + position;
    }

    public void updateModeData(){
        // Make call to the fragment to deal with the data
        CalibrationFragment calFragment = (CalibrationFragment) findFragmentByPosition(3);
        ((CalibrationFragment) calFragment).doUpdateModeData();
        }
}
任何帮助或指导都将不胜感激

编辑:问题确实在于我没有将片段添加到FragmentManager并正确调用它。这是我使用的代码。我的代码仍然没有完整地运行,但是出于这个问题的目的,我的DialogFragment现在可以访问MainActivity

CalibrationFragment.java-调用DialogFragment

public class ModeDialogFragment extends DialogFragment{

    public static ModeDialogFragment newInstance(int title) {
        ModeDialogFragment frag = new ModeDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);

        return frag;
    }

    public void onAttach(Activity activity){
        super.onAttach(activity);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");
        final Context mContext = getActivity();
        getActivity().getFragmentManager().beginTransaction().add(newInstance(R.string.mode_calibration), "my_fragment").commit();
        // Trying to add my dialog to the MainActivity, not working.

        final CharSequence[] modeItems = {
                "Option 1", "Option 2", "Option 3"
        };
        final int checkedItem = 2; // Make final for now, resolve this later

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle(getResources().getString(R.string.mode_calibration));
            builder.setSingleChoiceItems(modeItems, checkedItem, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                // Handle the selection here

                ((MainActivity)getActivity()).updateModeData();
            }
        });
        return(builder.create());
    }
}
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

ModeDialogFragment modeDialog = ModeDialogFragment.newInstance(R.string.mode_calibration);
String title = makeFragmentName(R.id.pager, 3); // makeFragmentName as specified in MainActivity.java
modeDialog.show(ft, title);
ModeDialogFragment.java与前面相同,但删除了以下行:

getActivity().getFragmentManager().beginTransaction().add(newInstance(R.string.mode_calibration), title).commit();

您不应该自己调用onCreateDialog。只需使用
FragmentTransaction
调用
show
方法即可:

FragmentTransaction ft = getFragmentManager().beginTransaction();
ModeDialogFragment modeDialog = ModeDialogFragment.newInstance(R.string.mode_calibration);
modeDialog.show(ft, null);

这里介绍了DialogFragment的正确用法:

谢谢-我知道有什么问题,但不确定是什么问题。我发现,如果我使用支持库进行片段处理,.show()不能将FragmentTransaction作为参数,它需要一个FragmentManager。如果我使用标准库,我的主要活动会抱怨。我将对这些进行一段时间的研究,并在取得一些进展后回复。@clb9355不客气。如果您使用support library,那么您必须随时随地使用它:而不是
Activity
use
android.support.v4.app.FragmentActivity