【问题标题】:DialogFragment attaches to MainActivity instead of parent fragment activityDialogFragment 附加到 MainActivity 而不是父片段活动
【发布时间】:2015-01-18 12:47:25
【问题描述】:

我从 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 相关的其他功能,这会使事情变得更加复杂。

【问题讨论】:

    标签: java android android-activity android-fragments dialogfragment


    【解决方案1】:

    您的应用在此处崩溃

     mListener = (SensorRateChangeListener) activity;
    

    因为它希望您的 Main Activity 是这样的:

    public class MainAcivity extends Activity implements SensorRateChangeListener{
    

    由于您在另一个片段中实现了 SensorRateChangeListener 接口,因此它崩溃了。 所以只需在 MainActivity 中实现 SensorRateChangeListener 接口或实现如下方法:

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

    编辑

    以及来自实现 SensorRateChangeListener 接口的活动/片段:

    newFragment.setOnSensorRateChangeListener(this);
    

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

    if(mListener!=null)
    

    【讨论】:

    • 你说得对,但我应该在哪里调用 setOnSensorRateChangeListener?
    • 在您的 Activity 中创建片段的新实例后
    • 在 MainActivity 中?还是在调用DialogFragment的FragmentActivity中?
    • 这取决于实现接口并持有DialogFragment的类,它可以是MainActivity或FragmentActivity,请查看上面的更新答案
    • 在片段中,但是我应该将哪些参数传递给 setOnSensorRateChangeListener?
    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 2016-03-27
    • 2015-04-24
    • 2018-01-05
    • 1970-01-01
    • 2021-09-02
    • 2014-04-13
    相关资源
    最近更新 更多