276

まず第一に、はい、このトピックに関する他のすべてのスレッドを読みました。そして、このサイトからのものだけではありません... (ほら、私は少しイライラしています)

それらのほとんどには、XML ファイルandroid:idだけでなく、使用するためのアドバイスが付属しています。idやった。

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.findViewByIdとのView.findViewById違いによるものかもしれません。そこで、カスタム ビュー コンストラクターに渡されたコンテキストをローカルに保存して、次のことを試しました。

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

どちらも返されnullました。

ViewGroup次に、代わりにカスタム ビューを拡張するように変更し、カスタム ビューの直接の子になるように変更して、想定どおりに動作するようにしましViewた。驚き: 何も解決しませんでした。location_layout.xmlTextViewView.findViewById

それで、私は一体何を間違っているのですか?

コメントをいただければ幸いです。

4

31 に答える 31

292

nullを返す

おそらく、呼び出しが早すぎるためです。まで待ちonFinishInflate()ます。これは、コンテンツにアクセスするカスタムを示すサンプル プロジェクトです。View

于 2010-07-16T12:07:30.310 に答える
154

おそらく、あなたは電話findViewByIdする前に電話していsetContentViewますか?その場合は、呼び出した後に呼び出してみてfindViewById くださいsetContentView

于 2011-11-17T09:33:48.373 に答える
105

異なる画面密度用に複数のバージョンのレイアウトが存在しないことを確認してください。既存のレイアウトに新しい ID を追加したときに、この問題に一度遭遇しましたが、hdpi バージョンを更新するのを忘れていました。レイアウト ファイルのすべてのバージョンを更新するのを忘れた場合、一部の画面密度では機能しますが、他のバージョンでは機能しません。

于 2011-11-05T04:06:02.183 に答える
34

カスタム ビューで間違ったスーパー コンストラクターを呼び出すと、FindViewById が null になる可能性があります。ID タグは attrs の一部であるため、attrs を無視すると ID が削除されます。

これは間違っているでしょう

public CameraSurfaceView(Context context, AttributeSet attrs) {
        super(context);
}

正解です

public CameraSurfaceView(Context context, AttributeSet attrs) {
        super(context,attrs);
}
于 2015-06-02T17:57:35.537 に答える
18

他の場所で言及されている古典的な原因と並んで:

  • setContentView()以前に電話したことを確認してくださいfindViewById()
  • id必要なが、指定したビューまたはレイアウトにあることを確認してくださいsetContentView()
  • idが異なるレイアウトで誤って複製されていないことを確認してください

ドキュメントに反する、標準レイアウトのカスタムビュー用に見つけたものがあります。

理論的には、カスタム ビューを作成してレイアウトに追加できます (こちらを参照)。ただし、このような状況ではid、カスタム ビューを除くレイアウト内のすべてのビューに対して属性が機能する場合があることがわかりました。私が使用する解決策は次のとおりです。

  1. FrameLayout各カスタム ビューを、カスタム ビューに必要なレイアウト プロパティと同じものに置き換えます。それに適切な値を与えてidくださいframe_for_custom_view
  2. onCreate

    setContentView(R.layout.my_layout);
    FrameView fv = findViewById(R.id.frame_for_custom_layout);
    MyCustomView cv = new MyCustomView(context);
    fv.addView(cv);
    

    これにより、カスタム ビューがフレームに配置されます。

于 2014-12-20T09:06:51.893 に答える
15

私の場合、プロジェクトには2つのアクティビティがmain.xmlありmain2.xmlました。最初から、main2のコピーでしたが、に新しく追加するmainまではすべてうまく機能していたので、アプリの残りの部分で利用できるようになりました。次に、標準の呼び出しでフェッチしようとしました。TextViewmain2R.id.textview1

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

そしてそれは常にヌルでした。onCreateコンストラクターでインスタンス化していmain2たのではなく、もう1つをインスタンス化していたことが判明しました。私が持っていた:

setContentView(R.layout.main);

それ以外の

setContentView(R.layout.main2);

私がここに到着した後、サイトでこれに気づきました。

于 2013-01-14T15:04:49.000 に答える
10
    @Override
protected void onStart() {
         // use findViewById() here instead of in onCreate()
    }
于 2014-06-18T00:24:22.990 に答える
6

ExpandableListView を使用していて、タイトルに基づいてこの質問に出くわした人への回答。

ExpandableListView 実装の一部として、子ビューとグループ ビューで TextViews を操作しようとすると、このエラーが発生しました。

getChildView() および getGroupView() メソッドの実装では、次のようなものを使用できます。

        if (convertView == null) {
            LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_layout, null);
        }

私はこれをここで見つけました。

于 2012-01-23T22:25:25.057 に答える
6

FWIW、私が必要としていたのとまったく同じ方法でこれを解決した人は誰もいないと思います。コンパイル時に問題はありませんでしたが、実行時に null ビューを取得し、適切な順序で呼び出していました。つまり、 setContentView() のの findViewById( ) です。問題は、私のビューが content_main.xml で定義されていることが判明しましたが、私の activity_main.xml には、次の 1 つのステートメントがありませんでした。

<include layout="@layout/content_main" />

それを activity_main.xml に追加すると、NullPointer はなくなりました。

于 2016-07-09T02:19:00.320 に答える
5

私は Android/Eclipse にかなり慣れていません。誤って のactivity_main.xml代わりにUI を追加しましたfragment_main.xml。それを理解するのに数時間かかりました...

于 2014-04-21T20:03:14.623 に答える
3

ここに私の特定のケースを投げたかっただけです。将来誰かを助けるかもしれません。

次のように、Android UI XML でディレクティブを使用していました。

親ビュー:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="home_phone"
    android:background="@color/colorPrimary">

    ...

    <include
        layout="@layout/retry_button"
        android:visibility="gone" />

子ビュー (retry_button):

<com.foo.RetryButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/retry"
    android:layout_gravity="center"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="140dp">

.findViewById(R.id.retry) は常に null を返します。しかし、ID を子ビューからインクルード タグに移動すると、機能し始めました。

固定親:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:tag="home_phone"
    android:background="@color/colorPrimary">

    ...

    <include
        layout="@layout/retry_button"
        android:id="@+id/retry"
        android:visibility="gone" />

固定子:

<com.foo.RetryButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_gravity="center"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="140dp">
于 2016-06-15T17:54:05.793 に答える
2

レイアウト リソースからアクティビティ コンテンツを設定します。すなわち、setContentView(R.layout.basicXml);

于 2014-06-26T09:49:51.370 に答える
2

私の場合、 ExpandableListView を使用していて、設定していましたandroid:transcriptMode="normal"。これにより、展開可能なグループのいくつかの子が消えてしまい、リストをスクロールするたびに NULL 例外が発生していました。

于 2012-11-26T10:44:28.503 に答える
1

レイアウトを膨らませる!! (IDを含む)

私の場合、findViewById() は null を返しました。これは、要素が書き込まれたレイアウトが膨張していないためです...

例えば。fragment_layout.xml

<ListView
android:id="@+id/listview">

inflater.inflate(R.layout.fragment_layout, ..., ...); を実行していないため、findViewById(R.id.listview) は null を返しました。その前に。

この回答が皆さんの役に立てば幸いです。

于 2015-10-24T20:52:51.277 に答える
1

私の場合、レイアウトを膨らませましたが、子ビューは null を返していました。もともと私はこれを持っていました:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_history);

    footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_footer, null, false);
    pbSpinner = (ProgressBar) findViewById(R.id.pbListviewFooter);
    tvText = (TextView) findViewById(R.id.tvListviewFooter);
    ...
}

ただし、次のように変更すると機能しました。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_history);

    footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_footer, null, false);
    pbSpinner = (ProgressBar) footerView.findViewById(R.id.pbListviewFooter);
    tvText = (TextView) footerView.findViewById(R.id.tvListviewFooter);
    ...
}

重要なのは、子ビューを取得するために、既に膨張したレイアウトを具体的に参照することでした。つまり、追加するにはfooterView:

  • footerView .findViewById...
于 2015-01-09T06:35:27.137 に答える
0

Fragment 内にいる場合、findViewById は null を返すこともあります。ここで説明されているように: Fragment の findViewById

Fragment 内の最上位ビューを返すには、getView() を呼び出す必要があります。次に、レイアウト項目(ボタン、テキストビューなど)を見つけることができます

于 2016-10-27T02:26:16.850 に答える
0

私の場合、呼び出しを親オブジェクトから親によってインスタンス化されたアダプター オブジェクトに移動すると、findViewById は null を返しました。ここにリストされているトリックを試してもうまくいかなかった後、findViewById を親オブジェクトに戻し、アダプター オブジェクトのインスタンス化中に結果をパラメーターとして渡しました。たとえば、親オブジェクトでこれを行いました:

 Spinner hdSpinner = (Spinner)view.findViewById(R.id.accountsSpinner);

次に、アダプター オブジェクトの作成中に hdSpinner をパラメーターとして渡しました。

  mTransactionAdapter = new TransactionAdapter(getActivity(),
        R.layout.transactions_list_item, null, from, to, 0, hdSpinner);
于 2018-07-27T05:24:20.793 に答える
-1

私の修正は、プロジェクトをきれいにすることでした。

于 2016-05-24T17:51:08.753 に答える
-1

上記のすべてを試してみましたが、何も機能していませんでした..だから、ImageViewを静的 public static ImageView texture;にする必要がありましたが、それtexture = (ImageView) findViewById(R.id.texture_back);は良いアプローチだとは思いませんが、これは私の場合は本当にうまくいきました:)

于 2017-10-06T06:05:39.413 に答える