2013-03-29 140 views
6

我想加载Google Maps对象,并创建一些听众:谷歌地图片段不加载

我创建了这个类:

import java.lang.ref.WeakReference; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 

import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.support.v4.app.FragmentActivity; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewParent; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class itemSaleActivity extends FragmentActivity { 
    private static Context app; 
    private static GoogleMap map; 
    static final LatLng HAMBURG = new LatLng(53.558, 9.927); 
    private static final int LOAD_COORD = 0; 
    private ImageView pic; 
    private LocationHandler mHandler; 

    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     // Set View to register.xml 
     setContentView(R.layout.itemsale); 

     app = getApplicationContext(); 
     Bundle extras = getIntent().getExtras(); 
     byte[] byteArray = extras.getByteArray("picture"); 
     Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 

     pic = (ImageView) findViewById(R.id.itemImage); 
     pic.setImageBitmap(bmp); 

     map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
     //Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG).title("Hamburg")); 
     mHandler = new LocationHandler(this); 

     OnMarkerDragListener markerDragListener = new OnMarkerDragListener() { 

      @Override 
      public void onMarkerDragStart(Marker marker) { 
       // Called when the marker drag is started 
      } 

      @Override 
      public void onMarkerDragEnd(Marker marker) { 
       // Called when the marker is dropped down. 
       double[] coords = null; 
       coords[0] = marker.getPosition().latitude; 
       coords[1] = marker.getPosition().longitude; 
       RestoreUIwithSavedLocation(coords); 
       Toast.makeText(getApplicationContext(),"Pin Dropped at: " + coords[0] + ", " + coords[1]+marker.getTitle() , Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void onMarkerDrag(Marker marker) { 

      } 
     }; 

     map.setOnMarkerDragListener(markerDragListener); 

     View titleView = getWindow().findViewById(android.R.id.title); 
     if (titleView != null) { 
      ViewParent parent = titleView.getParent(); 
      if (parent != null && (parent instanceof View)) { 
      View parentView = (View)parent; 
      parentView.setVisibility(View.GONE); 
      } 
     } 

     // You can also assign the title programmatically by passing a 
     // CharSequence or resource id. 
    } 

    private void RestoreUIwithSavedLocation(double[] coordsArray) { 
     Message.obtain(mHandler, LOAD_COORD, coordsArray).sendToTarget(); 
    } 

    static class LocationHandler extends Handler { 
     WeakReference<Activity> mActivity; 

     public LocationHandler(Activity activity) { 
      mActivity = new WeakReference<Activity>(activity); 
     } 

     public void handleMessage(Message msg) { 
      Activity contextActivity = mActivity.get(); 
      switch ((int)msg.what) { 

      case LOAD_COORD: 
       map.clear(); 
       double[] coordArray = (double[])msg.obj; 
       Marker marker = map.addMarker(new MarkerOptions().position(new LatLng(coordArray[0], coordArray[1]))); 
       map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(coordArray[0], coordArray[1]), 18)); 
       map.animateCamera(CameraUpdateFactory.zoomTo(18), 2000, null); 
       marker.setDraggable(true); 
       String s = Double.toString(coordArray[0]) + ", " + Double.toString(coordArray[1]); 
       Toast.makeText(app,"in the case"+s , Toast.LENGTH_LONG).show(); 
       break; 
      } 
     } 
    } 
} 

而这正是XML:

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <ImageView 
     android:id="@+id/itemImage" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:layout_marginRight="10dp" 
     android:src="@drawable/logo" /> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="400dp" 
     android:layout_marginTop="10dp" 
     android:layout_weight="66496.79" 
     android:orientation="horizontal" > 

     <fragment 
      android:id="@+id/map" 
      class="com.google.android.gms.maps.MapFragment" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_marginRight="150dp" /> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="170dp" 
      android:orientation="vertical" > 

      <Button 
      android:id="@+id/messageBtn" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentRight="true" 
      android:text="fffff" /> 

      <Button 
       android:id="@+id/call" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentBottom="true" 
       android:layout_alignParentRight="true" 
       android:text="ffff" /> 

     <Button 
      android:id="@+id/sms" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignRight="@+id/button1" 
      android:layout_centerVertical="true" 
      android:text="ffff" /> 
     <Button 
      android:id="@+id/email" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignRight="@+id/button1" 
      android:layout_centerVertical="true" 
      android:text="fffff" /> 

     <Button 
      android:id="@+id/navigate" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignLeft="@+id/button1" 
      android:layout_alignParentEnd="false" 
      android:layout_alignParentStart="false" 
      android:layout_below="@+id/button1" 
      android:layout_marginTop="14dp" 
      android:text="ffffffffff" /> 
     </LinearLayout> 
    </RelativeLayout> 
</LinearLayout> 

当我在我的手机(galaxy s2)上调试它时,它显示出一个例外:

03-29 15:24:29.750: E/AndroidRuntime(2579): FATAL EXCEPTION: main 
03-29 15:24:29.750: E/AndroidRuntime(2579): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sal/com.example.sal.itemSaleActivity}: android.view.InflateException: Binary XML file line #26: Error inflating class fragment 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2079) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.ActivityThread.access$600(ActivityThread.java:132) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1157) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.os.Looper.loop(Looper.java:137) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.ActivityThread.main(ActivityThread.java:4575) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at dalvik.system.NativeStart.main(Native Method) 
03-29 15:24:29.750: E/AndroidRuntime(2579): Caused by: android.view.InflateException: Binary XML file line #26: Error inflating class fragment 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:742) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:251) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.Activity.setContentView(Activity.java:1835) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at com.example.sal.itemSaleActivity.onCreate(itemSaleActivity.java:45) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.Activity.performCreate(Activity.java:4465) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2033) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  ... 11 more 
03-29 15:24:29.750: E/AndroidRuntime(2579): Caused by: java.lang.ClassCastException: com.google.android.gms.maps.MapFragment cannot be cast to android.support.v4.app.Fragment 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.support.v4.app.Fragment.instantiate(Fragment.java:388) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.support.v4.app.Fragment.instantiate(Fragment.java:363) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:264) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 
03-29 15:24:29.750: E/AndroidRuntime(2579):  ... 22 more 

其中在xml文件线26是:

<fragment 
       android:id="@+id/map" 
       class="com.google.android.gms.maps.MapFragment" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:layout_marginRight="150dp" /> 
+1

尝试使用,class =“com.google.android.gms.maps.SupportMapFragment”。 –

+0

我试过了,现在它显示了一个nullPointerException在行:map =((MapFragment)getFragmentManager()。findFragmentById(R.id.map))。getMap(); –

+0

[here](http://android-er.blogspot.in/2012/12/a-simple-example-using-google-maps。html)是一步一步实现GoogleMapV2的好教程。希望这会帮助你。 –

回答

10

在XML文件中,使用class="com.google.android.gms.maps.SupportMapFragment"

在你的主类,使用方法:

map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 

相反的:

map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
+0

谢谢,它告诉我一个错误:“SupportMapFragment无法解析为类型” –

+0

您是否导入了所有必需的包? –

+0

嗨,我认为我添加了所有必需的进口,但是我使用的所有进口都在主线程中写入,请让我知道是否缺少某些东西 –

2

要添加SupportMapFragment到你的项目,你需要添加google-support-v4库和google map libraries。你可以在我写的博客文章中看到如何做到这一点,Google Maps API V2

+0

嗨,我已经添加它 –

+0

然后检查您的进口,你正在导入正确的类。 –

+0

我导入了与您在此处编写的教程中相同的东西 –

1

FragmentActivity的Android支持库提供V4,以允许前的Android平台Android 3(蜂窝)来使用的片段。随着蜂窝后来,片段使用标准Activity类支持

美中不足的是,根据您选择的活动类,您不能使用相同的片段类:

  • android.support.v4.app.FragmentActivity,你的缪斯使用android.support.v4.app.Fragment
  • android.app.Activity,你必须使用android.app.Fragment

注意包的区别。现在

,相对于谷歌地图V2为Android,你有两个片段实现:

  • MapFragment这对于蜂窝扩展android.app.Fragment后来
  • SupportMapFragment这对于支持较旧的Android版本
  • 延伸 android.support.v4.app.Fragment

因此,当您使用FragmentActivity时,您必须使用SupportMapFragment实现为您的应用程序。

+0

嗨,所以我不确定什么是我需要编写inorder以使用SupportMapFragment的导入?请看我的进口主线 –

+0

这清除了我很多疑惑 –

+0

对于凡人[“怀疑”的意思是“问题”](http://english.stackexchange.com/questions/2429)。 –