2013-01-17 31 views
1

我有一个在单独的类中接收SMS的处理程序,如何在处理程序执行时更改视图元素?如何操作Android中另一个类的视图?

这里是我的代码:

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接收器类

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; 

} 


} 

我想修改SMSReceiver类中的地图视图。

谢谢。

回答

1

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

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 
} 

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

注意。因为你使用了一个接口,任何类(不只是一个Activity)都可以实现它,所以你可以在应用程序的任何地方更新。 smsReceiver类不知道或关心。它只是调用听众,如果有任何注册。

+0

这听起来不错,但有一个问题,即时通讯,当我第一次通过听者不为空,但是当的onReceive处理程序被调用时,听众证明为空是怎么回事? –

+0

请发布代码。 – Simon

+0

亲爱的西蒙,代码是在这个链接http://stackoverflow.com/questions/14396829/android-reference-to-activity-object-in-another-class-becomes-null –

0

添加到您的onReceive()方法:

if (context instanceof MainActivity) { 
    //modify the map 
    ((MainActivity)context).findViewById(...); 
} 
0

试试这个

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

在上面的例子,其中图BT1是从另一个class.you可以通过使用类实例访问BT1和获得id.Now,你想与BT1实例做什么都。

注意:确保BT1是另一个类的公共

相关问题