ИЗМЕНИТЬ
Я добавил эту строку:
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();
}
}