2017-03-01 1 views
0

기본 안드로이드 응용 프로그램을 만들려고합니다. 탐색 서랍 활동,지도 조각 및 프로필 조각이 있습니다. 지도 조각을 구현하기 전에 애플리케이션이 원활하게 실행되었지만 이제는 계속 충돌합니다. 이전에 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는 null입니다.

+0

fragment_map에 해당보기가 포함되어 있습니까? 태그를 달고 태그로 찾으십시오. – Remario

0

나머지 오류 로그를 볼 수 없습니다. 일반적으로 더 아래로 스크롤하면 문제가 발생한 코드의 줄을 가리키는 링크가 표시됩니다.

그러나 MapView처럼 프래그먼트에 동일한 ID를 사용하고있는 것으로 보입니다. 이들은 서로 달라야합니다.

관련 문제