Java 在片段内设置谷歌地图

Java 在片段内设置谷歌地图,java,android,android-fragments,Java,Android,Android Fragments,我有一个带有侧栏(像菜单栏)的FragmentActivity,还有一个容器将片段放在那里。 在这个FragmentActivity中,我使用每个按钮的onClickListener调用其他片段(从侧栏) 例如,FragmentActivity被称为menuviewaActivity。这将调用Navigationfragment并设置它在容器上的布局 在导航片段中,我有一个启动谷歌地图的按钮(或者这就是我需要的) [MenuvieWaActivity(FragmentActivity)]>>[N

我有一个带有侧栏(像菜单栏)的FragmentActivity,还有一个容器将片段放在那里。 在这个FragmentActivity中,我使用每个按钮的
onClickListener
调用其他片段(从侧栏)

例如,FragmentActivity被称为
menuviewaActivity
。这将调用
Navigation
fragment并设置它在容器上的布局

导航
片段中,我有一个启动
谷歌地图
的按钮(或者这就是我需要的)

[MenuvieWaActivity(FragmentActivity)]>>[NavigationFragment(Fragment)]>[GoogleMapsFragment(Fragment)]

其想法是将GoogleMaps窗口安装在我设置其他片段(如navigationFragment)的同一容器中

这是NavigationFragment.java的代码:

public class NavigationFragment extends Fragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    /**Inflate the layout for this fragment*/
    View mainView = inflater.inflate(R.layout.navegacion, container, false);

    mapBtn = (ImageView) mainView.findViewById(R.id.mapsButton);
    navBtn = (ImageView) mainView.findViewById(R.id.navigatorButton);

    mapBtn.setOnClickListener(this);
    navBtn.setOnClickListener(this);

    return mainView;
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.mapsButton:
            GoogleMapsFragment fragment_maps = new GoogleMapsFragment();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_container, fragment_maps).commit();
            break;
    }
}
public class GoogleMapsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    /**Inflate the layout for this fragment*/
    View mainView = inflater.inflate(R.layout.google_maps, container, false);

    SupportMapFragment fm = (SupportMapFragment)  getFragmentManager().findFragmentById(R.id.map);
    mMap = fm.getMap();

    return mainView;
}
<fragment 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"
map:cameraTilt="45"
map:cameraZoom="14"
class="com.google.android.gms.maps.SupportMapFragment" />
这是GoogleMapsFragment.java的代码:

public class NavigationFragment extends Fragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    /**Inflate the layout for this fragment*/
    View mainView = inflater.inflate(R.layout.navegacion, container, false);

    mapBtn = (ImageView) mainView.findViewById(R.id.mapsButton);
    navBtn = (ImageView) mainView.findViewById(R.id.navigatorButton);

    mapBtn.setOnClickListener(this);
    navBtn.setOnClickListener(this);

    return mainView;
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.mapsButton:
            GoogleMapsFragment fragment_maps = new GoogleMapsFragment();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_container, fragment_maps).commit();
            break;
    }
}
public class GoogleMapsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    /**Inflate the layout for this fragment*/
    View mainView = inflater.inflate(R.layout.google_maps, container, false);

    SupportMapFragment fm = (SupportMapFragment)  getFragmentManager().findFragmentById(R.id.map);
    mMap = fm.getMap();

    return mainView;
}
<fragment 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"
map:cameraTilt="45"
map:cameraZoom="14"
class="com.google.android.gms.maps.SupportMapFragment" />
以及google_maps.xml的代码:

public class NavigationFragment extends Fragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    /**Inflate the layout for this fragment*/
    View mainView = inflater.inflate(R.layout.navegacion, container, false);

    mapBtn = (ImageView) mainView.findViewById(R.id.mapsButton);
    navBtn = (ImageView) mainView.findViewById(R.id.navigatorButton);

    mapBtn.setOnClickListener(this);
    navBtn.setOnClickListener(this);

    return mainView;
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.mapsButton:
            GoogleMapsFragment fragment_maps = new GoogleMapsFragment();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_container, fragment_maps).commit();
            break;
    }
}
public class GoogleMapsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    /**Inflate the layout for this fragment*/
    View mainView = inflater.inflate(R.layout.google_maps, container, false);

    SupportMapFragment fm = (SupportMapFragment)  getFragmentManager().findFragmentById(R.id.map);
    mMap = fm.getMap();

    return mainView;
}
<fragment 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"
map:cameraTilt="45"
map:cameraZoom="14"
class="com.google.android.gms.maps.SupportMapFragment" />

我认为我没有正确调用onClick上的GoogleMapsFragment,或者我不能像在NavigationFragment中那样从其他片段调用*fragment\u容器*,因为这个id属于MenuViewActivity的布局

logCat输出如下所示:

android.view.InflateException: Binary XML file line #3: Error inflating class fragment
    at com.example.GoogleMapsFragment.onCreateView(GoogleMapsFragment.java:47)
Caused by: java.lang.IllegalStateException: A required meta-data tag in your app's 
    AndroidManifest.xml does not exist.  You must have the following declaration within the <application> element:     
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
android.view.InflateException:二进制XML文件行#3:膨胀类片段时出错
位于com.example.GoogleMapsFragment.onCreateView(GoogleMapsFragment.java:47)
原因:java.lang.IllegalStateException:应用程序的
AndroidManifest.xml不存在。元素中必须有以下声明:

异常会准确地告诉您问题所在。自上次更新google-play-services_库以来,您需要在应用程序标记内的AndroidManifest.xml中添加以下内容:

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

此外,你有:

android:name=“com.google.android.gms.maps.MapFragment” class=“com.google.android.gms.maps.SupportMapFragment”

您应该只具有其中一个属性。这里有两个,它们指向两个不同的类。如果您想要向后兼容,应该使用
com.google.android.gms.maps.SupportMapFragment


一个建议。如果您只需要显示地图,为什么不使用
extends
SupportMapFragment
MapFragment
而不是
Fragment

是的,这似乎是主要问题。。。但有些事情告诉我,我在onClick上调用GoogleMapsFragment的方式并不正确,我已经将它添加到了manifest中,但是使用了相同的logcat。我认为元数据应该放在活动声明中。但在使用片段时,这些片段并没有在清单上声明,必须将元数据放在应用程序之外。不过,我的映射活动不包含任何元数据。我使用的唯一元数据是处理gMaps-v2-key;这一个属于应用程序标记:)@bofredo我在属于应用程序标记(.maps.v2.API_KEY)的清单中对元数据有相同的定义。你能发布一个显示你代码的答案吗?@Emmanuel我不知道我能扩展SupportMapFragment。我将尝试这样做,并更改xml上的声明