2011-03-31 101 views
3

我是相當新的Java開發...我試圖在一個Android應用程序用下面的代碼來實現警報......安卓:減少了代碼處理AlertDialog

 AlertDialog.Builder alert=new AlertDialog.Builder(this); 
     alert.setMessage("I'm a multi-button alert :-)"); 
     alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(), 
        "OK", 
        Toast.LENGTH_LONG) 
        .show(); 
      } 
     }); 
     alert.setNegativeButton("No", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(), 
        "KO", 
        Toast.LENGTH_LONG) 
        .show(); 
      } 
     }); 
     alert.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getApplicationContext(), 
        "CANCEL", 
        Toast.LENGTH_LONG) 
        .show(); 
      } 
     }); 
     alert.show(); 

它運行,但我想要通過指向處理單擊按鈕的單個函數來爲每個按鈕避免新的DialogInterface.OnClickListener ...。我認爲這是可能的,但我不知道如何,任何人都可以幫助我?

在此先感謝 c。

回答

11

您可以實現包含類的DialogInterface.OnClickListener和監控which參數看哪個按鈕被點擊。

alert.setPositiveButton("Ok", this); 
alert.setNegativeButton("No", this); 
alert.setNeutralButton("Cancel", this); 

public void onClick(DialogInterface dialog, int which) { 
    String text = ""; 

    switch (which) 
    { 
     case DialogInterface.BUTTON_NEGATIVE: 
      text = "Cancel"; 
    } 

    Toast.makeText(getApplicationContext(), 
     text, 
     Toast.LENGTH_LONG) 
     .show(); 
} 
+1

什麼含多處對話... – 2016-03-20 14:47:01

1

您可以爲自己定義onClickListener並將其添加到按鈕,然後您必須在Listener中確定哪個Button正在調用。這真的不減少代碼量,但我更喜歡這種方式,因爲更好的可讀性的(?不知道這個詞存在^^)

1

只需實現一個OnClickListener並進行設置。

class MyActivity implements DialogInterface.OnClickListener { 
    public void onClick(DialogInterface dialog, int which) { 
     switch(which) { 
      case DialogInterface.BUTTON_POSITIVE: 
       Toast.makeText(getApplicationContext(), "OK",Toast.LENGTH_LONG).show(); 
       break; 
      case DialogInterface.BUTTON_NEGATIVE: 
       Toast.makeText(getApplicationContext(), "KO",Toast.LENGTH_LONG).show(); 
       break; 
      case DialogInterface.BUTTON_NEUTRAL: 
       Toast.makeText(getApplicationContext(), "CANCEL",Toast.LENGTH_LONG).show(); 
       break; 
    } 
} 

然後

alert.setPositiveButton("Ok", this); 
alert.setNegativeButton("No", this); 
alert.setNeutralButton("Cancel", this); 
在AlertDialog.Builder

2

略有不同的方法:

final Context context = getApplicationContext(); // Should be "final", won't compile otherwise 
class MyListener implements DialogInterface.OnClickListener { 
    MyListener() { 
    } 
    public void onClick(DialogInterface dialog, int which) { 
      Toast.makeText(context, 
       which == DialogInterface.BUTTON_POSITIVE ? "OK" : 
       which == DialogInterface.BUTTON_NEGATIVE ? "KO" : 
       "CANCEL", 
       Toast.LENGTH_LONG) 
       .show(); 
     } 

} 
MyListener listener = new MyListener(); 

AlertDialog.Builder alert=new AlertDialog.Builder(this); 
alert.setMessage("I'm a multi-button alert :-)"); 
alert.setPositiveButton("Ok", listener); 
alert.setPositiveButton("No", listener); 
alert.setPositiveButton("Cancel", listener); 
1

有一些很好的答案了,但我想我會添加其他變化:

public class MyClickListener implements DialogInterface.OnClickListener { 

    String mDisplayText; 
    Context mCtx; 
    public MyClickListener(String displayText, Context ctx){ 
     mDisplayText = displayText; 
     mCtx = ctx; 
    } 
    public void onClick(DialogInterface dialog, int which) { 
     Toast.makeText(mCtx, 
      mDisplayText, 
      Toast.LENGTH_LONG) 
      .show(); 
    } 
} 

... 

AlertDialog.Builder alert=new AlertDialog.Builder(this); 
alert.setMessage("I'm a multi-button alert :-)"); 
alert.setPositiveButton("Ok", new MyClickListener("OK",this)); 
alert.setNegativeButton("No", new MyClickListener("KO",this)); 
alert.setNeutralButton("Cancel", new MyClickListener("CANCEL",this)); 
1

克里斯...我只是學會了一個技巧是,您不需要在內部類中調用getBaseContext或getApplicationContext。您可以使用MyActivity.this,如下所示:

builder.setNegativeButton("Dismiss", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      //cancels itself? 
      /* Toast.makeText(ConfuseText.this, 
        "HELLO", 
        Toast.LENGTH_LONG) 
        .show();*/ 
     }  

我要說你是Android開發的新手。首先,有三種方法來處理點擊事件。匿名內部類(API 3),實現onClickListener(API 3)和XML屬性(API 4)。恕我直言,內部類更「面向對象」,onClickListener可能更易於閱讀。

其次,考慮使用標準Android架構來顯示AlertDialogs。此策略允許Android OS爲您處理電話方向更改。最初可能會有更多的工作,但會在以後得到回報。所以你需要閱讀onCreateDialog。

protected Dialog onCreateDialog(int id) { 
    Dialog dialog; 
    switch(id) { 
    case DIALOG_ABOUT: 
     // do the work to define the About Dialog 
     dialog= getInstanceAlertDialog(); 
     break; 
    default: 
     dialog = null; 
     break; 
    } 
    return dialog; 
} 

private AlertDialog getInstanceAlertDialog() { 
    AlertDialog.Builder builder= new AlertDialog.Builder(this); 
    builder.setMessage("Confuse Text JALComputing Copyright 2011"); 
    AlertDialog alert= builder.create(); 
    alert.setTitle("About"); 
    return alert; 
} 

三,審議保持事件處理程序儘可能靠近AlertDialog代碼成爲可能,就像你在做什麼。試想如果你決定支持多個警報對話框。除非你有一個巨大的大腦,保持方法和接近「目標」數據容易得多出錯

+0

有沒有去哪裏任何Android設計指南定義onCreateDialog的id參數?就像對話商店一樣。另一方面,恕我直言,這是一個糟糕的設計指南,因爲良好的對象設計鼓勵低耦合和高內聚力,所以事件處理程序代碼「接近對象」。對我而言,正確的方法是創建一個處理程序控制器類並堅持使用MVC模式。 – 2015-11-25 21:57:49

0
d.setPositiveButton("Yes",new DialogInterface.OnClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     MainActivity.this.finish(); 
    } 
}); 

d.setNegativeButton("No",new DialogInterface.OnClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     dialog.cancel(); 
    } 
}); 

d.setNeutralButton("OK", new DialogInterface.OnClickListener() { 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     Toast.makeText(getBaseContext(), "OK", Toast.LENGTH_LONG).show(); 
    } 
}); 
0
builder = new AlertDialog.Builder(this); 
    ListAdapter adapter = new ActionAdapter(this, 
      R.layout.spinner_row_comman, arraylist_date, builder); 

    builder.setTitle("Select days to set Reminder"); 
    builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // TODO Auto-generated method stub 
      if (which == 0) { 


      } else if (which == 1) { 
       dayDate = 2; 
       Log.e("dayDate", "++++++++++++++++" + dayDate); 

       updateLabel(); 

      } else if (which == 2) { 


      } else if (which == 3) { 


      } else if (which == 4) { 


      } else if (which == 5) { 


      } 
     } 

    }); 

    builder.show();