2017-10-27 7 views
0

私はLinearLayoutに配置したカスタムビューのリスナーを設定しようとしています。これらのビューは、特定のファイルやデータに応じてコードによって作成されるため、そこに存在するビューの数はわかりません。 OnClickListenerは設定されていますが、onClick()は呼び出されません。リスナーは機能しません

@Override 
    protected void onResume() { 
     super.onResume(); 
     try { 
      setupBackEnd(); 
     } catch (IOException e) { 
      Toast.makeText(this, "Error Reading or Writing data in Storage, Try to restart the App", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } 

     Toast.makeText(DayActivity.this, "Child count: " + linearList.getChildCount(), Toast.LENGTH_SHORT).show(); 
     for (int i = 0; i < linearList.getChildCount(); i++) { 
      linearList.getChildAt(i).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Toast.makeText(DayActivity.this, "clicked", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    } 

これは私のコードです。子供の眺めが既にそこにあることを確かめるために、私はトーストを見せてくれました。それは私に "子供の数:5"を与えましたが、 "クリックしました"トーストは決して現れません。自分のカスタムビューがクリック可能であることを確認しました(リニアリストの子)。しかし、リスナーは何らかの理由で動作しません。なぜ誰も知っていますか?

編集:私はコードをデバッグしようとした後、私はこのエラーを得た:

10-27 18:52:26.309 17630-17630/osm_cave.timecave E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: osm_cave.timecave, PID: 17630 
                    android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
                     at android.view.ViewRootImpl.setView(ViewRootImpl.java:679) 
                     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342) 
                     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) 
                     at android.widget.Toast$TN.handleShow(Toast.java:459) 
                     at android.widget.Toast$TN$2.handleMessage(Toast.java:342) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:154) 
                     at android.app.ActivityThread.main(ActivityThread.java:6119) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
c 

私がブレークポイントでデバッグするとき、それはのみ表示され、デバッグせずにアプリを起動すると、このエラーは表示されません。このエラーは、もはや存在しないコンテキストを使用しようとしていることを意味するはずですが、私はそれほど問題ではありません。

+1

デバッグ中にエラーが発生した場合、通常は[競合状態](https://en.wikipedia.org/wiki/Race_condition)を示します – Jon

+0

修正できますか? –

答えて

2

トーストメッセージにエラーが発生しているようです。

at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) 
at android.widget.Toast$TN.handleShow(Toast.java:459) 
at android.widget.Toast$TN$2.handleMessage(Toast.java:342) 
at android.os.Handler.dispatchMessage(Handler.java:102) 

私の記憶が正しければ、あなたはタイプView.OnClickListenerで作成された新しいオブジェクトは、(それが匿名であるため)DayActivity.this属性にアクセスすることはできません。代わりに、ビューからアクティビティを取得する必要があります。

public void onClick(View view) { 
    Activity activity = (Activity) view.getContext() 
    Toast.makeText(activity, "clicked", Toast.LENGTH_SHORT).show(); 
} 

発生したイベントをテストするためにトーストメッセージを使用しては何も問題はありませんが、私は、ログメッセージを使用してして簡素化することをお勧めします。コンテキストメッセージではないログメッセージは、メッセージにヌルメッセージを指定する場合を除き、失敗する可能性は低いです。

ログメッセージが機能しない場合、次のトラブルシューティングの手順は、カスタムビューとビュー階層を調べることです。クリック可能な透明なビューがカスタムビューの前にある場合、クリックイベントを代行受信します。ビュー自体もクリック可能であることを再度確認します。

+0

私はログメッセージを試しましたが、メッセージは出力されませんでした。あなたが言ったようにアクティビティを取得しようとしましたが、どちらも動作しませんでした。何か案は? –

+1

anonクラスは親クラスへの参照を保持しているため、anonクラスのアクティビティを参照できるはずです。しかし、この場合、彼は破壊された「文脈」への参照を保持している可能性が高い。だからあなたは答えが良いです。なぜなら、ビューは常に最新の 'context'を持っていなければならないからです。 – Jon

+0

エラーはもう一つのトーストで子カウントを表示していましたが、問題はonclickが決して呼び出されないということです。 ( "クリック"、 "ビューがクリックされました");はリスナー内で呼び出されません –

関連する問題