作为一个N00bie到Android,我正在尝试构建一个简单的地图应用程序。我开始在同一个班级做所有事情,但由于显而易见的原因而失控,快速。所以我想拆分类,基类作为活动的主流,子类作为'实用程序'类。
所以我实例化一个Subclass对象,并在子类的onCreate中开始调用方法。这些方法从未运行过。我究竟做错了什么?一旦我创建了子类对象,子onCreate应该触发,不是吗?而且,它甚至是在子类中执行此操作的聪明方式,而不是整个其他类?
提前致谢!
基类:
package com.example.TestMap;
import android.app.Activity;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
public class MyActivity extends Activity {
private GoogleMap mMap;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocationClass locationClass = new LocationClass();
}
public void setMap(){
Log.i("TestMap", "setMap");
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
mMap.setMyLocationEnabled(true);
}
public void setCamera(Location location) {
Log.i("TestMap", "setCamera");
final LatLng locationLatLng = new LatLng( (location.getLatitude() ), location.getLongitude() );
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(locationLatLng) // Sets the center of the map to Mountain View
.zoom(17) // Sets the zoom
.bearing(90) // Sets the orientation of the camera to east
.tilt(30) // Sets the tilt of the camera to 30 degrees
.build(); // Creates a CameraPosition from the builder
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
}
子类
package com.example.TestMap;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import java.util.List;
public class LocationClass extends MyActivity implements LocationListener {
private LocationManager locationManager;
private String provider;
private List<String> providers;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("TestMap", "LocationClass OnCreate");
GetProivder();
}
public void GetProivder (){
Log.i("TestMap", "LocationClass GetProivder");
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(2);
provider = locationManager.getBestProvider(criteria, false);
providers = locationManager.getProviders(true);
Location location = locationManager.getLastKnownLocation(provider);
Log.i("TestMap", "providerlist = " + providers);
Log.i("TestMap", "getBestProvider = " + provider);
Log.i("TestMap", "Location = " + location);
if (location != null) {
Log.i("TestMap", "Provider " + provider + " has been selected.");
super.setCamera(location);
super.setMap();
} else {
Log.i("TestMap", "location is null.");
}
}
@Override
public void onLocationChanged(Location location) {
Log.i("TestMap", "onLocationChanged");
}
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Log.i("TestMap", "onStatusChanged");
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Log.i("TestMap", "onProviderDisabled");
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
}
答案 0 :(得分:2)
您的代码
LocationClass locationClass = new LocationClass();
无法创建它。它只是它的一个对象,但它并没有与生命周期联系并调用方法。
您需要启动它以使其显示(并根据略读代码获取整个屏幕)。当你这样做时,Android会触发相应的方法调用。
像这样:
Intent intent = new Intent(this, LocationClass.class);
startActivity(intent);
可在此处找到更多信息:http://developer.android.com/training/basics/firstapp/starting-activity.html#StartActivity
它必须在你的清单中定义,否则会崩溃。您的代码中还有其他明显的奇怪之处,您希望LocationClass扩展MyActivity
而不是Activity
吗?你的LocationClass也没有在onCreate中调用setContentView(),所以你不会看到一个UI(据我所知),除非你想通过extends
部分。
编辑: 如果你扩展子类并把这个意图代码放在onCreate中,你可能会崩溃,因为它会在MyActivity中调用super()(再次调用onCreate(),因为它是超类),并且会继续做更多的意图来启动活动。如果那是“父”类,那么你不应该继承MyActivity的子类。
您应该只对子活动或全局父活动进行子类化(例如,在我的项目中,我扩展了SpiceActivity,因为它们都使用与Spice
相关的常见组件。)
答案 1 :(得分:0)
子类'onCreate
方法应该在Android创建时调用(参见Understanding the Lifecycle Callbacks),例如在发布对该Activity的Intent时就会发生。
编辑:我刚看到@Mgamerz回答并意识到你的超类Activity中的那一行是你试图让Android创建子类Activity的地方。下一段现在有些不相关,但请注意,您仍然需要将子类活动添加到清单文件中。
你确定你的应用程序实际上是在启动子类Activity,还是它仍在启动超类Activity?您可能需要查看项目的“AndroidManifest.xml”文件,并检查是否存在与子类Activity相对应的<activity />
元素。
如果超类具有可以/将被多个子类活动重用的功能,我认为将类拆分为超类和子类是明智的。例如,您可能有DirectionsActivity
和SearchActivity
等子类活动,这些活动具有由其超类MapActivity
提供的一些常见的地图相关活动。即使您现在只有一个子类Acitivty ,如果您认为以后可能会编写其他与地图相关的活动,那么拥有超类和子类仍然有意义。我认为将类分成超类和子类是不明智的,因为单个类太长了。如果你只想要一个帮助器类,并且你不希望将来有更多的MapActivity
子类,你可以在与Activity类相同的包中创建一个MapUtils
类,这将定义一些static
辅助方法。例如,您可以将GetProvider
方法放入这样的帮助程序类中。 Sketch示例(请注意MapHelper
的 package-private 访问权限):
class MapHelper {
static Location getProvider() {
// ...
return location;
}
// Other helper methods here
}
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
setCamera(MapHelper.getProvider());
setMap();
}
// Other activity methods here
}