元理系院生の新入社員がPythonとJavaで色々頑張るブログ

プログラミングや機械学習について調べた事を書いていきます

findViewByIdで独自Viewを呼び出すとNullになる問題

どんな問題?

FragmentやActivityのlayout用のxmlに独自に作成したViewを配置し、FragmentやActivityからfindViewByIdで独自Viewを呼びだそうとするとnullがかえってくる問題が発生しました。



具体的なコードを示すと以下の様になります

MainFragment.java

@Override
public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
                CustomView customView = (CustomView)this.getActivity().findViewById(R.id.custom_view);

この様なコードを書くとcustomViewにnullが代入されました。

先人様の知恵により解決

カスタムViewでヌルポ|オレのAndroidメモ

調べてみたら全く同じ問題に遭遇し解決策を提示してくださっている記事を見つけました。
どうやらコンストラクタ周りによる問題みたいですね。

解決法

独自Viewを実装した際に原因の分からないNullpointerのエラーが発生したら、コンストラクタ周りを確認してみる。

Viewのコンストラクタは三種類あり、独自Viewを実装した際は全てOverrideして定義したほうが良い。

public CustomView(Context context) {
	super(context);
}
public CustomView(Context context, AttributeSet attrs){
	super(context, attrs);
}
public CustomView(Context context, AttributeSet attrs, int defStyle){
	super(context, attrs, defStyle);
}

また、親クラスのコンストラクタの呼び出し部分(super)の引数に注意。

下の様にコンストラクタの引数とsuperの引数を間違えると悲しい事になってしまいます。しまいました。

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