【问题标题】:How can i initialize a custom interface如何初始化自定义界面
【发布时间】:2019-06-12 09:25:30
【问题描述】:

我有一个界面:

public interface ToggleChartListener {
    public void onToggleChartChanged(boolean isPie);
}

我想从活动 A 中调用它,以便活动 B 可以监听更改。

这是我迄今为止尝试过的,但我得到了 ClassCastException:

ToggleChartListener toggleChartListener = ((ToggleChartListener)getApplicationContext());
toggleChartListener.onToggleChartChanged(true);

如何初始化界面?

【问题讨论】:

  • 我建议通过阅读 "What is an interface?" 回归基础。接口不是类,因此不能被实例化。相反,接口是一组类可以选择实现的通用方法声明。
  • 使用处理程序在活动而不是接口之间传递消息。
  • 在您的实例中,Context 确实没有实现ToggleChartListener,因此不能转换为ToggleChartListener
  • @AbhayKoradiya,我不同意,使用处理程序不是推荐的方法,它通常会导致 IllegalArgumentException(我们必须使用 isAdded() 或 isFinishing() 保护它)和许多其他与 Bundle 相关的问题,但建议使用接口。
  • @Astha,如果我们在oncreate 中初始化处理程序并在finishdestroy 中分配null,则不会产生问题。

标签: java android interface


【解决方案1】:

由于((ToggleChartListener)getApplicationContext()); 而崩溃。您需要将Activity B 的实例类型转换为ToggleChartListener 以进一步从Activity A 调用onToggleChartChanged()

另外,你为什么要让你的 Activity B 监听这些变化?因为用户不能同时看到 2 个活动? (相反,您可以使用startActivityForResult()

【讨论】:

    【解决方案2】:

    通过接口与不同的活动进行通信是不正确的方式。 所以你可以按照下面的方法。 你有一个接口ToggleChartListener。在您的 Activity A 中,您必须声明接口对象,例如:private ToggleChartListener listener;,然后您必须创建类似的方法:

    // static because A is an activity you may not b access method from other activity
    public static void initCallback(ToggleChartListener listener){
      this.listener = listener
    }
    

    现在你可以调用你的接口方法了:

    listener.onToggleChartChanged(true);
    

    在活动 B 中,您必须调用:

    ActivityA.initCallback(new ToggleChartListener()) // here you get override method onToggleChartChanged to access data
    

    注意:但是将值从活动 A 传递到活动 B 的简单方法是 Intent 如果情况是您在活动 A 中,您将在返回活动 A 后前往活动 B,您需要结果,那么您可以通过从活动 A 调用 startActivityResult 方法来使用 onActivityResult 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多