DialogFragment 附加到 MainActivity 而不是父片段 activity

DialogFragment attaches to MainActivity instead of parent fragment activity

我从 Fragment 创建了一个 DialogFragment,并且在该 Fragment 中实现了一个侦听器,问题是 DialogFragment 附加到 MainActivity 而不是父框架。

所以我在从片段调用的 DialogFragment 中有这段代码

// Override the Fragment.onAttach() method to instantiate the
// SensorRateChangeListener
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the SensorRateChangeListener so we can send events to
        // the host
        mListener = (SensorRateChangeListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement SensorRateChangeListener");
    }
}

这是调用对话框的 Fragment 中的代码

FragmentTransaction ft = getFragmentManager().beginTransaction();
            Fragment prev = getFragmentManager().findFragmentByTag("dialog");
            if (prev != null) {
                ft.remove(prev);
            }
            ft.addToBackStack(null);

            // Create and show the dialog.
            DialogFragment newFragment = SensorRateChangeDlg.newInstance(mStackLevel);
            newFragment.show(ft, "rate");

当我 运行 创建应用程序和 DialogFragment 时,它崩溃并出现错误....MainActivity 应该实现 SensorRateChangeListener,但它是在调用 Fragment 中实现的。

Error: MainActivity@424085b8 must implement SensorRateChangeListener

我无法在MainActivity 中实现SensorRateChangeListener 接口,因为它还有很多其他与Fragment 相关的功能,这会使事情变得更复杂。

你的应用在这里崩溃

 mListener = (SensorRateChangeListener) activity;

因为它期望您的 Main Activity 像这样:

public class MainAcivity extends Activity implements SensorRateChangeListener{

由于您在另一个片段中实现了 SensorRateChangeListener 接口,它崩溃了。 所以只需在 MainActivity 中实现 SensorRateChangeListener 接口,或者只实现这样的方法:

public void setOnSensorRateChangeListener(SensorRateChangeListener listener){
mListener=listener;
}

编辑

和实现 SensorRateChangeListener 接口的 activity/fragment:

newFragment.setOnSensorRateChangeListener(this);

然后在调用之前检查侦听器是否不为空:

if(mListener!=null)