2017-09-03 5 views
0

は、私は、ユーザーが次のコードを使用してLinearLayoutをクリックすると、カスタムダイアログを開くしようとしている:OnClickListenerの正しいコンテキストを取得するにはどうすればよいですか?

each_pays = (TextView) findViewById(R.id.each_pays); 

    each_pays_vert.setOnClickListener(new LinearLayout.OnClickListener() { 
     @Override 
     public void onClick(View _v) { 
      // custom dialog 
      final Dialog multiples_dialog = new Dialog(this); 
      multiples_dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
      multiples_dialog.setContentView(R.layout.multiples_dialog); 

      Button closeMultiplesDialogButton = (Button) multiples_dialog.findViewById(R.id.close_multiples_button); 
      // if button is clicked, close the custom dialog 
      closeMultiplesDialogButton.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        multiples_dialog.dismiss(); 
       } 
      }); 

      multiples_dialog.show(); 
     } 
    }); 

カスタムダイアログコードなど他の場所で動作します(例えば、オプションメニューの項目をクリックから実行した場合)しかし、ここで試してみると、コンパイル時エラーError:(303, 71) error: incompatible types: Intent cannot be converted to Contextが発生します。

誤差はラインである:

final Dialog multiples_dialog = new Dialog(this); 

私は、実行時のクラッシュを取得thisgetApplicationContext()と交換してください。

私は混乱しています。

答えて

1

宣言は、オブジェクト宣言(OnClickListener)内にあります。したがってthisはあなたのアクティビティではなく、OnClickListenerです。回避するには

の3つのオプション:final Dialog multiples_dialog = new Dialog(MainActivity.this)

  • と例えば

    • 参照活動は、あなたの活動に別の関数にダイアログを表示し、あなたのOnClickListenerにその関数を呼び出すコードを置きます。
    • OnClickListener内で使用されるコンテキストへの参照を保存します(最終としてマークします)。

    each_pays = (TextView) findViewById(R.id.each_pays); 
    final Context ctx = this; 
    each_pays_vert.setOnClickListener(new LinearLayout.OnClickListener() { 
        @Override 
        public void onClick(View _v) { 
         // custom dialog 
         final Dialog multiples_dialog = new Dialog(ctx); 
         ... 
    

    注:アプリケーション・コンテキストは、任意のUI-アクションに使用することはできません。このオプションは、次のようになります。これは、getApplicationContext()を使用するときのクラッシュの原因です。

  • +0

    私はクイックフィックスとして最初のオプション( 'MainActivity.this')を使用し、おそらくできるだけ早くあなたの第二の提案を経て実施していきます私は、より正確で迅速な修正が少なくて済むように、少しのコードを書き直す機会を得ました。 –

    0

    あなたはgetContext()を使用してViewからContextを取得することができます。

    final Dialog multiples_dialog = new Dialog(_v.getContext()); 
    
    関連する問題