Вызов registerReceiver из DialogFragment

ИЗМЕНИТЬ

Я добавил эту строку:

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

Однако теперь есть ошибка времени выполнения, ошибка гласит:

09-03 04:12:41.856: E/AndroidRuntime(1692): java.lang.IllegalStateException: не удалось найти метод sendMessage(View) в классе активности android.view.ContextThemeWrapper для обработчика onClick в классе представления android .widget.ImageView с идентификатором 'button_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();
    }

Ошибка выполнения возникает при нажатии кнопки для отправки сообщения.

КОНЕЦ РЕДАКТИРОВАНИЯ

ИЗМЕНИТЬ номер два

По-видимому, вы не можете определить метод onClick внутри своего XML, поскольку кнопка является частью фрагмента. В этом случае мне пришлось установить onClickListener

Проблема ИСПРАВЛЕНА, спасибо!

Итак, я пытаюсь создать DialogFragment, который просто отправляет новое текстовое сообщение. Диалог имеет два представления EditText, одно для номера телефона и одно для фактического сообщения; у него также есть 1 ImageButton, у которого есть метод onClick, называемый sendMessage (View v). С учетом сказанного у меня возникают проблемы с регистрацией получателя, чтобы поймать код результата при отправке сообщения. Сообщение об ошибке:

"Метод registerReceiver(new BroadcastReceiver(){}, IntentFilter) не определен для типа ComposerDialog"

С точно такими же блоками кода, за исключением onCreateView(), я могу заставить это работать с Activity, но, по-видимому, не с DialogFragment. Я предполагаю, что в строке:

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

вызывая getActivity(), я передаю диалог как контекст, и, по-видимому, это не параметр, который вызов registerReceiver распознает в строке:

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

Я думаю о том, как изменить контекст, который я передаю вызову registerReceiver, но я даже не уверен, что это действительно проблема. Есть идеи?

Вот полный класс для лучшей перспективы:

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

}


person daniel_c05    schedule 03.09.2012    source источник


Ответы (2)


использовать

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

registerReceiver - это метод Context, которого нет в DialogFragment.

person nandeesh    schedule 03.09.2012
comment
Это действительно сработало, можете ли вы объяснить, что произошло, пожалуйста? :) - person daniel_c05; 03.09.2012
comment
как я уже сказал, метод присутствует в контексте, который расширяется с помощью Activity, но отсутствует в DialogFragment. Итак, вам нужно получить экземпляр контекста, который вы можете получить через getActivity - person nandeesh; 03.09.2012
comment
Спасибо, я не заметил Edit: P - person daniel_c05; 03.09.2012
comment
Кроме того, имейте в виду, что Fragment не расширяет контекст, поэтому, очевидно, вы не можете передавать его методам в качестве параметра Context. - person Vaiden; 16.05.2013
comment
@Nandeesh Не могли бы вы сказать мне, где зарегистрировать этот приемник, как в действии, которое мы делаем в onResume ()? - person Zohra Khan; 21.01.2014
comment
@ZohraKhan Фрагмент также имеет onresume, так что вы можете зарегистрироваться через - person nandeesh; 23.01.2014

Сделайте что-нибудь вроде

@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);
}
person Qamar    schedule 29.09.2017