2

我有一个在单独的类中接收 SMS 的处理程序。执行处理程序时如何使其更改视图元素?

这是我的代码:

public class MainActivity extends MapActivity {
    MapView mapView;
    MapController mc;
    GeoPoint p;
    private int carNumber;
    private String langt;
    private String longt;
    CheckedTextView text;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SmsReceiver smsreceiver = new SmsReceiver();
                draw();
    }

    public void draw() {
        mapView = (MapView) findViewById(R.id.mapView);
        LinearLayout zoomLayout = (LinearLayout) findViewById(R.id.zoom);
        @SuppressWarnings("deprecation")
        View zoomView = mapView.getZoomControls();

        zoomLayout.addView(zoomView, new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        mapView.displayZoomControls(true);
        mc = mapView.getController();

        double lat = Double.parseDouble("31.977185185185185");
        double lng = Double.parseDouble("35.205925925925925");

        p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));

        mc.animateTo(p);
        mc.setZoom(17);
        MapOverlay mapOverlay = new MapOverlay();
        List<Overlay> listOfOverlays = mapView.getOverlays();
        listOfOverlays.clear();
        listOfOverlays.add(mapOverlay);

        mapView.invalidate();
    }
}
}

这是 SMS Receiver 类:

public class SmsReceiver extends BroadcastReceiver {
    MapView mapView;
    MapController mc;
    GeoPoint p;
    private int carNumber;
    private String langt;
    private String longt;
    CheckedTextView text;

    public SmsReceiver(MapView mapView) {
        this.mapView = mapView;
    }
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

    @SuppressLint("NewApi") @Override
    public void onReceive(final Context context, final Intent intent) {
        if (intent != null && SMS_RECEIVED.equals(intent.getAction())) {
            final SmsMessage smsMessage = extractSmsMessage(intent);
            processMessage(context, smsMessage);
        }
    }

    @SuppressLint("NewApi") private SmsMessage extractSmsMessage(final Intent intent) {
        final Bundle pudsBundle = intent.getExtras();
        final Object[] pdus = (Object[]) pudsBundle.get("pdus");
        final SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]);

        return smsMessage;
     }
}

我想修改类MapView里面SmsReceiver

谢谢你。

4

3 回答 3

2

定义一个接口并使用回调让活动知道已收到一条短信。

public Interface SmsReceivedListener {
    void onSmsReceived(int arg1, string arg2); ..<----add arguments you want to pass back
}

在您的短信课程中

ArrayList<SmsReceivedistener> listeners = new ArrayList<SmsReceivedistener>();

...

public void setSmsReceivedistener(SmsReceivedistenerlistener){
    listeners.add(listener);
}

当您收到短信时

for (SmsReceivedistener listener:listeners){
   listener.onSmsReceived(arg1, arg2);
}

在您的活动中:

public class MainActivity extends MapActivity implements SmsReceivedListener {

...

@Override
public void onCreate(Bundle savedInstanceState) 
{
    ...
    smsReceiver.setSmsReceivedistener(this);
    ...
}

public void onSmsReceived(int arg1, string arg2){
   // do whatever you need to do
}

全部来自记忆,所以请原谅拼写错误,您应该通过添加 removeSmsReceivedistener 并检查您没有在 setSmsReceivedistener 中两次添加相同的侦听器来改进 SMS 类。

笔记。因为您使用接口,所以任何类(不仅仅是 Activity)都可以实现它,因此您可以在应用程序的任何位置进行更新。smsReceiver 类不知道也不关心。它只是调用侦听器,如果有的话。

于 2013-01-17T21:47:52.973 回答
1

试试这个

TextView bt1 =m_activity.findViewById(R.id.textview1);

在上面的示例中,视图 bt1 来自另一个类。您可以使用类实例访问 bt1 并获取 id。现在,对 bt1 实例做任何您想做的事情。

注意:确保 bt1 在另一个类中是公开的

于 2017-12-12T11:56:41.973 回答
0

将此添加到您的 onReceive() 方法中:

if (context instanceof MainActivity) {
    //modify the map 
    ((MainActivity)context).findViewById(...);
}
于 2013-01-17T21:45:33.633 回答