1. ホーム
  2. android

[解決済み】findViewByIDがnullを返す。

2022-02-16 13:55:33

質問

まず最初に:はい、このトピックに関する他のスレッドもすべて読みました。このサイトのものだけでなく...。(ほら、ちょっとイライラしてるので)

そのほとんどが android:id ではなく、単に id をXMLファイルに追加してください。した。

他の人から聞いた話ですが View.findViewById とは異なる動作をします。 Activity.findViewById . そのあたりも処理しました。

私の location_layout.xml , を使っています。

<FrameLayout .... >
    <some.package.MyCustomView ... />

    <LinearLayout ... >
        <TextView ...
            android:id="@+id/txtLat" />
        ...
    </LinearLayout>
</FrameLayout>

私のアクティビティでは、そうしています。

...
setContentView( R.layout.location_layout );

と、私のカスタムビュークラスにあります。

... 
TextView tv = (TextView) findViewById( R.id.txtLat );

を返します。 null . これを実行すると、私のActivityは正常に動作します。 ということは、もしかしたら Activity.findViewByIdView.findViewById の違いがあります。そこで、カスタムビューのコンストラクタに渡されたコンテキストをローカルに保存して試してみました。

...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );

を返し、さらに null .

そして、カスタムビューを拡張するように変更しました。 ViewGroup 代わりに View を変更し location_layout.xml を使わせるようにしました。 TextView がカスタムビューの直接の子であるようにします。 View.findViewById は想定通りに動作するはずです。驚いたことに、それは何の解決にもならなかったのです。

では、一体何が間違っているのでしょうか?

何かコメントがあれば、よろしくお願いします。

解決方法は?

<ブロッククオート

を返した場合、NULL

呼び出すタイミングが早すぎるためと思われます。次の時刻まで待ちます。 onFinishInflate() . 以下はサンプルプロジェクトです。 カスタム View がその内容にアクセスします。