2017-03-01 62 views
0

我想创建一个基本的Android应用。我有导航抽屉活动,地图片段和配置文件片段。在实现地图片段之前,应用程序运行平稳,但现在不断崩溃。我之前通过实现nameOfFragment.OnFragmentInteractionListener方法解决了此问题。但地图没有这样的事情。我怎样才能解决这个问题?当碎片被替换时,应用会一直崩溃

这是我的主要活动代码:

package georgia.languagelandscape; 

//import android.app.FragmentManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.NavigationView; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

public class NavigationDrawerActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener, ProfileFragment.OnFragmentInteractionListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_navigation_drawer); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

     //me 
     navigationView.setItemIconTintList(null); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.navigation_drawer, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     FragmentManager fm = getSupportFragmentManager(); 

     FragmentTransaction ft = fm.beginTransaction(); 
     MapFragment mapFragment= new MapFragment(); 
     ft.replace(R.id.content_replace, mapFragment); 
     ft.commit(); 

     if (id == R.id.nav_feed) { 
      // Handle the camera action 
     } else if (id == R.id.nav_my_profile) { 

      ProfileFragment profileFragment= new ProfileFragment(); 
      ft.replace(R.id.content_replace, profileFragment); 
      ft.commit(); 

     } else if (id == R.id.nav_my_projects) { 

     } else if (id == R.id.nav_seetings) { 

     } else if (id == R.id.nav_log_out) { 

     } 

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

    @Override 
    public void onFragmentInteraction(Uri uri) { 

    } 
} 

,我的地图片段代码:

package georgia.languagelandscape; 

//import android.app.Fragment; 

import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapView; 
import com.google.android.gms.maps.MapsInitializer; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

//import android.support.v4.app.Fragment; 


/** 
* A simple {@link Fragment} subclass. 
* Activities that contain this fragment must implement the 
* {@link MapFragment.OnFragmentInteractionListener} interface 
* to handle interaction events. 
* Use the {@link MapFragment#newInstance} factory method to 
* create an instance of this fragment. 
*/ 
public class MapFragment extends SupportMapFragment implements OnMapReadyCallback { 

    MapView mMapView; 
    private GoogleMap googleMap; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // inflate and return the layout 
     View v = inflater.inflate(R.layout.fragment_map, container, 
       false); 
     mMapView = (MapView) v.findViewById(R.id.mapView); 
     mMapView.onCreate(savedInstanceState); 

     mMapView.onResume();// needed to get the map to display immediately 

     try { 
      MapsInitializer.initialize(getActivity().getApplicationContext()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager() 
       .findFragmentById(R.id.mapView)); 
     mapFragment.getMapAsync(this); 
     // latitude and longitude 
     double latitude = 17.385044; 
     double longitude = 78.486671; 

     // create marker 
     MarkerOptions marker = new MarkerOptions().position(
       new LatLng(latitude, longitude)).title("Hello Maps"); 

     // Changing marker icon 
     marker.icon(BitmapDescriptorFactory 
       .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); 

     // adding marker 
     googleMap.addMarker(marker); 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(new LatLng(17.385044, 78.486671)).zoom(12).build(); 
     googleMap.animateCamera(CameraUpdateFactory 
       .newCameraPosition(cameraPosition)); 

     // Perform any camera updates here 
     return v; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mMapView.onResume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mMapView.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mMapView.onDestroy(); 
    } 

    @Override 
    public void onLowMemory() { 
     super.onLowMemory(); 
     mMapView.onLowMemory(); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 

    } 
} 

我的崩溃日志:

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference 
                       at georgia.languagelandscape.MapFragment.onCreateView(MapFragment.java:57) 
                       at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298) 
                       at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323) 
                       at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136) 
                       at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092) 
                       at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1998) 
                       at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:709) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5451) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

谢谢!

+0

你能后的错误讯息?它通常告诉你什么导致了崩溃。 –

回答

0

由于您的Fragment扩展了SupportMapFragment,因此不需要膨胀任何xml布局。

你的整个片段类可以被减少到只有这个:

public class MapFragment extends SupportMapFragment implements OnMapReadyCallback { 

    private GoogleMap mGoogleMap; 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (mGoogleMap == null) { 
      getMapAsync(this); 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mGoogleMap = googleMap; 
     // latitude and longitude 
     double latitude = 17.385044; 
     double longitude = 78.486671; 

     // create marker 
     MarkerOptions marker = new MarkerOptions().position(
       new LatLng(latitude, longitude)).title("Hello Maps"); 

     // Changing marker icon 
     marker.icon(BitmapDescriptorFactory 
       .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); 

     // adding marker 
     googleMap.addMarker(marker); 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(new LatLng(17.385044, 78.486671)).zoom(12).build(); 
     googleMap.animateCamera(CameraUpdateFactory 
       .newCameraPosition(cameraPosition)); 
    } 
} 
+0

你救了我。你是上帝。谢谢 –

+0

还有一个问题。我可以用任何方式隐藏地图片段,当我与另一个切换? –

0
SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager() 
      .findFragmentById(R.id.mapView)); 
    mapFragment.getMapAsync(this); 

没有找到视图,因此mapFragment为空。

+0

fragment_map是否包含该视图?标记它并通过标记查找。 – Remario

0

我看不到其他错误日志。通常,如果您向下滚动,将会有一个链接指向您的代码中发生问题的行。

但是,您似乎使用与您的MapView相同的ID作为您的片段。这些应该是不同的。

相关问题