検索

ホームページ  >  に質問  >  本文

android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?

正如标题所言,View成员变量已经在Activity的onCreate方法中,通过findViewById方法初始化了。但在另一个类中,用通过new方法构造的Activity对象来执行封装好的公有方法时,发现其中的View成员变量是空的。具体代码如下(new MainActivity().select(selectCity)这句调用Activity的方法):

错误类型是

错误提示是指向下面这句

然后,调试结果如下

发现这里的View对象是为空的。然后,我换成发送广播的方式,让MainActivity接收广播,这样是可以的,调试结果如下:

发现mCityTextView不是空的。

对比上面的情况,我觉得通过findViewById方法初始化的View对象,只属于Activity这个类本身,所以由它使用是没问题的。但是通过new方法构造的Activity对象,得到的是没有初始化的View对象。所以究竟是怎么回事呢???

巴扎黑巴扎黑2771日前590

全員に返信(7)返信します

  • 怪我咯

    怪我咯2017-04-17 17:26:36

    道は少し荒れています。 new MainActivity() はアクティビティのライフサイクルに従いません。たとえば、onCreate() でコントロールを初期化する場合、select() を直接呼び出すと、当然のことながら null ポインターになります。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:26:36

    Activity、Service、および ContentProvider は、新しいメソッドでインスタンスを取得できません (「異常なインスタンス」という方が適切です)。Activity、Service、BroadcastReceiver、および ContentProvider にはすべてライフサイクルがあります。これらをコンポーネントに追加することはお勧めできません。 . 外部呼び出しによって定義された静的変数またはメソッド。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:26:36

    アクティビティが Android のアクティビティ コンポーネントであるとおっしゃったかどうかはわかりませんが、アクティビティ コンポーネントを構築するときに、アタッチ メソッドを実行して Context、Window などのオブジェクトを渡す必要があるのがその理由だと思います。空であるのは、アタッチ Window オブジェクトがないためです。
    Window オブジェクトはすべての View のコンテナです

    返事
    0
  • PHPz

    PHPz2017-04-17 17:26:36

    これはあなたが望むアクティビティではありません。
    アクティビティへの参照を渡してください。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:26:36

    コードを見ると、取得したアクティビティを MainActivity に変換するだけです。
    これは以前の MainActivity ではありません。 >

    返事
    0
  • 阿神

    阿神2017-04-17 17:26:36

    ここでの問題は、変数に static が設定されていないため、新しいオブジェクトが生成されると変数が空になり、再初期化する必要があることです。ああ、基礎知識が足りませんでした。 。しかし、それでもあなたの答えに感謝したいと思います! !

    返事
    0
  • 黄舟

    黄舟2017-04-17 17:26:36

    この場合、インターフェイス コールバックを使用した方が簡単ではないでしょうか?

    返事
    0
  • キャンセル返事