【问题标题】:Android - Call non-static function from dialog [closed]Android - 从对话框调用非静态函数[关闭]
【发布时间】:2016-03-17 02:19:26
【问题描述】:

我正在制作一个游戏应用程序,它会在游戏结束时显示AlertDialog。在对话框中,有一个positiveButton 可以再次播放。

我希望按钮调用我已经为 onCreate() 方法创建的函数,但我不希望函数是静态的。

这是我的onCreate 方法的样子:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setup();
}

我想从对话框中调用setup() 函数。

如何处理这个问题?

提前致谢!

【问题讨论】:

  • 部分代码会更容易理解你的问题。
  • 您不应该调用 onCreate 因为 Activity 已经创建。请编辑您的问题以包含您要执行的操作
  • 您应该可以直接使用MyActivity.this.foo()foo()。我不明白为什么你不能,除非你的 Dialog 不在 Activity 类中
  • 请同时显示对话框的创建位置
  • @The_Grits 你尝试在positiveButton回调中调用什么?

标签: java android


【解决方案1】:

它不必是静态的。如果您的正面按钮回调是匿名或非静态内部类,则它可以访问外部类的非静态方法。您可以从回调中调用setup()

当然,如果您不使用匿名或非静态内部回调类,则情况并非如此,在这种情况下,您必须将 Activity 方法设为静态才能调用它。

This answer 展示了如何做到这一点。

【讨论】:

  • 谢谢,这很有意义。我会投票赞成你的答案并在明天进行测试。再次感谢!
  • 你的回答并没有解决我的问题,但它确实让我更接近了。如果你想看看什么有效,我发布了一个解决方案。感谢您的帮助!
  • 太棒了。如果你在一个片段中这样做,那就是要走的路!我很高兴我有用。
【解决方案2】:

如果你像我在我的最新项目中那样使用DialogFragment,你可以创建一个界面。例如:

/// Inside my DialogFragment
public interface ChooserListener {
    public void setupDialogListener();
}

// Inside my DialogFragment
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        mListener = (ChooserListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()+" must implement the ChooserListener interface.");
    }
}

然后您可以使用... implements YourDialogFragment.YourListener 将接口实现到您的应用程序中。现在,您必须将侦听器中的预定义函数实现到您的主要活动中,并且您可以简单地从 Dialog 内部触发它们。如需进一步参考,请参阅Dialogs - Passing Events

在你的情况下,你应该写一个这样的函数:

public void setupDialogListener() {
     setup();
}

【讨论】:

  • 感谢 cricket_007。没时间简化我的表达。对不起:D
【解决方案3】:

根据@arsent 回答的基本思路,这对我有用:

Main mainActivity = (Main)getActivity();
mainActivity.setup();

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多