J'ai du mal à décharger les tâches de la méthode principale Activities OnCreate vers une autre classe pour faire le gros du travail.
Lorsque j'essaye d'appeler getSystemService à partir de la classe non-Activity, une exception est levée.
Toute aide serait grandement appréciée :)
lmt.java:
package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;
public class lmt extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
fyl lfyl = new fyl();
Location location = lfyl.getLocation();
String latLongString = lfyl.updateWithNewLocation(location);
TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
myLocationText.setText("Your current position is:\n" + latLongString);
}
}
fyl.java
package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.content.Context;
public class fyl {
public Location getLocation(){
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(context);
String provider = LocationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(provider);
return location;
}
public String updateWithNewLocation(Location location) {
String latLongString;
if (location != null){
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "Lat:" + lat + "\nLong:" + lng;
}else{
latLongString = "No Location";
}
return latLongString;
}
}
Réponses:
Vous devez transmettre votre contexte à votre classe fyl.
Une solution est de créer un constructeur comme celui-ci pour votre
fyl
classe:Donc, dans votre classe d'activité, créez l'objet de fyl en
onCreate
fonction comme ceci:la source
lmt
classe ne sera pas exécutée, alorsfly
n'aura pas de contextegetSysytemService()
n'accepteString
que comme paramètre. Par conséquent, vous ne pouvez pas lui passer de contexte. Comment puis-je contourner cela? @HuntBluetoothManager
,ActivityManager
etc.) sont également construits de cette façon (ne passant pas nécessairement unActivity
contexte à leur constructeur) et c'est pourquoi ils peuvent accéder aux composants dans la portée de l'application.Vous pouvez opter pour ceci:
la source
ArrayAdapter
.Une façon de contourner ce problème est de créer une classe statique pour les instances. Je l'ai beaucoup utilisé en AS3, j'ai aussi très bien travaillé pour moi dans le développement Android.
Config.java
MyApp.java
Vous pouvez ensuite accéder au contexte ou en utilisant
Config.context
la source
private static MyApp _context;
public static MyApp getContext() { return _context; }
... en onCreate:_context = this;
en onStop:_context = null;
... Utilisation:MyApp.getContext()
.Je ne sais pas si cela aidera, mais j'ai fait ceci:
la source
Pour certaines classes sans activité, comme Worker , vous disposez déjà d'un objet Context dans le constructeur public.
Vous pouvez simplement l'utiliser, par exemple, l'enregistrer dans une variable de contexte privée dans la classe (par exemple,
mContext
), puis, par exemplela source