gpt4 book ai didi

android - 如何在抽屉导航 Activity fragment 中正确使用谷歌地图 fragment

转载 作者:行者123 更新时间:2023-11-30 01:19:07 26 4
gpt4 key购买 nike

我试图将 Google map fragment 放入我的应用程序中,但当我尝试在 Locations 类中扩充 View 时,我不断收到此错误:

android.view.InflateException: Binary XML file line #37: Binary XML file line #37: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #37: Error inflating class fragment
Caused by: android.app.Fragment$InstantiationException: Trying to instantiate a class com.google.android.gms.maps.SupportMapFragment that is not a Fragment

我想将 map fragment 放在另一个 fragment 中,并使用抽屉导航加载到主 Activity 中。

这是我加载 map 应该进入的位置 fragment 的代码:

@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

Fragment fragment = new Race();
toolbar.setTitle(R.string.nav_name_race);
FragmentManager fragmentManager = getFragmentManager();

if (id == R.id.nav_race) {
toolbar.setTitle(R.string.nav_name_race);
fragment = new Race();
} else if (id == R.id.nav_pilot) {
toolbar.setTitle(R.string.nav_name_pilot);
fragment = new Pilot();
} else if (id == R.id.nav_locations) {
toolbar.setTitle(R.string.nav_name_locations);
fragment = new Locations();
} else if (id == R.id.nav_channelpicker) {
toolbar.setTitle(R.string.nav_name_channelpicker);
fragment = new Channelpicker();
} else if (id == R.id.nav_band_overview) {
toolbar.setTitle(R.string.nav_name_band_overview);
fragment = new BandOverview();
}

fragmentManager.beginTransaction()
.replace(R.id.mainframelayout, fragment)
.commit();


DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}

位置类:

public class Locations extends Fragment implements OnMapReadyCallback {

private View view;
private GoogleMap map;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
this.view = inflater.inflate(R.layout.content_locations, container, false);
SupportMapFragment mapFragment = (SupportMapFragment) (((FragmentActivity) getActivity()).getSupportFragmentManager().findFragmentById(R.id.map));
mapFragment.getMapAsync(this);


//set fab onClickListener
FloatingActionButton fabtop = (FloatingActionButton) view.findViewById(R.id.fabtop);
assert fabtop != null;
fabtop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "top", Toast.LENGTH_SHORT).show();
}
});

FloatingActionButton fabbottom = (FloatingActionButton) view.findViewById(R.id.fabbottom);
assert fabbottom != null;
fabbottom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "bottom", Toast.LENGTH_SHORT).show();
}
});

return this.view;
}

@Override
public void onMapReady(GoogleMap googleMap)
{
map = googleMap;

// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
map.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
map.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?android:attr/actionBarSize"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity">

<android.support.design.widget.FloatingActionButton
android:id="@+id/fabtop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:src="@drawable/ic_menu_mylocation"
app:backgroundTint="#FFFFFF"
android:layout_above="@+id/fabbottom"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="@dimen/fab_margin" />

<android.support.design.widget.FloatingActionButton
android:id="@+id/fabbottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:src="@mipmap/ic_add_white_48dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_margin="@dimen/fab_margin" />

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
tools:context=".MapsActivity"
android:name="com.google.android.gms.maps.SupportMapFragment" />

</RelativeLayout>

我认为问题在于 fragment 中有一个 fragment ,因为如果我为 map 创建一个新的 Activity 一切正常。我仍然是使用 fragment 的初学者,不知道在我的应用程序中插入 map fragment 的正确方法。

感谢每个提示。

最佳答案

您不需要在 fragment 中调用 (SupportMapFragment) (((FragmentActivity) getActivity()).getSupportFragmentManager(),因为 getFragmentManager()Fragment。但是当使用 Nested Fragments 时,您应该使用 getChildFragmentManager() 而不是 getFragmentManager()(参见 documentation)。

针对您的问题,您只需将代码更新为:

SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
if (mapFragment != null) {
mapFragment.getMapAsync(this);
}

如果您遇到ID 重复、标记为空或父 ID 与 com.google.android.gms.maps.MapFragment 的另一个 fragment 等问题。您可以尝试讨论的任何解决方案 here .或者试试这个:

private View mContentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mContentView == null) {
mContentView = inflater.inflate(R.layout.content_locations, container, false);
}
return mContentView;
}

它不会每次都膨胀布局,因此您不会遇到重复 ID、标签 null 或父 ID 与另一个 fragment 的 com.google.android.gms.maps.MapFragment 问题。但是请确保您在 attachToRoot(inflater.inflate 的最后一个参数)中传递了 false,否则您可能会遇到类似指定的子项已经有一个父项的异常。

关于android - 如何在抽屉导航 Activity fragment 中正确使用谷歌地图 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37383749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com