2012-08-24 18 views
7

में हैंडल बटन क्लिक करें मेरे पास डायगॉगफ्रैगमेंट है जो मेरे पास एक कस्टम लेआउट है जिसमें दो edittexts और दो बटन हैं - ठीक है और रद्द करें। लेआउट निर्दिष्ट करने के लिए ऑनक्रेट व्यू विधि का उपयोग करके मेरा संवाद ठीक दिखाता है, लेकिन मुझे नहीं पता कि बटन क्लिक को कैसे प्रबंधित किया जाए। ऑनक्रेट व्यू विधि के अंदर, button.setOnClickListener काम नहीं करता है। इसका एक आसान समाधान हो सकता है, लेकिन मैं कई घंटों तक फंस गया हूं। मैं सलाह या उदाहरण कोड की बहुत सराहना करता हूं।डायलॉगफ्रैगमेंट

पीएस मैं अलर्टडिअलॉग का उपयोग नहीं करना चाहता, क्योंकि इस मामले में ठीक बटन पर क्लिक करते समय, संवाद स्वचालित रूप से स्वयं को खारिज कर देता है, और मैं edittext पर एक सत्यापन नहीं कर सकता (उदाहरण: जब उपयोगकर्ता ठीक दबाता है बटन और edittext खाली हैं मैं नहीं चाहता कि संवाद गायब हो जाए)। इस तरह मैं एक कस्टम संवाद बनाने और आसानी से बटन व्यवहार का प्रबंधन करने के विकल्प के साथ गया था।

उत्तर

5

इन पंक्तियों

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

धन्यवाद। मुझे पहले से ही एक समाधान मिला है। \t \t \t \t बटन ओके।setOnClickListener (नई View.OnClickListener() { \t @Override \t सार्वजनिक शून्य onClick (देखें) { \t \t \t \t \t} \t} \t}); लेकिन शायद आपका समाधान भी काम करता है। वैसे भी Thx! – Sandra

9

यह एक संवाद मैं उपयोग कर रहा हूँ के लिए कोड है साथ करते हैं (संवाद के लिए वास्तविक जीयूआई लेआउट संसाधन 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); 

इंटरफ़ेस परिभाषा के रूप में प्रयोग किया जाता है के साथ बनाई गई है सुनिश्चित करें कि कॉलर (टुकड़ा या गतिविधि) नियंत्रक द्वारा फेंकने वाली घटनाओं को संभालने के तरीकों को लागू करता है। यही है, इस संवाद को बुलाए जाने वाले एक टुकड़े या गतिविधि को दिए गए इंटरफेस को लागू करना होगा।
शायद एक बेहतर समाधान है लेकिन यह मुझे पता चला है। आशा करता हूँ की ये काम करेगा!

+0

इस तरह ऑनक्लिक लिस्टनर को सेट करना मेरे लिए काम नहीं करता है। यह मुझे त्रुटियां दे दी। मुझे अपनी समस्या का हल मिला, और इसे पहले जवाब पर टिप्पणी के रूप में लिखा। वैसे भी आपकी प्रतिक्रिया के लिए धन्यवाद। – Sandra

+0

यह काम करता है यदि आप एक एक्सएमएल संसाधन से अपना लेआउट बढ़ा रहे हैं। यदि आप अपना लेआउट प्रोग्रामेटिक रूप से बना रहे हैं तो आपको अपने बटन संदर्भ पर टा कॉल कॉलऑनक्लिक लिस्टनर मिला है। –

+0

हां, मैं ऑनक्रेट व्यू विधि में एक XML संसाधन से एक लेआउट भी बढ़ाता हूं। मेरी समस्या यह थी कि: myButton.setOnClickListener (नया OnClickListener() {} मुझे त्रुटि दे रहा था, इसलिए समाधान myButton.setOnClickListener (नया View.OnClickListener() {} का उपयोग कर रहा था। मुझे नहीं पता कि यह क्यों नहीं हुआ इस तरह से मेरे श्रोता को पहचानें, लेकिन यह .. – Sandra

8

यहाँ एक FragmentDialog वर्ग से एक संवाद पर बटन पर क्लिक रद्द handel करने के लिए एक उदाहरण है:

मैं 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 को लागू करने देने के लिए है। फिर आप onClick में क्लिक को पकड़ने और पकड़ने के लिए जो भी विचार आप संभालना चाहते हैं, उसके लिए आप केवल setOnClickListener

// 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 वर्ग के अंदर अपने rutin 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); 

अपनी कक्षा

public class CalendarPopUp extends DialogFragment implements View.OnClickListener 

को लागू onClick OnClickListener और से, 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

संबंधित मुद्दे

 संबंधित मुद्दे