【问题标题】:Alternative to using getMap() in SupportMapFragment Java Android Studio在 SupportMapFragment Java Android Studio 中使用 getMap() 的替代方法
【发布时间】:2016-12-02 18:48:38
【问题描述】:

我目前正在为我的武术组织开发一个应用程序。我想要一个使用 SupportMapFragment 的片段,它显示我所在州每个武术道场的不同位置。我目前设置了一个导航抽屉,带有一个标题为“位置”的选项卡。我正在关注 Tutsplus 的人如何创建他们的 Zoo 应用程序并在该应用程序中包含地图。我正在查看的代码是 here. 在他们在 Youtube 上的代码和教程中,他们使用 getMap().animateCamera... 来控制相机并让地图工作。我已经知道 getMap() 已从 Android 中删除,而 getMapAsync(this) 是一个更好的选择,但是我正在努力弄清楚如何将 getMapAsync() 与我的代码当前设置的方式一起使用到我的代码中,并且我可以使用一些帮助。我已经浏览了 Google 的所有文档并阅读了该站点上的多个线程,但我运气不佳。下面是我的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) {

            }
        });
    }
}

下面是我的主要活动,它实例化导航抽屉并在不同选项卡之间切换,包括“位置”选项卡。我包含了所有代码,因为我不确定主活动中是否需要更改某些内容。片段之间切换的代码在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;
    }
}

【问题讨论】:

    标签: java android google-maps android-fragments supportmapfragment


    【解决方案1】:

    第 1 步:让 LocationFragment 实现 OnMapReadyCallback

    第 2 步:将所有当前的 onViewCreated() 逻辑移动到 onMapReady()OnMapReadyCallback 要求)

    步骤#3:在onViewCreated(),拨打getMapAsync(this)

    【讨论】:

    • 谢谢!这解决了我遇到的一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2014-12-23
    相关资源
    最近更新 更多