我有以下代码。这是我使用Map片段的类,但我需要在其他类中使用这些方法。
public class FragmentMap extends Fragment {
private LocationManager locationManager;
private Location myLocation;
private Location getBestLocation() {
Location gpslocation = getLocationByProvider(LocationManager.GPS_PROVIDER);
Location networkLocation =
getLocationByProvider(LocationManager.NETWORK_PROVIDER);
if (gpslocation == null) {
return networkLocation;
}
if (networkLocation == null) {
return gpslocation;
}
long old = System.currentTimeMillis() - 1000;
boolean gpsIsOld = (gpslocation.getTime() < old);
boolean networkIsOld = (networkLocation.getTime() < old);
if (!gpsIsOld) {
return gpslocation;
}
if (!networkIsOld) {
return networkLocation;
}
if (gpslocation.getTime() > networkLocation.getTime()) {
return gpslocation;
} else {
return networkLocation;
}
}
private Location getLocationByProvider(String provider) {
Location location = null;
locationManager = (LocationManager) getActivity().getApplicationContext()
.getSystemService(Context.LOCATION_SERVICE);
try {
if ( locationManager.isProviderEnabled(provider) ) {
location = locationManager.getLastKnownLocation(provider);
}
} catch (IllegalArgumentException e) {
Log.d("FragmentMap", "Cannot access Provider " + provider);
}
return location;
}
public String getCity(){
String result = "";
Geocoder gcd = new Geocoder(getActivity(), Locale.getDefault());
try {
List<Address> addresses = gcd.getFromLocation(myLocation.getLatitude(), myLocation.getLongitude(), 1);
if (addresses.size() > 0){
result = addresses.get(0).getLocality();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
我需要在3个班级中使用它。如何编写一次并在任何地方使用它,所以我不必在每个类中复制它。据我所知,我应该使用public static
。但是java并不允许我这样做。
我想看看实现这类事情的最佳实践是什么。
谢谢。
答案 0 :(得分:2)
首先,您似乎没有定义类。即使您只需要静态方法,也必须创建一个类:
public class MyClass {
[...]
}
现在,您在此处使用非静态属性:
private Location myLocation;
所以你不能在静态方法中使用它。
问问自己将此属性设置为非静态是否有意义(它是否依赖于类实例,还是应该由所有实例共享?)
如果您选择非静态选项,它将变为:
public class MyClass {
//Useless because you are only using a static field of this class.
//private LocationManager locationManager;
//Static attributes must be named with UPPER CASE letters
private static Location MY_LOCATION;
private static Location getBestLocation() {
private static Location getLocationByProvider(String provider) {
...
}
public static String getCity(){
...
}
}
答案 1 :(得分:0)
有几种方法:
a)您可以使用类来访问公共静态方法。不确定你为什么要面对它的问题
b)您可以在清单中声明一个应用程序类,并在应用程序类中添加这些方法。可以从所有活动和片段访问应用程序类。有关应用程序类的更多详细信息,请访问http://developer.android.com/reference/android/app/Application.html
c)您可以声明一个扩展Activity类的基类,并在此处添加您的方法。稍后,您可以通过扩展此基类来创建所有新活动,从而可以访问这些位置检索方法。这样甚至片段都可以访问这些方法。
答案 2 :(得分:0)
您可能错过了基类...
示例:
class myLocationClass {
public static Location getBestLocation() {..}
public static Location getLocationProvider() {...}
public static String getCity {...}
}
然后直接通过该类使用:
myLocationClass.getBestLocation()
或myLocationClass.getLocationProvider()
或myLocationClass.getCity
答案 3 :(得分:0)
有几种方法可以解决这个问题。 Application
类是一个单例,因此您可以在那里使用公共方法,并从可以获得Context
的任何位置访问它。更好的方法是使用像Otto这样的总线,并在您希望提供位置更新的位置订阅它。