0

2 つのユーザー定義リストの SMS 操作の受信を処理する SMS アプリを作成しています。リストごとに、アクティビティと、favorite_list.xml や contact_list.xml などの xml ファイルを作成しました。これらの xml ファイル内には、2 つのトグル ボタンがあります。私がやろうとしているのは、SMS を受信するたびに、すべてのトグル ボタンの状態 (オン/オフ) を学習することです。

ここに私の SmsReceiver クラスがあります

import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ToggleButton;
import android.telephony.SmsMessage;

public class SmsReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;

        if (bundle != null)
        {
            //---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];    
            String str="";
            for (int i=0; i<msgs.length; i++){                                                  
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                str += "SMS from " + msgs[i].getOriginatingAddress();  
            }    
        }     
    }        
}

ボタンのステータスに到達するには findViewById() を使用する必要があることはわかっていますが、SmsReceiver はアクティビティから拡張されていないため、直接使用することはできません。これまでのところ、findViewByIdを使用しようとしたもの

1-コンテキストをアクティビティにキャスト

try{                    
    tb = (ToggleButton) ((Activity)context).findViewById(R.id.toggleButton3);
    if(tb.isChecked())
        Log.d("sms","SOUND-ON");
    else if(!tb.isChecked())
        Log.d("sms","SOUND-OFF");
}catch(Exception e){
    Log.d("sms","Error " + e);
}

それは java.lang.ClassCastException: android.app.ReceiverRestrictedContext を与えます

2- LayoutInflater を使用する

try{
    LayoutInflater mInf = LayoutInflater.from(context);
    View myView = mInf.inflate(R.layout.activity_favorite_list, null);
    tb = (ToggleButton) myView.findViewById(R.id.toggleButton3);
    if(tb.isChecked())
        Log.d("sms","SOUND-ON");
    else if(!tb.isChecked())
        Log.d("sms","SOUND-OFF");
}catch(Exception e){
    Log.d("sms","Error" + e);
} 

アプリの起動時にトグルボタンのステータスしか表示されないため、これも機能しません。助けてください、ありがとう。

4

2 に答える 2

1

2 つのアクティビティのそれぞれに がある場合ToggleButtonは、ステータスを変更するたびにアクティビティに書き込まれる 2 つの設定フィールドを使用できます。ではBroadcastReceiver、同じ設定フィールドを使用してToggleButtonのステータスを確認します。

ToggleButton2 つのアクティビティからのリストの各行に がある場合、すべての行からのすべての値を保持する別の構造を使用する必要がある同じアプローチのみを使用します (各行StringToggleButtonステータスが a で区切られた値になる a のように)区切り文字 () など|)。

于 2012-08-30T16:49:35.610 に答える
0

アクティビティ内のフィールドを使用BroadcastReceiverできるようにするにはBroadcastReceiver、アクティビティ内で匿名クラスを作成します。

     //within activity
          BroadcastReceiver receiver ;
          ToggleButton tb;

   //         within on create
    receiver =  new BroadcastReceiver(){
        public void onReceive(Context p1, Intent p2)
        {
                  // access tb here         
        }
    };
于 2012-08-30T17:53:44.107 に答える