Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从内部DialogFragment内的主片段调用方法时出错_Java_Android_Android Fragments - Fatal编程技术网

Java 从内部DialogFragment内的主片段调用方法时出错

Java 从内部DialogFragment内的主片段调用方法时出错,java,android,android-fragments,Java,Android,Android Fragments,我想从AlertDialog的方法setPositiveButton()内的片段调用一个方法,该方法用于返回DialogFragment的对话框,但无法执行此操作 我在一个名为Test的类中有doSomething()方法,该类扩展了Fragment。在这个类中,我有一个扩展DialogFragment的内部类。在方法onCreateDialog中,是问题发生的地方。看看代码: public class Test extends Fragment { @Override public View

我想从AlertDialog的方法setPositiveButton()内的片段调用一个方法,该方法用于返回DialogFragment的对话框,但无法执行此操作

我在一个名为Test的类中有doSomething()方法,该类扩展了Fragment。在这个类中,我有一个扩展DialogFragment的内部类。在方法onCreateDialog中,是问题发生的地方。看看代码:

public class Test extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view = inflater.inflate(R.layout.activity_main, null);
    return view;
}

public static class SelectDeviceDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
        .setPositiveButton(R.string.ok,
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                ((Test) getTargetFragment()).doSomething();
            }
        }).create();
    }
}

private void doSomething() {}
}
DialogFragment和Fragment来自lib android.support.v4

发生此错误是因为无法执行要测试的强制转换。在这种情况下,我如何调用doSomething方法


谢谢。

在修改我的答案时,你可以走两条路。第一个是将静态类更改为最终声明,如下所示:

public final DialogFragment selectDeviceDialogFragment = new DialogFragment(){
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setPositiveButton(R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                doSomething();
                            }
                        }).create();
    }    
};
如果这不合适,并且确实需要静态声明,那么应该使用接口与之通信。因为您使用的是静态类,所以假设您是从另一个片段调用此DialogFragment。如果是这样,我会走这条路:

public interface DoSomething{
     public void doSomething();
}
现在,在您的活动中,您需要实现DoSomething接口:

private class MyActivity extends Activity implements DoSomething{

    /** other methods **/

    @Override
    public void doSomething() {
        FragmentManager fragmentManager = getFragmentManager();
        Test frag = (Test)fragmentManager.findFragmentById(/*the fragment id*/);
        frag.doSomething();
    }
}
现在回到内部对话类中的测试片段:

public static class SelectDeviceDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
                .setPositiveButton(R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                MyActivity activity = (MyActivity)getActivity();
                                activity.doSomething();
                            }
                        }).create();
    }
}

希望这次我已经回答了你的问题:)

那是办不到的。为了更好的理解,我修改了这个问题。希望编辑能起作用!请让我知道,如果这些解决方案中的任何一个对您有效,不幸的是,它不起作用。FragmentActivity是这样的,因此我没有任何标识我的片段的Id。