我目前正在为我的武术组织开发一款应用程序。我想要一个使用 SupportMapFragment 的 fragment ,它显示我所在州内每个武术道场的不同位置。我目前设置了一个抽屉导航,其中有一个标题为“位置”的选项卡。我正在关注 Tutsplus 的人员如何创建他们的 Zoo 应用程序并在该应用程序中包含 map 。我正在查看的代码位于 here.在 Youtube 上的代码和教程中,他们使用 getMap().animateCamera...
来控制相机并使 map 正常工作。我已经知道 getMap() 已从 Android 中删除,并且 getMapAsync(this)
是一个更好的选择,但是我正在努力弄清楚如何将 getMapAsync()
与我的代码当前的设置方式结合到我的代码中,并且我需要一些帮助。我已经浏览了所有谷歌的文档并阅读了该网站上的多个线程,但我没有太多运气。下面是我的 LocationFragment.java
代码:
public class LocationFragment extends SupportMapFragment {
public static LocationFragment getInstance() {
LocationFragment fragment = new LocationFragment();
return fragment;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
CameraPosition position = CameraPosition.builder()
.target(new LatLng(42.921966, -85.718533))
.zoom( 16f )
.bearing( 0.0f )
.tilt( 0.0f )
.build();
getMap().animateCamera(CameraUpdateFactory.newCameraPosition(position), null);
getMap().setMapType(GoogleMap.MAP_TYPE_HYBRID);
getMap().setTrafficEnabled(true);
getMap().getUiSettings().setZoomControlsEnabled(true);
MarkerOptions options = new MarkerOptions().position(new LatLng(42.921966, -85.718533));
options.title("KFCOM");
options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
getMap().addMarker(options);
getMap().setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
marker.showInfoWindow();
return true;
}
});
RestAdapter adapter = new RestAdapter.Builder()
.setEndpoint("https://gist.githubusercontent.com/anonymous/101ffbf7e1aed60b7caf7d3d5418bfde/raw/43b5d1fa6862fd1dce84044821cdf1a9d48b6ca2")
.build();
PinsApiInterface pinsApiInterface = adapter.create(PinsApiInterface.class );
pinsApiInterface.getStreams(new Callback<List<Pin>>() {
@Override
public void onResponse(Call<List<Pin>> pins, Response<List<Pin>> response) {
for( Pin pin : response.body()) {
MarkerOptions options = new MarkerOptions().position( new LatLng(pin.getLatitude(), pin.getLongitude()));
options.title(pin.getName());
options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
getMap().addMarker(options);
}
}
@Override
public void onFailure(Call<List<Pin>> call, Throwable t) {
}
});
}
}
下面是我的主要 Activity ,它实例化抽屉导航并在不同选项卡之间切换,包括“位置”选项卡。我包含了所有代码,因为我不确定主 Activity 中是否也需要更改某些内容。用于在 fragment 之间切换的代码位于 onDrawerSectionItemClickedEvent
代码的最底部。
public class Home extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mActionBarDrawerToggle;
private String mCurrentFragmentTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mDrawerLayout = (DrawerLayout) findViewById( R.id.drawer_layout );
mActionBarDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
R.string.drawer_opened,
R.string.drawer_closed )
{
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if(getSupportActionBar() != null)
getSupportActionBar().setTitle(R.string.drawer_opened);
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if(getSupportActionBar() != null)
getSupportActionBar().setTitle(R.string.drawer_closed);
}
};
mDrawerLayout.addDrawerListener( mActionBarDrawerToggle );
displayInitialFragment();
}
private void displayInitialFragment() {
getSupportFragmentManager().beginTransaction().replace(R.id.container, HomeFragment.getInstance() ).commit();
mCurrentFragmentTitle = getString(R.string.Home);
}
@Override
public void onPostCreate(Bundle savedInstanceState){
super.onPostCreate(savedInstanceState);
mActionBarDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mActionBarDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mActionBarDrawerToggle.onOptionsItemSelected( item ) )
return true;
return super.onOptionsItemSelected(item);
}
@Override
protected void onStart() {
super.onStart();
EventBus.getInstance().register( this );
}
@Override
protected void onStop() {
EventBus.getInstance().unregister( this );
super.onStop();
}
@Subscribe
public void onDrawerSectionItemClickedEvent(DrawerSectionItemClickedEvent event) {
mDrawerLayout.closeDrawers();
if(event == null || TextUtils.isEmpty( event.section ) || event.section.equalsIgnoreCase(mCurrentFragmentTitle))
{
return;
}
Toast.makeText( this, "Home: Section Clicked: " + event.section, Toast.LENGTH_SHORT).show();
if(event.section.equalsIgnoreCase( "locations" )){
getSupportFragmentManager().beginTransaction().replace(R.id.container, LocationFragment.getInstance()).commit();
} else if (event.section.equalsIgnoreCase( "current members" ))
{
getSupportFragmentManager().beginTransaction().replace(R.id.container, MembersFragment.getInstance()).commit();
} else if (event.section.equalsIgnoreCase( "home" ))
{
getSupportFragmentManager().beginTransaction().replace(R.id.container, HomeFragment.getInstance()).commit();
} else {
return;
}
mCurrentFragmentTitle = event.section;
}
}
最佳答案
第 1 步:让 LocationFragment
实现 OnMapReadyCallback
。
第 #2 步:将当前的所有 onViewCreated()
逻辑移至 onMapReady()
(OnMapReadyCallback
需要)
第 3 步:在 onViewCreated()
中,调用 getMapAsync(this)
关于java - 在 SupportMapFragment Java Android Studio 中使用 getMap() 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40939065/