7

編集

私はこの行を追加しました:

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

}

4

2 に答える 2

16

使用する

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

registerReceiverDialogFragmentに存在しないContextのメソッドです

于 2012-09-03T05:45:46.523 に答える
0

次のようなことをします

@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);
}
于 2017-09-29T06:09:16.030 に答える