2012-09-11 15 views
10

के तेज क्लिक पर दो बार खुला खोलें मेरे पास Button है, जो क्लिक करके, Dialog प्रदर्शित करता है। सब कुछ एक आकर्षण की तरह काम करता है, लेकिन अगर मैं बटन को डबल क्लिक करता हूं या बटन को तेज़ी से क्लिक करता हूं, तो Dialog दो या तीन बार खुलता है। मुझे Dialog को खारिज करने के लिए दो बार या तीन बार बैक बटन पर क्लिक करना होगा।बटन

मैं अतः पर संबंधित प्रश्नों के लिए खोज की है, लेकिन उत्तर के सबसे बटन को अक्षम करने या एक चर का उपयोग करने और सच्चे और झूठे को स्थापित है, जो मेरी आवश्यकता नहीं है सुझाव देते हैं।

अगर कोई इस समस्या को हल करने के बारे में जानता है, तो कृपया मेरी मदद करें।

कोड मैं

// Delete item on click of delete button 
holder.butDelete.setOnClickListener(new OnClickListener() {   
@Override 
    public void onClick(View v) { 
     Dialog passwordDialog = new Dialog(SettingsActivity.this);  
     passwordDialog.show(); 
    } 
}); 
+0

कैसे() 'सिंक्रनाइज़ onClick अंदर' कोड बनाने, और के लिए एक जांच डाल अगर संवाद पहले से खुला है के बारे में। –

+0

मेरे अद्यतन उत्तर को देखें .. – user370305

+1

Dayuuuum! आप प्रोसेसर की तुलना में बहुत तेज हैं;) – waqaslam

उत्तर

10

तुम बस जाँच करने के लिए कि क्या आपके Dialog पहले से ही दिखाया गया है या नहीं:

Dialog passwordDialog = new Dialog(SettingsActivity.this); 
holder.butDelete.setOnClickListener(new OnClickListener() {   
    @Override 
    public void onClick(View v) {     
     if(!passwordDialog.isShowing()) { 
      passwordDialog.show(); 
     } 
    } 
}); 

अद्यतन:

यदि यह नहीं करता है ' तब आपके मामले में काम नहीं करते हैं अपनी गतिविधि में विश्व स्तर पर घोषित:

Dialog passwordDialog = null; 

और Button के क्लिक पर:

holder.butDelete.setOnClickListener(new OnClickListener() {   
    @Override 
    public void onClick(View v) {     
     if(passwordDialog == null) { 
      passwordDialog = new Dialog(SettingsActivity.this); 
      passwordDialog.show(); 
     } 
    } 
}); 
+0

मैंने इसका इस्तेमाल किया ... यह काम करता है लेकिन कभी-कभी तेज़ क्लिक पर यह दो बार संवाद दिखाता है ... यही कारण है कि मैंने सवाल पोस्ट किया। – Rahul

+0

लेकिन मेरे संवाद पासवर्ड में डायलॉग एक स्थानीय चर है ... जैसा कि मैंने केवल एक ही स्थान पर उपयोग किया है, इसलिए मैं इसे वैश्विक रूप से – Rahul

+0

ठीक नहीं घोषित करता हूं ... मैं कोशिश करूंगा और आपको बता दूंगा। – Rahul

0

का इस्तेमाल किया है बटन अक्षम एक बार आप इसे क्लिक किया और एक बार आप संवाद को रद्द फिर से सक्षम करें। की तरह नीचे

holder.butDelete.setOnClickListener(new OnClickListener() 
      {   
       @Override 
       public void onClick(View v) 
       { 
        holder.butDelete.setEnabled(false); 
        Dialog passwordDialog = new Dialog(SettingsActivity.this);  
        passwordDialog.show(); 
       } 
      }); 

अगर यह काम नहीं किया तो आप एक बूलियन चर लेने के लिए और का उपयोग करें कि दिखाने के लिए और संवाद को रद्द करने के लिए है।

+0

मुझे नहीं लगता कि आप मेरे प्रश्न को पढ़ते हैं ... मैंने इसके बारे में बोल्ड लेटर में लिखा है। – Rahul

+0

ओह क्षमा करें, मैंने उसे नहीं देखा। – sankar

0

आपको शायद onCreateDialog() विधि ओवरराइड करके और showDialog() पर कॉल करके, अपने गतिविधि द्वारा प्रबंधित किया जाना चाहिए। इससे आपकी समस्या हल हो जाएगी।

गतिविधि के द्वारा आप के लिए संवाद है कि प्रबंधित कर रहे हैं (बचाया और बहाल) बनाने के लिए देखें http://developer.android.com/reference/android/app/Activity.html#onCreateDialog(int, android.os.Bundle)

कॉलबैक। डिफ़ॉल्ट कार्यान्वयन संगतता के लिए क्रिएटडिअलॉग (int) पर कॉल करता है। यदि आप HONEYCOMB को लक्षित कर रहे हैं या बाद में, इसके बजाय डायलॉग फ़्रेगमेंट का उपयोग करने पर विचार करें।

उदाहरण:

public class TestActivity extends Activity { 

private static final int TEST_DIALOG_ID = 1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    showDialog(TEST_DIALOG_ID); 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    if(id == TEST_DIALOG_ID) { 
     Dialog passwordDialog = new Dialog(this);  
     return passwordDialog; 
    } 
    return super.onCreateDialog(id); 
} 

} 
+0

क्या आप मुझे एक उदाहरण के साथ दिखा सकते हैं ........ – Rahul

+0

मेरे संपादन में कोड देखें – fiddler

+0

शोडियलॉग बहुत अच्छा काम करता है, लेकिन इसे हटा दिया गया है। –

-1

इस तरह की कोशिश ...

Dialog passwordDialog = new Dialog(SettingsActivity.this); 


holder.butDelete.setOnClickListener(new OnClickListener() 
{   
      @Override 
      public void onClick(View v) 
      {       
       if(!passwordDialog.isShowing()) { 
        passwordDialog.show(); 
       } 
      } 
}); 
+0

यह कभी काम नहीं करेगा, 'passwordDialog.isShowing() 'हर बार एक ताजा बनाया उदाहरण पर बुलाया जाता है। –

3

आप वास्तव में FragmentManager का उपयोग करना चाहिए दिखाने के लिए संवादफहमी।तो यह एक विशिष्ट टैग किए गए के बारे में पूछताछ करने के लिए dialogFragment अगर fragmentManager जानता है आसान हो जाएगा:

public static ItemEditDialogFragment newInstance(Item o) { 
    ItemEditDialogFragment df = new ItemEditDialogFragment(); 

    Bundle args = new Bundle(); 
    args.putParcelable(ARG_INSTANCE, o); 
    df.setArguments(args); 

    return df; 
} 
+1

काम नहीं करता है, अगर समय के बिना दो बार बुलाया जाता है, तो FragmentManager अभी तक संवाद नहीं जान पाएगा। – Frank

6

विश्व स्तर पर घोषित:

Fragment foundFragment = getFragmentManager().findFragmentByTag("myItemEditDialogFragment"); 
if (foundFragment == null) { 
    DialogFragment df = ItemEditDialogFragment.newInstance(o); 
    df.setTargetFragment(this, 0); 
    df.show(getFragmentManager().beginTransaction(), "myItemEditDialogFragment"); 
} 

यह वही है DialogFramgnet स्थिर newInstance विधि लगता है कि है

private Boolean dialogShownOnce = false; 
private mDialog dia; 

जहां आपके dialog.show(); कहा जाता है:

dia = new mDialog(getContext()); 

if (!dia.isShowing() && !dialogShownOnce) { 
    dia.show(); 
    dialogShownOnce = true; 
} 

dia.setOnDismissListener(new DialogInterface.OnDismissListener() { 
    @Override 
    public void onDismiss(DialogInterface dialog) { 
     dialogShownOnce = false; 
    } 
}); 

mDialog को वैश्विक होने की आवश्यकता नहीं है, लेकिन मैं कुछ स्थानीय-स्कोप इंटरफेस में mDialog.dismiss() पर कॉल कर रहा था।

अभी भी Boolean का उपयोग करता है, लेकिन मुझे नहीं पता कि इसका उपयोग क्यों नहीं किया जा सकता है।

0

इसे आजमाएं।

चरण 1. उदाहरण चर या वैश्विक चर

private MediaPlayerDialog dialog; 

चरण 2. अब आप में कोड के नीचे डाल दिया क्लिक btton के रूप में संवाद वस्तु घोषित।

if (dialog == null || (!dialog.isVisible())) { 
     dialog = new MediaPlayerDialog(); 
     dialog.setData(songListDatas, selectPosition); 
     dialog.show(getSupportFragmentManager(), dialog.getClass().getName().toString()); 
    } 

नोट:MediaPlayerDialogFragment आप अपनी आवश्यकता के अनुसार इसे बदल सकते हैं अपने कस्टम है।

लक

1

के सर्वश्रेष्ठ इस कोड को जहां संवाद दिखाना चाहते रखो, यह जाँच करता है अपने टैग नाम पर संवाद आधार मौजूद हैं।

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
Fragment prevFragment = getFragmentManager().findFragmentByTag("dialog"); 
if (prevFragment != null) { 
    return; 
} 

MyDialog dialog = MyDialog.newInstance(); 
dialog.show(ft, "dialog"); 
+0

कृपया हमेशा अपने कोड में स्पष्टीकरण जोड़ें। –