編集
私はこの行を追加しました:
getActivity().registerReceiver(new BroadcastReceiver(){...}, new IntentFilter(SENT));
ただし、ランタイムエラーが発生しましたが、エラーは次のようになります。
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);
「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();
}
メッセージを送信するボタンがクリックされると、ランタイムエラーが発生します。
編集終了
番号2を編集
ボタンはフラグメントの一部であるため、XML内でonClickメソッドを定義できないようです。この場合、onClickListenerを設定する必要がありました
問題は修正されました、ありがとう!
そこで、新しいテキストメッセージを送信するだけのDialogFragmentを作成しようとしています。ダイアログには2つのEditTextビューがあります。1つは電話番号用で、もう1つは実際のメッセージ用です。また、sendMessage(View v)と呼ばれるonClickメソッドを持つ1つのImageButtonがあります。そうは言っても、メッセージの送信時に結果コードをキャッチするために受信者を登録する際に問題が発生します。エラーメッセージは次のとおりです。
「メソッドregisterReceiver(new BroadcastReceiver(){}、IntentFilter)は、ComposerDialogタイプに対して未定義です。」
onCreateView()を除いて、まったく同じコードブロックを使用して、これをActivityで機能させることができますが、DialogFragmentでは機能しないようです。私の推測では、次のようになっています。
PendingIntent sentPI = PendingIntent.getBroadcast(getActivity(), 0,
new Intent(SENT), 0);
getActivity()を呼び出すことにより、コンテキストとしてDialogを渡しますが、これは明らかに、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();
}
}