2017-09-03 93 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

您的聲明位於Object-Declaration(OnClickListener)中。所以this不是你在這種情況下的Activity,而是OnClickListener。

三個選項來解決:

  • 參考與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());