2012-09-03 29 views
6

EDITARCalling registerReceiver de un DialogFragment

añadí esta línea:

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

En la actualidad existe un error de ejecución, sin embargo, lee el error:

09-03 04:12 : 41.856: E/AndroidRuntime (1692): java.lang.IllegalStateException: No se pudo encontrar un método sendMessage (Ver) en la clase de actividad android.view.ContextThemeWrapper para el controlador onClick en la clase de vista android.widget.ImageView con id 'bu tton_send'

Mi pregunta sería: ¿Por qué sería estar buscando el método de android.view.ContextThemeWrapper?

El botón se crea en la disposición que hace referencia en la línea:

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

y el "button_send" ha establecido un método onClick como:

android:onClick="sendMessage" 

que se define más adelante como:

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

El error de tiempo de ejecución ocurre cuando se hace clic en el botón para enviar el mensaje.

FIN DE EDITAR

EDITAR número dos

Al parecer, no se puede definir el método onClick dentro de su XML desde el botón es parte del fragmento. En este caso, tuve que configurar un onClickListener

Problema solucionado, gracias!

Intento crear un DialogFragment que simplemente envíe un nuevo mensaje de texto. El cuadro de diálogo tiene dos vistas de texto modificado, una para el número de teléfono y otra para el mensaje real; también tiene 1 ImageButton que tiene un método onClick llamado sendMessage (Ver v). Dicho esto, tengo problemas al registrar un receptor para captar el código de resultado cuando se envía el mensaje. El mensaje de error es:

"El registerReceiver método (nueva BroadcastReceiver() {}, IntentFilter) no está definido para el tipo ComposerDialog"

con exactamente los mismos bloques de código, exceptuando onCreateView(), que puede hacer este trabajo en una actividad, pero aparentemente no en un DialogFragment. Mi conjetura es que en la línea:

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

llamando getActivity(), yo estoy pasando un cuadro de diálogo como el contexto, y al parecer eso no es un parámetro de la llamada a registerReceiver reconoce en la línea:

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

Estoy pensando en cómo cambiar el contexto que paso a la llamada registerReceiver, pero ni siquiera estoy seguro de que ese sea realmente el problema.¿Algunas ideas?

Aquí es la clase completa para una mejor perspectiva:

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

}

Respuesta

16

uso

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

registerReceiver es un método de Contexto que no está presente en DialogFragment

+0

Eso realmente funcionó, ¿puede explicar lo que pasó, por favor? :) –

+0

como dije, el método está presente en contexto que se extiende por Actividad y no está presente en DialogFragmento. Por lo tanto, necesita obtener una instancia del contexto que pueda obtener a través de getActivity – nandeesh

+0

Gracias, no me di cuenta de la edición: P –

0

Haga algo como

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

y enviar la emisión como. Esto se envía desde AsyncTask teniendo contexto de aplicación

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); 
} 
Cuestiones relacionadas