2012-09-03 16 views
6

संपादितएक DialogFragment से registerReceiver कॉलिंग

मैं इस लाइन कहा:

getActivity().registerReceiver(new BroadcastReceiver(){...}, new IntentFilter(SENT)); 

अब एक रनटाइम त्रुटि यह है, त्रुटि पढ़ता है:

09-03 04:12 : 41.856: ई/एंड्रॉइड रनटाइम (16 9 2): java.lang.IllegalStateException: गतिविधि क्लास में मैसेज (व्यू) को नहीं मिला, android.view.ContextThemeWrapper ऑन क्लाइक हैंडलर ऑन क्लासिक एंड्रॉइड.विजेट.इमेज व्यू आईडी 'bu tton_send '

मेरा प्रश्न होगा: ऐसा क्यों है android.view.ContextThemeWrapper में विधि द्वारा खोजे जा रहे हैं?

View view = inflater.inflate(R.layout.activity_composer, container); 

और "button_send" एक onClick पद्धति के रूप में स्थापित किया है::

बटन लेआउट हम लाइन पर संदर्भित पर बनाई गई है

android:onClick="sendMessage" 

जो बाद में परिभाषित किया गया है के रूप में:

public void sendMessage (View v) { 
     String phoneNumber = number_input.getText().toString(); 
     String message = body_input.getText().toString(); 

     if(message.length() > 0) {    
      sendSMS(phoneNumber, message); 
      } 

     sendSMS(phoneNumber, message); 
     clearForm(); 
    } 

रनटाइम त्रुटि तब होती है जब संदेश भेजने के लिए बटन क्लिक किया जाता है।

संपादित

संपादित नंबर टू

का अंत जाहिर है कि आप अपनी XML अंदर onClick विधि को परिभाषित नहीं कर सकते हैं के बाद से बटन टुकड़ा का हिस्सा है। इस मामले में, मुझे ऑनक्लिक लिस्टनर

समस्या तय की गई थी, धन्यवाद!

तो मैं एक संवादप्रवाह बनाने की कोशिश कर रहा हूं जो बस एक नया टेक्स्ट संदेश भेजता है। संवाद में दो संपादन टेक्स्ट दृश्य हैं, एक फोन नंबर के लिए, और एक वास्तविक संदेश के लिए; इसमें 1 इमेजबटन भी है जिसमें एक ऑनक्लिक विधि है जिसे sendMessage (View v) कहा जाता है। इसके साथ ही, संदेश भेजने के दौरान परिणाम कोड को पकड़ने के लिए मुझे रिसीवर पंजीकृत करने में समस्याएं आ रही हैं। त्रुटि संदेश है:

"विधि registerReceiver (नई BroadcastReceiver() {}, IntentFilter) प्रकार ComposerDialog के लिए अपरिभाषित है"

वास्तव में कोड का एक ही ब्लॉक के साथ

, onCreateView() को छोड़कर, मैं कर सकते हैं यह गतिविधि एक गतिविधि पर है, लेकिन स्पष्ट रूप से डायलॉगफ्रैगमेंट पर नहीं है। मेरा अनुमान है कि लाइन पर:

PendingIntent sentPI = PendingIntent.getBroadcast(getActivity(), 0, 
       new Intent(SENT), 0); 

बुला getActivity(), मैं संदर्भ के रूप में एक संवाद गुजर रहा हूँ, और जाहिरा तौर पर है कि एक पैरामीटर registerReceiver करने के लिए कॉल लाइन पर पहचानता नहीं है द्वारा:

registerReceiver(new BroadcastReceiver(){...}, new IntentFilter(SENT)); 

मैं इस बारे में सोच रहा हूं कि मैं रजिस्ट्रार कॉल को पास करने वाले संदर्भ को कैसे बदलूं, लेकिन मुझे यह भी यकीन नहीं है कि वास्तव में समस्या है।कोई विचार?

यहाँ एक बेहतर परिप्रेक्ष्य के लिए पूरी कक्षा है:

package com.deadpixels.test.sms; 

import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.EditText; 

public class ComposerDialog extends DialogFragment { 

public ComposerDialog() { 
} 

private EditText body_input; 
private EditText number_input; 
SmsManager smsMgr = SmsManager.getDefault(); 
private static final String TAG = "Composer"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.activity_composer, container); 
     body_input = (EditText) view.findViewById(R.id.text_input); 
     number_input = (EditText) view.findViewById(R.id.text_address); 
     getDialog().setTitle("Create your new Message!"); 

     return view; 
    } 

    private void clearForm() { 
     body_input.setText(""); 
     number_input.setText(""); 
    } 

    public void sendMessage (View v) { 
     String phoneNumber = number_input.getText().toString(); 
     String message = body_input.getText().toString(); 

     if(message.length() > 0) {    
      sendSMS(phoneNumber, message); 
      } 

     sendSMS(phoneNumber, message); 
     clearForm(); 
    } 

    private void sendSMS(String phoneNumber, String message) 
    {   

     String SENT = "SMS_SENT"; 

     PendingIntent sentPI = PendingIntent.getBroadcast(getActivity(), 0, 
       new Intent(SENT), 0); 

     registerReceiver(new BroadcastReceiver(){ 

      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 
         Log.v(TAG, "SMS sent succesfully");      
         break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
         Log.v(TAG, "Generic failure"); 
         break; 
        case SmsManager.RESULT_ERROR_NO_SERVICE: 
         Log.v(TAG, "No service");       
         break; 
        case SmsManager.RESULT_ERROR_NULL_PDU: 
         Log.v(TAG, "Null PDU"); 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 
         Log.v(TAG, "Radio off");      
         break; 
       } 
      } 
     }, new IntentFilter(SENT)); 

     smsMgr.sendTextMessage(phoneNumber, null, message, sentPI, null);  
     clearForm();   
    } 

}

उत्तर

16

उपयोग

getActivity().registerReceiver(new BroadcastReceiver(){...}, new IntentFilter(SENT)); 

registerReceiver प्रसंग का एक तरीका है जिसके DialogFragment

में
+0

वास्तव में काम करता है, क्या आप समझा सकते हैं कि कृपया क्या हुआ? :) –

+0

जैसा कि मैंने कहा था कि विधि संदर्भ में मौजूद है जो गतिविधि द्वारा विस्तारित है और डायलॉग फ्रैगमेंट में मौजूद नहीं है। इसलिए आपको संदर्भ के उदाहरण प्राप्त करने की आवश्यकता है जिसे आप प्राप्त कर सकते हैं एक्टिविटी – nandeesh

+0

धन्यवाद, मैंने संपादन नहीं देखा: पी –

0

मौजूद नहीं है है कुछ करें

@Override 
    public void onResume() { 
     super.onResume(); 
     updateUiState(); 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(progressReceiver,new IntentFilter(EPackDownloader.ACTION_PROGRESS)); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(progressReceiver); 
    } 

और प्रसारण जैसे भेजें। यह AsyncTask से अनुप्रयोग संदर्भ

private void updateProgress() { 
    //publish progress 
    int progress = 100*(totalImageCount - (products.size() * 3 - (3 - (int)downLatch.getCount())))/totalImageCount; 
    publishProgress(progress); 
} 

@Override 
protected void onProgressUpdate(Integer... values) { 
    Intent data = new Intent(ACTION_PROGRESS); 
    data.putExtra("progress",values[0]); 
    data.putExtra("ePackId",ePackModel.id); 
    LocalBroadcastManager.getInstance(context).sendBroadcast(data); 
} 
संबंधित मुद्दे