2012-09-03 16 views
6

EDITChiamata registerReceiver da un DialogFragment

Ho aggiunto questa linea:

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

V'è ora un errore di runtime, però, l'errore si legge:

09-03 04:12 : 41.856: E/AndroidRuntime (1692): java.lang.IllegalStateException: Impossibile trovare un metodo sendMessage (View) nella classe di attività android.view.ContextThemeWrapper per il gestore onClick sulla classe di visualizzazione android.widget.ImageView con id 'bu tton_send'

La mia domanda sarebbe: Perché dovrebbe essere alla ricerca per il metodo in android.view.ContextThemeWrapper?

Il pulsante viene creato il layout si fa riferimento on line:

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

e il "button_send" è un metodo onClick impostato come:

android:onClick="sendMessage" 

che viene poi definito come:

L'errore di runtime si verifica quando si fa clic sul pulsante per inviare il messaggio.

FINE EDIT

EDIT Number Two

A quanto pare non è possibile definire il metodo onClick all'interno del vostro XML dal momento che il pulsante è parte del frammento. In questo caso, ho dovuto impostare un onClickListener

Problema FISSO, grazie!

Così sto provando a creare un DialogFragment che semplicemente invia un nuovo messaggio di testo. La finestra di dialogo ha due viste EditText, una per il numero di telefono e una per il messaggio effettivo; ha anche 1 ImageButton che ha un metodo onClick chiamato sendMessage (View v). Detto questo, sto riscontrando problemi nella registrazione di un ricevitore per catturare il codice del risultato quando il messaggio viene inviato. Il messaggio di errore è:

"Il metodo registerReceiver (nuova BroadcastReceiver() {}, IntentFilter) è definito per il tipo ComposerDialog"

con esattamente gli stessi blocchi di codice, ad eccezione onCreateView(), posso fare questo lavoro su un'attività, ma apparentemente non su un DialogFragment . La mia ipotesi è che sulla linea:

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

chiamando getActivity(), sto passando un dialogo come il contesto, ea quanto pare questo non è un parametro della chiamata a registerReceiver riconosce on line:

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

Sto pensando a come modificare il contesto che ho passato alla chiamata registerReceiver, ma non sono nemmeno sicuro che sia effettivamente il problema.Qualche idea?

Qui è la classe completa per una migliore prospettiva:

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();   
    } 

}

risposta

16

uso

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

registerReceiver è un metodo di contesto che non è presente in DialogFragment

+0

Che ha funzionato, puoi spiegare cosa è successo per favore? :) –

+0

come ho detto che il metodo è presente nel contesto che è esteso da Activity e ma non è presente in DialogFragment. Quindi devi ottenere l'istanza del contesto che puoi ottenere tramite getActivity – nandeesh

+0

Grazie, non ho notato la modifica: P –

0

Fai qualcosa come

@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); 
    } 

e inviare broadcast come. Questo viene inviato da AsyncTask con il contesto dell'applicazione

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); 
} 
Problemi correlati