2012-08-24 77 views
7

我有擴展DialogFragment的片段,我有一個包含兩個edittext和兩個按鈕的自定義佈局 - ok和cancel。我的對話框顯示得很好,使用onCreateView方法來指定佈局,但我不知道如何處理按鈕點擊。在onCreateView方法中,button.setOnClickListener不起作用。這可能有一個簡單的解決方案,但我堅持了幾個小時。我非常感謝建議或示例代碼。句柄按鈕在DialogFragment中點擊

PS我不想使用AlertDialog,因爲在這種情況下,當點擊ok按鈕時,對話框會自動關閉,而且我無法對edittext進行驗證(例如:當用戶按下ok按鈕和edittext的是空的我不希望對話框消失)。那樣我就可以選擇創建自定義對話框並輕鬆管理按鈕行爲。

回答

5

沿着這些線路

Dialog dl = mDialogFragment.getDialog(); 
Button btn = dl.findViewbyid(R.id.btn); 
btn.setOnclicklistener(this); 
+1

謝謝您。我已經找到了這樣的解決方案。 \t \t \t \t buttonOk。setOnClickListener(新View.OnClickListener(){ \t @Override \t公共無效的onClick(查看視圖){ \t \t \t \t \t} \t} \t});但也許你的解決方案也起作用。無論如何,Thx! – Sandra

9

這是我使用的是對話的代碼執行(該對話框的實際GUI在佈局資源confirm_dialog.xml定義):

public class ConfirmDialog extends DialogFragment { 

    public static String TAG = "Confirm Dialog"; 

    public interface ConfirmDialogCompliant { 
     public void doOkConfirmClick(); 
     public void doCancelConfirmClick(); 
    } 

    private ConfirmDialogCompliant caller; 
    private String message; 

    public ConfirmDialog(ConfirmDialogCompliant caller, String message){ 
     super(); 
     this.caller = caller; 
     this.message = message; 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.confirm_dialog, container, false); 
     getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); 
     ((TextView) view.findViewById(R.id.textview_confirm)).setText(message); 
     ((Button) view.findViewById(R.id.ok_confirm_button)).setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // When button is clicked, call up to owning activity. 
       caller.doOkConfirmClick(); 
      } 
     }); 
     ((Button) view.findViewById(R.id.cancel_confirm_button)).setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // When button is clicked, call up to owning activity. 
       caller.doCancelConfirmClick(); 
      } 
     }); 
     return view; 
    } 

} 

該對話框使用以下行創建:

confirm_dialog = new ConfirmDialog(this, message); 
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG); 

接口定義用作確定調用者(Fragment或Activity)實現了處理控制器拋出的事件的方法。也就是說,調用此對話框的Fragment或Activity必須實現給定的接口。
也許有更好的解決方案,但這是我想出的。希望能幫助到你!

+0

像這樣設置onClickListener對我不起作用。它給了我錯誤。我找到了解決問題的辦法,並將其作爲對第一個答案的評論。無論如何,謝謝你的回覆。 – Sandra

+0

如果您正在從xml資源中擴展布局,這將起作用。如果您以編程方式創建佈局,那麼您需要在Button引用上調用setOnClickListener。 –

+0

是的,我也從onCreateView方法中的xml資源充氣佈局。我遇到的問題是:myButton.setOnClickListener(new OnClickListener(){}給我錯誤,所以解決方案是使用myButton.setOnClickListener(new View.OnClickListener(){}。我不知道爲什麼它沒有以這種方式認出我的聽衆,但它確實...... – Sandra

8

這裏是韓德爾取消按鈕點擊從FragmentDialog類的對話的示例:

我用android.support.v4.app.DialogFragment;

public class MyDialogFragment extends DialogFragment { 
    public MyDialogFragment(){}  
    public static String TAG = "info Dialog"; 
    Button btn; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.info_layout, container); 
     getDialog().requestWindowFeature(STYLE_NO_TITLE); 
     btn=(Button)view.findViewById(R.id.close_dialog_btn_info_layout); 
     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       getDialog().dismiss(); 
      } 
     }); 

     return view; 
    } 





} 
3

另一種選擇是讓你自定義的DialogFragment類實現OnClickListener。然後,您只需setOnClickListener即可查看您想要處理的點擊次數並獲取onClick中的點擊次數。

// 1. implement OnClickListener 
public class MyDialogFragment extends DialogFragment implements View.OnClickListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.my_dialog_layout, null); 

     // 2. set click listeners on desired views 
     view.findViewById(R.id.my_view_1).setOnClickListener(this); 
     view.findViewById(R.id.my_view_2).setOnClickListener(this); 


     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setView(view) 
       // ... 
     return builder.create(); 
    } 

    // 3. capture the clicks and respond depending on which view 
    @Override 
    public void onClick(View view) { 
     switch (view.getId()) { 
      case R.id.my_view_1: 
       // do something 
       break; 
      case R.id.my_view_2: 
       // do something 
       break; 
      default: 
       break; 
     } 
    } 
} 
1

它很容易在活動,但在DialogFragment中我們做了更多的代碼。

在這裏,我如何解決我的問題,鄰DialogFragment類裏面做你的蘆丁findView

btn_ocak = (Button) view.findViewById(R.id.btn_cal_ocak); 
    btn_subat = (Button) view.findViewById(R.id.btn_cal_subat); 
    btn_mart = (Button) view.findViewById(R.id.btn_cal_mart); 
    btn_nisan = (Button) view.findViewById(R.id.btn_cal_nisan); 


btn_ocak.setOnClickListener(this); 
    btn_subat.setOnClickListener(this); 
    btn_mart.setOnClickListener(this); 
    btn_nisan.setOnClickListener(this); 

實現的onClick OnClickListener到類

public class CalendarPopUp extends DialogFragment implements View.OnClickListener 

和你想要做什麼的onClick方法中,通過做這些我們激活了我們視圖的onClick事件

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.btn_cal_ocak: 
      seciliAy = "Ocak"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_subat: 
      seciliAy = "Subat"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_mart: 
      seciliAy = "Mart"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_nisan: 
      seciliAy = "Nisan"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_mayis: 
      seciliAy = "Mayıs"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_haziran: 
      seciliAy = "Haziran"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_temmuz: 
      seciliAy = "Temmuz"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_agustos: 
      seciliAy = "Agustos"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_eylul: 
      seciliAy = "Eylül"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_ekim: 
      seciliAy = "Ekim"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_kasim: 
      seciliAy = "Kasım"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_aralik: 
      seciliAy = "Aralık"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     default: 
      break; 
    } 
} 

,如果您想知道如何傳遞值,請按照以下步驟操作 clike_here