当前位置: 首页 > 知识库问答 >
问题:

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

强才捷
2023-03-14

我想从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() {}
}

对话片段和片段来自libandroid.support.v4。

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

谢谢。

共有1个答案

堵宏毅
2023-03-14

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

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();
    }
}

现在回到内部对话框类中的Test片段中:

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();
    }
}

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

 类似资料:
  • 我试图从碎片屏幕调用一个活动中的方法。 我有一个名为myMethod()的方法,它位于名为MyActivity的活动中;我有一个片段叫做Screen1Fragment。 我想给我的活动打电话。从Screen1Fragment内部创建myMethod(),但我不确定如何执行此操作。 以前,Screen1Fragment是一个活动,因此我扩展了MyActivity,以便可以直接调用myMethod()

  • 我正在启动一个新项目,该项目使用支持库中的。我正在尝试弄清楚如何从片段中使用。我托管片段的活动扩展了,但我没有看到Fragments的类似支持类。 从我的片段中 使用它的google页面(http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html)表示v4片段不应更改。我是否需要

  • 我在片段类中有方法。我想从主活动中调用该方法,但不想使用FragmentById(或)FragmentByTag。 我的碎片方法: 如何在不使用FragmentById(或)FragmentByTag的情况下从主活动调用上述方法?

  • 那么DialogFragments有什么特别之处呢?为什么在显示对话框时没有暂停调用片段?又如何实现呢? 我在文档中没有发现任何关于这种行为的引用,所以引用是一个加号。

  • P.P.S@Philipp Jahoda,我实现了onCreateOptionsMenu(...)在片段的托管活动中。

  • 如果从Fragment调用,我的DialogFragment会抛出ClassCastException,而如果从Activity调用,则会正常工作。我已经看了很少的其他问题与类似的问题,基本上是与进口有关的,但我没有能够解决在我的实现。下面是我对DialogFragment的实现。 下面是我使用上面的DialogFragment的片段: 这是错误日志: 我想知道有没有人能给出一个关于这个问题的提示