2013-01-17 18 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是另一個類的公共

相關問題