【问题标题】:How to properly initialize map?如何正确初始化地图?
【发布时间】:2014-06-03 06:42:39
【问题描述】:

如何在我的片段中初始化我的地图?我现在收到一个空指针异常。我有一个片段,Fragment01,它只用于显示地图和一个布局,Fragment_01.xml,它只包含地图。

清单

<uses-sdk
    android:minSdkVersion="11"
    android:targetSdkVersion="19" />

<permission
android:name="se.sebastianliljegren.nellienovafoto.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>

<uses-permission android:name="se.sebastianliljegren.nellienovafoto.permission.MAPS_RECEIVE"/>
<library
    android:name="com.google.android.maps"
    />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<!-- The following two permissions are not required to use
 Google Maps Android API v2, but are recommended. -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

    <meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="############################"/>

    <activity
        android:name="se.sebastianliljegren.nellienovafoto.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

主活动 公共类 MainActivity 扩展 FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    StartFragment startfragment = new StartFragment();

    transaction.add(R.id.fragment_placeholder, startfragment);
    transaction.commit();
}

public void onSelectFragment(View view){

    Fragment newFragment;

    if (view == findViewById(R.id.btnomforetaget)) {
        newFragment = new StartFragment();
    } else if (view == findViewById(R.id.btnhittahit)) {
        newFragment = new Fragment01();
    } else if (view == findViewById(R.id.btnhemsida)) {
        newFragment = new Fragment02();
    } else {
        newFragment = new StartFragment();
    }

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_placeholder, newFragment);
    transaction.addToBackStack(null);
    transaction.commit();

}

}

Fragment01

public class Fragment01 extends Fragment {
MapView mapView;
GoogleMap map;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_01, container, false);

LatLng sydney = new LatLng(-33.867, 151.206);

map.setMyLocationEnabled(true);
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13));

map.addMarker(new MarkerOptions()
    .title("Sydney")
    .snippet("The most populous city in Australia.")
    .position(sydney));

return view;
}

@Override
public void onDestroyView()
{
  super.onDestroyView();
   Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
  FragmentTransaction ft =     getActivity().getSupportFragmentManager().beginTransaction();
  ft.remove(fragment);
  ft.commit();

}

}

Fragment_01.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="match_parent"
android:orientation="vertical"
android:id="@+id/fragment02">
<fragment android:id="@+id/map"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:name="com.google.android.gms.maps.MapFragment"/>
</LinearLayout>

【问题讨论】:

  • 把你所有的代码贴在你使用这个片段的地方
  • @SimplePlan 我用我的 MainActivity 更新了我的问题。是这个意思吗?
  • @S 也发布您的manifest.xml 文件。
  • @SimplePlan 完成。前几天,我从一个新的 API 项目中获得了一个新的 API 密钥,终于让地图工作了。

标签: android android-fragments google-maps-api-2 android-maps-v2


【解决方案1】:

你的 android:minSdkVersion="11" 所以你应该改变这个

 <fragment android:id="@+id/map"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:name="com.google.android.gms.maps.SupportMapFragment"/> 

也改变这个

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

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

还将您的onDestroyView() 更改为以下内容:

 @Override
    public void onDestroyView()
    {
        try{
          SupportMapFragment fragment = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map));
          FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
          ft.remove(fragment);
          ft.commit();
        }catch(Exception e){
        }
      super.onDestroyView();  
  }

在你的Fragmnt01packages下面也导入

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.google.android.gms.maps.SupportMapFragment;

【讨论】:

  • 当我这样做时,我得到多个标记:SupportMapFragment 无法解析为类型方法 getSupportFragmentManager() 未定义 Fragment01 和 SupportMapFragment 无法解析为类型(再次)。
  • @Sebbenator import com.google.android.gms.maps.SupportMapFragment; 在你的Fragment
  • 处理了一个标记,但直到我更改为 getFragmentManager() 才编译。 map= ((SupportMapFragment) getFragmentManager().findFragmentById( R.id.map)).getMap(); 但是,当我在我的应用程序中单击 Fragment01 时,我会在这一行得到一个 nullpointerexception:map.setMyLocationEnabled(true);
  • @Sebbenator 你只需要把map= ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();放在map.setMyLocationEnabled(true);之前
  • @Sebbenator 我有另一种方法。试试这个mMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
【解决方案2】:

你忘了在onCreateView()里面初始化地图:

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

由于您的 minSDKVersion=11,您需要使用SupportMapFragment,在 XML 代码中也进行相同的更改。

【讨论】:

  • 我尝试过这样做,但是当我这样做时,我收到一条错误消息:Cannot cast from Fragment to MapFragment?
  • @Sebbenator 发布足够的详细信息,以便我可以调查并建议您!
  • 谢谢!我编辑了我的问题,发布了 MainActivity 的内容。当我尝试实现上面的代码时,它没有编译,我收到一条错误消息 Cannot cast from Fragment to MapFragment
    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_01, container, false); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap();
  • @Sebbenator 你可能导入了android.view.fragment 类,删除它并导入android.support.v4.app.fragment
  • 处理了一个标记,但直到我更改为 getFragmentManager() 才编译。 map= ((SupportMapFragment) getFragmentManager().findFragmentById( R.id.map)).getMap(); 但是,当我在我的应用程序中单击 Fragment01 时,我会在这一行得到一个空指针异常:map.setMyLocationEnabled(true);
【解决方案3】:

在您的 onCreateView() 方法中,您必须像这样初始化地图:

if (map== null) {
        map= ((SupportMapFragment) getFragmentManager().findFragmentById(
                R.id.map)).getMap();

在你的 xml 中:

 <fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

【讨论】:

  • 我尝试过类似的解决方案(if 语句除外),但我收到一条错误消息:Cannot cast from Fragment to MapFragment?
  • 因为我认为你的 min api 超过 11,这就是你得到这个的原因。
【解决方案4】:

你会使用类似下面的东西:

公共静态类 MapsFragment 扩展片段 {

    private SupportMapFragment suppfrag;
    LatLng sydney = new LatLng(-33.867, 151.206);
    private GoogleMap map;

    public static final String ARG_SECTION_NUMBER = "section_number";

    public MapsFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            return inflater.inflate(R.layout.fragment_map, container, false);
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        FragmentManager fm = getChildFragmentManager();
        suppfrag = (SupportMapFragment) fm.findFragmentById(R.id.map);
        if (suppfrag == null) {
            suppfrag = SupportMapFragment.newInstance();
            fm.beginTransaction().replace(R.id.map, suppfrag).commit();

            Marker location = map.addMarker(new MarkerOptions().position(CENTRU)
                    .title("Centru"));
                location.setIcon(BitmapDescriptorFactory
                                    .defaultMarker(BitmapDescriptorFactory.HUE_BLUE));

                // Move the camera instantly to Bottlecapp with a zoom of 15.
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(CENTRU, 15));

                // Zoom in, animating the camera.
                map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
                getActivity().getSupportFragmentManager().popBackStack();
        }
    }
    @Override
    public void onResume() {
        super.onResume();
        if (map == null) {
            map = suppfrag.getMap();
            map.addMarker(new MarkerOptions().position(new LatLng(0, 0)));
        }
    }
}

如果您使用片段,xml 文件将类似于以下文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <fragment
        android:id="@+id/map"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2022-01-01
    • 2010-11-11
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多