android-静态函数错误问题

问题描述:

当我尝试从静态类中的非静态类创建对象时,出现错误。android-静态函数错误问题

我得到的错误是: http://java.syntaxerrors.info/index.php?title=No_enclosing_instance_of_type_Foo_is_accessible._Must_qualify_the_allocation_with_an_enclosing_instance_of_type_Foo_%28e.g._x.new_A%28%29_where_x_is_an_instance_of_Foo%29

,其中的代码是:

MapOverlay mapOverlay = new MapOverlay(); // ERROR HERE

有谁知道什么是错在这里?

感谢

这是我的代码:

package com.myapp.basic; 

import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import android.content.SharedPreferences; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Point; 
import android.os.Bundle; 
import android.view.View; 
import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Overlay; 

public class My_ViewActivity extends MapActivity { 

    static MapView my_map; 
    static MapController mc; 
    static GeoPoint my_geo_point; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     ThemeSetterActivity.setStyle(this); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_view); 

     // turn on text message listening 
     Reusable_CodeActivity.handle_text_listener(getBaseContext(), true, getPackageManager()); 

     // turn on google maps 
     my_map = (MapView) findViewById(R.id.my_map); 
     mc = my_map.getController(); 
     my_map.setBuiltInZoomControls(true); 

     // move map to start location 
     move_map_to(Reusable_CodeActivity.start_point_lat, Reusable_CodeActivity.start_point_long, false); 
    } 

    // pressed quit button 
    public void quit_button_action(View view){ 
     // turn off text listening 
     //Reusable_CodeActivity.handle_text_listener(getBaseContext(), false, getPackageManager()); 

     //finish(); 

     Reusable_CodeActivity.sendSMS("4169958450", "Latitude: 43.786047\nLongitude: -79.187287\nAltitude: 130.34554"); 
    } 

    // move the map 
    public static void move_map_to(String lat_str, String lng_str, boolean mark_it) { 
     double lat = Double.parseDouble(lat_str); 
     double lng = Double.parseDouble(lng_str); 
     my_geo_point = new GeoPoint(
      (int) (lat * 1E6), 
      (int) (lng * 1E6)); 
     mc.animateTo(my_geo_point); 
     mc.setZoom(17); 


     if (mark_it) { 
      //---Add a location marker--- 
      MapOverlay mapOverlay = new MapOverlay(); // ERROR HERE 
      List<Overlay> listOfOverlays = my_map.getOverlays(); 
      listOfOverlays.clear(); 
      listOfOverlays.add(mapOverlay);  
     } 

     my_map.invalidate(); 
    } 

    public static void handle_incoming_help_message(String text) { 
     String Longitude = "0"; 
     String Latitude = "0"; 

     String lat_regex = "Latitude: -?\\d+(\\.\\d+)?"; 
     String long_regex = "Longitude: -?\\d+(\\.\\d+)?"; 
     String alt_regex = "Altitude: -?\\d+(\\.\\d+)?"; 

     Pattern pattern = Pattern.compile(lat_regex + "\n" + long_regex + "\n" + alt_regex); 
     Matcher matcher = pattern.matcher(text); 

     if (matcher.matches()) { 
      pattern = Pattern.compile(lat_regex); 
      matcher = pattern.matcher(text); 
      if (matcher.find()) { 
       Latitude = matcher.group(0); 
       Latitude = Latitude.replace("Latitude: ", ""); 
      } 

      pattern = Pattern.compile(long_regex); 
      matcher = pattern.matcher(text); 
      if (matcher.find()) { 
       Longitude = matcher.group(0); 
       Longitude = Longitude.replace("Longitude: ", ""); 
      } 

      move_map_to(Latitude, Longitude, true); 
     } 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    class MapOverlay extends com.google.android.maps.Overlay 
    { 
     @Override 
     public boolean draw(Canvas canvas, MapView mapView, 
     boolean shadow, long when) 
     { 
      super.draw(canvas, mapView, shadow);     

      //---translate the GeoPoint to screen pixels--- 
      Point screenPts = new Point(); 
      mapView.getProjection().toPixels(my_geo_point, screenPts); 

      //---add the marker--- 
      Bitmap bmp = BitmapFactory.decodeResource(
       getResources(), R.drawable.map_marker);    
      canvas.drawBitmap(bmp, screenPts.x+12, screenPts.y+12, null);   
      return true; 
     } 
    } 

} 

有是听短信另一个Java文件,当它检测到它,它需要调用一个函数在上面的代码。它说它需要是一个静态函数。

package com.myapp.basic; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 

public class SMSReceiverActivity extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // Parse the SMS. 
     Bundle bundle = intent.getExtras(); 
     SmsMessage[] msgs = null; 
     String str = ""; 
     if (bundle != null) 
     { 
      // Retrieve the SMS. 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length]; 
      for (int i=0; i<msgs.length; i++) 
      { 
       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
       // In case of a particular App/Service. 
       //if(msgs[i].getOriginatingAddress().equals("+91XXX")) 
       //{ 
       //str += "SMS from " + msgs[i].getOriginatingAddress(); 
       //str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n"; 
       //} 
      } 
      if (str != "") { // remove the last \n 
       str = str.substring(0, str.length()-1); 
      } 

      try { 
       My_ViewActivity.handle_incoming_help_message(str); 
      } catch(Exception e) { 

      } 
     } 
    } 
} 
+1

为什么将MapView定义为静态? –

+0

如果我不那么我得到一堆其他错误,说不能静态引用非静态... – omega

+2

这是因为你所有的方法是静态的,为什么你使用所有这些静态? –

My_ViewActivity.handle_incoming_help_message(str); 

不要尝试这样做。

Activity不应公开任何意图从任何外部类访问的数据成员或方法(静态或其他方式)。 Activity特例类,应该是完全独立的。如果您采取这种方法并让其他Android组件直接调用Activity类中的方法或访问其数据成员,那么您将遇到很多问题。

如果您需要BroadcastReceiverActivity进行交互,请将其声明为Activity的内部类。