2016-06-13 5 views
1

私はここで非常に奇妙な問題に直面しています。私のfragmentでは、後にinflatelayoutfindViewById()メソッドがnullを返すことがあります。しかし、問題は全く再現できません。私はCrashlyticsからこれらのクラッシュレポートを取得しています。そして、このクラッシュはQAメンバーの1人にも起こりましたが、彼はまたこの問題を再現できませんでした。findViewById()メソッドはnullを返すことがあります(ほとんどの場合、大丈夫です)

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:app="http://schemas.android.com/apk/res-auto" 
       android:id="@+id/topics_parent" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" 
       android:background="?attr/default_background"> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="@dimen/back_to_top_margin_right" 
     android:layout_marginBottom="@dimen/back_to_top_margin_bottom" 
     android:src="@drawable/back" 
     android:visibility="gone" 
     android:id="@+id/back"/> 

    <LinearLayout 
     android:id="@+id/error_parent" 
     android:layout_width="match_parent" 
     android:background="?attr/default_background" 
     android:orientation="vertical" 
     android:layout_height="match_parent"> 
    </LinearLayout> 

    <ProgressBar 
     android:id="@+id/progressbar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true"/> 
</RelativeLayout> 

クラッシュログfindViewById()がためにnullを返している理由を考え出す本当に苦労して

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.news.activities.NewsHomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3928) 
     at android.app.ActivityThread.access$900(ActivityThread.java:147) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1287) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5253) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
     at com.myapp.news.fragments.TopicsGroupFragment.onCreateView(TopicsGroupFragment.java:157) 
     at android.app.Fragment.performCreateView(Fragment.java:2053) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:894) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1049) 
     at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1869) 
     at android.app.Activity.performCreateCommon(Activity.java:5970) 
     at android.app.Activity.performCreate(Activity.java:5977) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3928) 
     at android.app.ActivityThread.access$900(ActivityThread.java:147) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1287) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5253) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

:ここ

は私のフラグメント

 @Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    View customView= inflater.inflate(R.layout.custom_view, container, false); 
    ImageView back= (ImageView) customView.findViewById(R.id.back); 

    //Throwing Null Pointer Exception for the below line. 
    back.someFunc(); 
    return customView; 
} 

XMLファイルのコードですその視点。

注:私は多くの人がbackImageViewresourcesですが、それらはすべて異なるXMLファイルにあります。あなたはそのIDを見つけるために、topicsViewを使用している間、あなたはのCustomViewにビューを膨張さ

+0

'ビューのCustomView = inflater.inflate(R.layout.custom_view、容器、偽)。 ImageView back =(ImageView)topicsView.findViewById(R.id.back); '?? これは '(ImageView)customView.findViewById(R.id.back)ではありません;' ?? – SripadRaj

+2

'topicsView'はどこですか? 'onCreateView'メソッドから' customView'を返す場合、レイアウトからビューにアクセスするには 'customView'にする必要があります –

+2

' customView'でレイアウトを拡張しているときに 'topicsView'を使う理由は? –

答えて

0

....

変更topicsView

findviewbyIdへのCustomView

ImageView back= (ImageView) customView.findViewById(R.id.back); 
+0

型エラーです。私はその場所の一つで変数名を変更し、質問を投稿するために他の場所で変更するのを忘れてしまった。私はその質問を修正した。 – thedarkpassenger

0

割り当てカスタムビューへ。 Layoutを膨らませている場合はcustomViewになります。

View customView= inflater.inflate(R.layout.custom_view, container, false); 
ImageView back= (ImageView) customView.findViewById(R.id.back); 

変更全てに対して一意にごMultiple image resources IDを。例えばbackback1back2などについては

...もしか

+0

型エラーです。私はその場所の一つで変数名を変更し、質問を投稿するために他の場所で変更するのを忘れてしまった。私はその質問を修正した。 – thedarkpassenger

+0

@thedarkpassengerフルクラッシュログを投稿してください。また、 'customview.xml'コードもあります。 –

0

あなたはcustomViewという名前の変数にビューを膨らませているそして、あなたは間違っているImageViewのためtopicsViewビューを使用していたよう。ここで

完全なコード

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    View customView= inflater.inflate(R.layout.custom_view, container, false); 
    ImageView back= (ImageView) customView.findViewById(R.id.back); 


    back.someFunc(); 
    return customView; 
} 
0

はnullをチェック

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
View customView= inflater.inflate(R.layout.custom_view, container, false); 
ImageView back= (ImageView) customView.findViewById(R.id.back); 

if(back!=null) 
back.someFunc(); 
} 
4
It may be because in OnCreateView THE VIEW is not fully created try to use following code: 

    /*---------- WHEN THIS FRAGMENT VIEW IS CREATING --------------------------*/ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(getLayoutId(), container, false); 
    } 

    /*---------- WHEN FRAGMENT VIEW IS CREATED --------------------------*/ 
    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     ImageView back= (ImageView) view.findViewById(R.id.back); 
     back.someFunc(); 
    } 
+0

私はそれを実装しようとします。ありがとう。 – thedarkpassenger

0

使用OnCreateViewがあなたのフラグメントにレイアウトを設定し、あなたにオブジェクトを作成するためにonActivityCreatedを使用することを作るクラッシュを避けるためであります次のコードのようなビュー。

public class test extends Fragment 
{ 
    View view; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
    { 
     return view = inflater.inflate(R.layout.fragment_page, container, false); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 

     ImageView back= (ImageView) view.findViewById(R.id.back); 
    } 
} 
0

あなたはのCustomViewという名前の変数にあなたのビューを膨張していて、nullポインタ例外を取得しているなぜあなたはImageViewの、ザッツ用topicsViewビューを使用しています。

Lets See the full code.  


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View customView= inflater.inflate(R.layout.custom_view, container, false); 
    ImageView back= (ImageView) customView.findViewById(R.id.back); 

    back.someFunc(); 
    return customView; 

}

関連する問題