1

Ich arbeite gerade an einer App für meine Kampfsportorganisation. Ich möchte ein Fragment haben, das SupportMapFragment verwendet, das die verschiedenen Positionen jedes Kampfkunst-Dojos in meinem Zustand anzeigt. Ich habe derzeit eine Navigationsleiste eingerichtet, mit einem Tab mit dem Titel "Locations". Ich folge mit, wie die Jungs von Tutsplus ihre Zoo-Anwendung erstellt und eine Karte in diese Anwendung eingefügt haben. Der Code, den ich sehe, ist here. In ihrem Code und Tutorial auf Youtube, verwenden sie getMap().animateCamera..., um die Kamera zu steuern und die Karte zu arbeiten. Ich weiß bereits, dass getMap() wurde aus Android entfernt, und dass getMapAsync(this) ist eine bessere Option, aber ich habe Probleme mit herauszufinden, wie zu arbeiten getMapAsync() in meinem Code mit, wie mein Code derzeit eingerichtet ist, und ich könnte einige verwenden Hilfe. Ich habe die gesamte Dokumentation von Google durchgesehen und mehrere Threads auf dieser Website durchgelesen, aber ich hatte nicht viel Glück. Hier ist mein Code unten für meine LocationFragment.java:Alternative zur Verwendung von getMap() in SupportMapFragment Java Android Studio

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) { 

      } 
     }); 
    } 
} 

Und unten ist meine Haupttätigkeit, die die Navigationsleiste und schaltet zwischen den verschiedenen Registerkarten instanziiert, darunter der „Orten“ aus. Ich habe den gesamten Code hinzugefügt, weil ich mir nicht sicher bin, ob es auch etwas gibt, das in der Hauptaktivität geändert werden muss. Der Code zum Wechseln zwischen den Fragmenten befindet sich ganz unten im Code in .

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; 
    } 
} 

Antwort

0

Schritt # 1: Haben LocationFragmentOnMapReadyCallback implementieren.

Schritt # 2: Verschieben Sie alle Ihre aktuellen onViewCreated() Logik in onMapReady() (wird von OnMapReadyCallback)

Schritt # 3: In onViewCreated(), rufen getMapAsync(this)

+0

Dank! Das war ein Problem, das ich hatte. –

Verwandte Themen