- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 Android 应用程序,我想在加载 map 后立即放大。我收到以下错误:
java.lang.IllegalArgumentException: width and height must be > 0
这MapActivity - width and height must be > 0问题表明问题是 zoomIn() 方法在 onCreate() 方法中。但是当我把它放在 onResume() 方法中时,我得到了同样的错误。
我已经搜索了几个小时,但在 http://developer.android.com 上找不到任何相关信息。或其他任何地方...我也找不到获取 map 加载时间点的方法。 “MapLoadedListener”或类似的东西......
编辑这是我的代码:
public class AMap extends MapActivity{
private final String LOG_TAG = this.getClass().getSimpleName();
private Context mContext;
private Chronometer timer;
private TextView tvCountdown;
private RelativeLayout rl;
private MapView mapView;
private MapController mapController;
private List<Overlay> mapOverlays;
private PlayersOverlay playersOverlay;
private Drawable drawable;
private Builder endDialog;
private ContextThemeWrapper ctw;
private Handler mHandler = new Handler();
private Player player = new Player();
private StartTask startTask;
private EndTask endTask;
private MyDBAdapter mdba;
private Cursor playersCursor;
private UpdateBroadcastReceiver r;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_view);
mContext = AMap.this;
// set map
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapView.setFocusable(true);
// find the relative layout
rl = (RelativeLayout) findViewById(R.id.rl);
// set the chronometer
timer = (Chronometer) findViewById(R.id.tv_timer);
timer.setBackgroundColor(Color.DKGRAY);
// set the countdown textview
tvCountdown = (TextView) findViewById(R.id.tv_countdown);
// Open DB connection and get players Cursor
mdba = new MyDBAdapter(mContext);
mdba.open();
playersCursor = mdba.getGame();
// Get this player's id and location
Intent starter = this.getIntent();
player.setId(starter.getIntExtra("id", 0));
player.setLatitude(starter.getDoubleExtra("lat", 0));
player.setLongitude(starter.getDoubleExtra("lon", 0));
// Set this player's location as map's center
GeoPoint geoPoint = new GeoPoint((int) (player.getLatitude()*1E6), (int) (player.getLongitude()*1E6));
mapController = mapView.getController();
mapController.setCenter(geoPoint);
mapController.setZoom(15);
Log.d(LOG_TAG, "My playersCursor has "+playersCursor.getCount()+" rows");
// drawable is needed but not used
drawable = this.getResources().getDrawable(R.drawable.ic_launcher);
// set PlayersOverlay (locations and statuses)
playersOverlay = new PlayersOverlay(player.getId(), playersCursor, drawable, this);
mapOverlays = mapView.getOverlays();
mapOverlays.add(playersOverlay);
mHandler.postDelayed(mUpdateTimeTask, 100);
}
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
int h = mapView.getLayoutParams().height;
int w = mapView.getLayoutParams().width;
Log.d(LOG_TAG, "w = "+w+" , h = "+h);
mHandler.postAtTime(this, SystemClock.elapsedRealtime() + 1000);
}
};
@Override
public void onAttachedToWindow(){
Log.d(LOG_TAG, "Attached to Window");
int h = mapView.getLayoutParams().height;
int w = mapView.getLayoutParams().width;
Log.d(LOG_TAG, " Attached to window: w = "+w+" , h = "+h);
//mapController.zoomInFixing(screenPoint.x, screenPoint.y);
}
public void onWindowFocusChanged(boolean hasFocus){
Log.d(LOG_TAG, "Focus changed to: "+hasFocus);
int h = mapView.getLayoutParams().height;
int w = mapView.getLayoutParams().width;
Log.d(LOG_TAG, " Window focus changed: w = "+w+" , h = "+h);
//mapController.zoomInFixing(screenPoint.x, screenPoint.y);
}
@Override
protected void onStart(){
super.onStart();
// Create and register the broadcast receiver for messages from service
IntentFilter filter = new IntentFilter(AppConstants.iGAME_UPDATE);
r = new UpdateBroadcastReceiver();
registerReceiver(r, filter);
// Create the dialog for end of game
ctw = new ContextThemeWrapper(mContext, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
endDialog = new AlertDialog.Builder(ctw);
endDialog.setMessage("End of Game");
endDialog.setCancelable(false);
endDialog.setNeutralButton("OK", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
Intent highScores = new Intent(AMap.this, HighScores.class);
startActivity(highScores);
playersCursor.close();
finish();
}
});
}
@Override
protected void onStop() {
if(!playersCursor.isClosed())
playersCursor.close();
unregisterReceiver(r);
mdba.close();
super.onStop();
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
// Receives signal from NetworkService that DB has been updated
public class UpdateBroadcastReceiver extends BroadcastReceiver {
boolean startSignal, update, endSignal;
@Override
public void onReceive(Context context, Intent intent) {
endSignal = intent.getBooleanExtra("endSignal", false);
if(endSignal){
Log.d(LOG_TAG, "Game Update BroadcastReceiver received End Signal");
endTask = new EndTask();
endTask.execute();
return;
}
update = intent.getBooleanExtra("update", false);
if(update){
Log.d(LOG_TAG, "Game Update BroadcastReceiver received game update");
playersCursor.requery();
mapView.invalidate();
return;
}
startSignal = intent.getBooleanExtra("startSignal", false);
if(startSignal){
Log.d(LOG_TAG, "Game Update BroadcastReceiver received Start Signal");
startTask = new StartTask();
startTask.execute();
return;
}
}
}
class StartTask extends AsyncTask<Void,Integer,Void>{
private final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
private final long DELAY = 1200;
@Override
protected Void doInBackground(Void... params) {
int i = 3;
while(i>=0){
publishProgress(i);
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
e.printStackTrace();
}
i--;
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress){
tg.startTone(ToneGenerator.TONE_PROP_PROMPT);
tvCountdown.setText(""+progress[0]);
}
@Override
protected void onPostExecute(Void result) {
rl.removeView(tvCountdown);
timer.setBase(SystemClock.elapsedRealtime());
timer.start();
//enable screen touches
playersOverlay.setGameStarted(true);
}
}
class EndTask extends AsyncTask<Void,Void,Void>{
@Override
protected void onPreExecute(){
//disable screen touches
playersOverlay.setEndOfGame(true);
timer.stop();
}
@Override
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
try{
endDialog.show();
}catch(Exception e){
Toast.makeText(mContext, "End of game", Toast.LENGTH_LONG);
Intent highScores = new Intent(AMap.this, HighScores.class);
startActivity(highScores);
playersCursor.close();
finish();
}
mHandler.removeCallbacks(mUpdateTimeTask);
}
}
最终编辑:我最终使用了这段代码。我想反复放大,所以我使用了一个处理程序和一个从 onWindowFocusChanged 开始每 1500 毫秒调用一次自身的可运行对象。那里的MapView 的宽度和高度绝对是正值。 OnAttachedToWindow 可能不会工作,因为它返回 0 的宽度和高度。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_view);
mContext = AMap.this;
// set map
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapView.setFocusable(true);
// Set this player's location as map's center
geoPoint = new GeoPoint((int) (37.974718*1E6), (int) (23.733684*1E6));
projection = mapView.getProjection();
screenPoint = new Point();
projection.toPixels(geoPoint, screenPoint);
mapController = mapView.getController();
mapController.setCenter(geoPoint);
mapController.setZoom(1);
// drawable is needed but not used
Timer t = new Timer();
HTask ht = new HTask();
t.schedule(ht, 15000);
}
public void onWindowFocusChanged(boolean hasFocus){
Log.d(LOG_TAG, "Focus changed to: "+hasFocus+" ("+i+")");
int h = mapView.getHeight();
int w = mapView.getWidth();
Log.d(LOG_TAG, " Window focus changed: w = "+w+" , h = "+h);
if(w > 0 && h > 0) {
mHandler.postDelayed(mUpdateTimeTask, 100);
}
}
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
int h = mapView.getHeight();
int w = mapView.getWidth();
if(h>0 && w>0){
mapController.zoomIn();
mapController.animateTo(geoPoint);
mHandler.postAtTime(this, SystemClock.uptimeMillis() + 1500);
}
}
};
class HTask extends TimerTask{
@Override
public void run() {
mHandler.removeCallbacks(mUpdateTimeTask);
}
}
最佳答案
只需重写 MapActivity 的 onAttachedToWindow()
,放大那里,一切都应该没问题。如果 MapView 附加到窗口并且因此具有宽度和高度,则会调用它
由于代码更新而编辑:
我不确定。这里有一些东西,我会改变,因为它们对我来说很奇怪:
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
//WHY you asking LayoutPARAMS for their dimensions? try this:
int h = mapView.getHeight();
int w = mapView.getWidth();
Log.d(LOG_TAG, "w = "+w+" , h = "+h);
mHandler.postAtTime(this, SystemClock.elapsedRealtime() + 1000);
}
};
这里也一样:
@Override
public void onAttachedToWindow(){
Log.d(LOG_TAG, "Attached to Window");
int h = mapView.getHeight();
int w = mapView.getWidth();
Log.d(LOG_TAG, " Attached to window: w = "+w+" , h = "+h);
//mapController.zoomInFixing(screenPoint.x, screenPoint.y);
}
public void onWindowFocusChanged(boolean hasFocus){
....
另外,我没看到你在任何地方调用 zoomIn
关于android - 我应该把 zoomIn 放在我的 MapActivity 的什么地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802082/
我为 Android 应用程序创建了此 Activity : http://developer.android.com/resources/tutorials/views/hello-mapview.
我在 HelloMapView Tutorial 之后实现了一个带有 Pins 的 MapActivity以及许多 StackOverflow 资源。 为了我的应用程序的目的,我想限制缩放级别最小值和
我已经使用 Google Map API 创建了一个 apk。在它的 MainActivity 中它有两个按钮。首先在谷歌地图上显示我的位置,并将经纬度保存到 SQLite 数据库中。第二个按钮打开谷
我知道这个话题已经被讨论过几次了,而且对于拥有“多个”MapActivity 类的建议解决方案通常是在不同的进程中运行一个。我不想这样做,我有 3 个。 我重构了一个 MapActivity 子类以在
是否有将 MapView(以及 MapActivity)与 honeycomb pre-3.0 兼容性 Loader 库(以及因此 FragmentActivity)? (顺便说一句,我一直不太明白为
我正忙着尝试将 MapView 包含在我的 Android 项目中。我正在按照 Android 开发者网站上的 MapView 教程进行操作,但出现错误: 'MapActivity cannot be
在文档中,除了通过 Action 调用的突变之外,状态是不可变的......好吧。 我在我的组件中使用 mapGetters、mapActions ... 商店: export default {
我无法使用mapActions指出我的模块的操作之一。根据文档,默认情况下,模块操作在 Vuex 中没有命名空间,因此我的模块的操作应该像主存储操作一样可用。这是我的设置: 商店 import * a
我有一个具有触摸事件的 MapActivity。 在触摸事件中: 我获取当前的地理编码 在该位置放置覆盖图像。 并将其设置为 map View 的中心。 这似乎工作正常并且在一段时间内符合预期。但随后
我已经下载了 Google API,现在我的 map XML 似乎有一个标准问题,它只是在应显示 Google map 的位置显示一个灰色夹点,如下所示: 我尝试了两个 API key (通过生成一个
当我第一次加载我的应用程序时,mapActivity 正在调用并且我可以看到 map ,现在当我关闭网络连接并重新打开,更改屏幕并返回到 mapactivity, map 显示为空,此时出现空指针异常
我的 Activity 扩展自 MapActivity,我已在 list 中正确描述了它,我已将 内的标签标记我正在使用 goole apis 库构建,并且 maps.jar 只存在一次(没有重复
鉴于... 从 MapActivity 扩展的 Activity 使用 ItemizedOverlay 在 map 上显示一些气球 已启用 ZoomControls ItemizeOverlay 实现
我喜欢使用 Gmaps 应用程序中众所周知的蓝色罗盘针。 是否有可用的小部件,我只是必须打开? 如果没有,你能提供给我吗教程或类(class)名称 I应该看看吗? 最佳答案 Is there a wi
我已经完成了 Google 的 MapView 教程,它在模拟器上运行良好,例如在我的 HTC Flyer 上。但是由于某种原因,它在我的手机(Samsung Galaxy I9000)上启动时立即崩
我正在使用 ActionBarSherlock与 ActionBarSherlock-Plugin-Maps在我的项目中。我想将菜单项添加到我的 MapActivity 的操作栏中,因为从 Sherl
当我创建一个 MapActivity 时我得到了这个错误 05-15 23:31:37.231: E/AndroidRuntime(760): FATAL EXCEPTION: main 05-15
请问我如何将 greendroid 库与 MapActivity 一起使用 public class GreendroidTestActivity extends GDActivity Map
我有一个扩展 MapActivity 的 Activity 。但是当我点击 map 时,永远不会调用 onTouchEvent。这是为什么? @Override public boolean onTo
我正在玩 Google API Map Activity。 最近,Android 版 Google map 发布了一项用于缓存 map 数据的新功能。有谁知道我如何在我的应用程序中做到这一点? 提前致
我是一名优秀的程序员,十分优秀!