从DialogFragment调用registerReceiver

dan*_*c05 7 android fragment receiver

编辑

我添加了这一行:

getActivity().registerReceiver(new BroadcastReceiver(){...}, new IntentFilter(SENT));
Run Code Online (Sandbox Code Playgroud)

现在有一个运行时错误,错误如下:

09-03 04:12:41.856:E/AndroidRuntime(1692):java.lang.IllegalStateException:无法在视图类android.widget上的onClick处理程序的活动类android.view.ContextThemeWrapper中找到方法sendMessage(View). ID为"button_send"的ImageView

我的问题是:为什么要在android.view.ContextThemeWrapper中寻找方法?

该按钮是在我们在线引用的布局上创建的:

View view = inflater.inflate(R.layout.activity_composer, container);
Run Code Online (Sandbox Code Playgroud)

并且"button_send"的onClick方法设置为:

android:onClick="sendMessage"
Run Code Online (Sandbox Code Playgroud)

以后定义为:

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();
    }
Run Code Online (Sandbox Code Playgroud)

单击发送消息的按钮时会发生运行时错误.

编辑结束

编辑第二

显然,您无法在XML中定义onClick方法,因为该按钮是片段的一部分.在这种情况下,我不得不设置一个onClickListener

问题FIXED,谢谢!

所以我试图创建一个只发送新短信的DialogFragment.Dialog有两个EditText视图,一个用于电话号码,另一个用于实际消息; 它还有1个ImageButton,它有一个名为sendMessage(View v)的onClick方法.话虽如此,我在注册接收器时遇到问题,以便在发送消息时捕获结果代码.错误消息是:

"方法registerReceiver(new BroadcastReceiver(){},IntentFilter)未定义为ComposerDialog类型"

使用完全相同的代码块,除了onCreateView()之外,我可以在Activity上进行此工作,但显然不在DialogFragment上.我的猜测是在线:

PendingIntent sentPI = PendingIntent.getBroadcast(getActivity(), 0,
                new Intent(SENT), 0);
Run Code Online (Sandbox Code Playgroud)

通过调用getActivity(),我传递一个Dialog作为上下文,显然这不是一个对registerReceiver的调用在线识别的参数:

registerReceiver(new BroadcastReceiver(){...}, new IntentFilter(SENT));
Run Code Online (Sandbox Code Playgroud)

我正在考虑如何更改我传递给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();        
    }
Run Code Online (Sandbox Code Playgroud)

}

nan*_*esh 16

使用

getActivity().registerReceiver(new BroadcastReceiver(){...}, new IntentFilter(SENT));
Run Code Online (Sandbox Code Playgroud)

registerReceiver 是DialogFragment中不存在的Context方法

  • @ZohraKhan片段也有onresume,所以你可以注册thr (2认同)