0

이 문제를 해결하기 위해 노력하고 있습니다. stackoverflow 및 다른 소스에 대한 비슷한 문제에 대해 많은 질문을 읽었습니다. 모든 소스를 나열 할 수는 없습니다.두 번째로드에서 SupportMapFragment null

내 문제는 내가 조각에 액세스하려고 두 번째에인가 ... 내가지도 모든 작동 잘으로 조각을로드하려고 처음부터 읽은 다른 사람과 다른 에 널 포인터와 응용 프로그램이 충돌를 다시 시작하지 않고지도 :

googleMap = map.getMap(); 

맵이 null이기 때문에 :

map = (SupportMapFragment) myContext.getSupportFragmentManager(). 
      findFragmentById(R.id.map); 
,

주요 차이점은 다음과 같습니다

  • 잘 작동 처음
  • findFragmentById는 null를 돌려 두 번째 시간,하지만 AVD 에뮬레이터가 있기 때문에

내가 그것을 디버깅 할 수없는 오류 Google Play 서비스가 설치되지 않았습니다.

MainActivity에는 NavigationDrawer가 있으며 선택한 옵션에 따라 Fragment 또는 다른 항목이 선택됩니다. 다음은이 문제와 관련된 일부 코드 :

fragment_map.xml :

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <fragment 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

MyFragment.java :

... 
import android.support.v4.app.DialogFragment; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
... 
public class MyFragment extends Fragment implements 
     GooglePlayServicesClient.ConnectionCallbacks, 
     GooglePlayServicesClient.OnConnectionFailedListener { 

    private GoogleMap googleMap; 
    private View fragmentView; 
    private static WorldFragment fragment; 
    private FragmentActivity myContext; 
    ... 

    public static MyFragment getInstance() { 
     if (fragment == null) { 
      fragment = new MyFragment(); 
     } 
     return fragment; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     myContext = (FragmentActivity) activity; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     try { 
      GlobalState gs = (GlobalState) getActivity().getApplication(); 
      // recover View from previous use 
      fragmentView = gs.getWorldFragmentView(); 
      if (fragmentView == null) { 
       fragmentView = inflater.inflate(R.layout.fragment_map, 
            container, false); 
       // save View for next use 
       gs.setFragmentView(fragmentView); 
      } else { 
       ViewGroup parent = (ViewGroup) fragmentView.getParent(); 
       parent.removeView(fragmentView); 
      } 
     } catch (InflateException e) { 
      // map is already there, just return view as it is 
     } 
     return fragmentView; 
    } 

    ... 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // Set up the map fragment 
     SupportMapFragment map = (SupportMapFragment) myContext. 
      getSupportFragmentManager().findFragmentById(R.id.map); 
     /* // If I active this code, no crash, but fragment remains 
      // in gray background without map. 
      // At least, if the app crashes, it restarts and the map 
      // gets loaded the first time 
     if (map == null) { 
      Toast.makeText(getActivity(), getString(R.string.maps_not_supported), 
        Toast.LENGTH_LONG).show(); 
      return; 
     } */ 
     googleMap = map.getMap(); 
     if (googleMap != null) { 
      // Enable the current location "blue dot" 
      googleMap.setMyLocationEnabled(true); 
      ... 
     } else { 
      Toast.makeText(getActivity(), getString(R.string.maps_not_supported), 
        Toast.LENGTH_LONG).show(); 
     } 
    } 

    ... 
} 

MainActivity.java :

public class MainActivity extends FragmentActivity implements 
    NavigationDrawerFragment.NavigationDrawerCallbacks { 

    @Override 
    public void onNavigationDrawerItemSelected(int position) { 
     Fragment contentFragment; 
     switch (selectedOption) { 
      case MAP: 
       contentFragment = MyFragment.getInstance(); 
       break; 
      case XXX: 
       ... 
       break; 
      default: 
       contentFragment = new OtherFragment(); 
     } 
     // update the main content by replacing fragments 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.container, contentFragment) 
       .commit(); 
    } 
} 

스택 트레이스 :

java.lang.NullPointerException 
    at xxx.xxxxx.xxx.fragments.MyFragment.onActivityCreated(MyFragment.java:193) 
    at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1508) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:958) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478) 
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446) 
    at android.os.Handler.handleCallback(Handler.java:725) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:153) 
    at android.app.ActivityThread.main(ActivityThread.java:5297) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
    at dalvik.system.NativeStart.main(NativeStart.java) 

, 당신은 몇 가지 자세한 정보가 필요하면 알려 주시기 바랍니다.

시간과 노력에 감사드립니다.

30/12/2014

: MainActivity의에서 onCreate의 소스 코드() 메소드

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    GlobalState applicationContext = (GlobalState) getApplicationContext(); 
    applicationContext.updateLocale(); 

    NavigationDrawerFragment.setItems(applicationContext.getMenuItems()); 
    setContentView(R.layout.activity_main); 

    mNavigationDrawerFragment = (NavigationDrawerFragment) 
      getFragmentManager().findFragmentById(R.id.navigation_drawer); 
    mTitle = getTitle(); 

    // Set up the drawer. 
    mNavigationDrawerFragment.setUp(
      R.id.navigation_drawer, 
      (DrawerLayout) findViewById(R.id.drawer_layout)); 

    // Treating incoming notifications 
    Intent intent = getIntent(); 
    String action = intent.getAction(); 
    if (action != null && !action.isEmpty()) { 
     ItemType itemType = ItemType.valueOf(action); 
     String title = applicationContext.getMenuItemByType(itemType).getTitle(); 
     String itemId = null; 
     try { 
      JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data")); 
      itemId = json.getString(EXTRA_ITEM_ID); 
     } catch (JSONException e) { 
      Crashlytics.logException(e); 
     } 
     launchFragment(itemType, null, title, itemId); 
    } 
} 

답변

1

당신은 당신의 MyFragment 클래스의 onDestroyView() 메소드의 조각을 제거해야합니다.

@Override 
    public void onDestroyView() { 
     SupportMapFragment f = (SupportMapFragment)myContext.getSupportFragmentManager().findFragmentById(R.id.map); 

     if (f != null) { 
      try { 
       myContext.getSupportFragmentManager().beginTransaction().remove(f).commit(); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     super.onDestroyView(); 
    } 
+0

안녕하세요, 감사합니다,하지만 작동하지 않습니다

샘플 코드를 제거합니다. onDestroy보기에서이 예외가 발생합니다. java.lang.IllegalStateException : onSaveInstanceState android.support.v4.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1354) at ... 후에이 작업을 수행 할 수 없습니다.enqueueAction (FragmentManager.java:1372) at ... .BackStackRecord.commitInternal (BackStackRecord.java:595) at ... .commit (BackStackRecord.java:574) at ... .fragments.MyFragment.onDestroyView (MyFragment.java:183) ... 다음에 onActivityCreated에 대해 이전과 같은 pb를 입력하십시오. – MarionaDSR

+0

MainActivity의 onCreate() 메소드의 소스 코드를 제공 할 수 있습니까? – ztan

+0

메인 포스트를 편집하여 MainActivity의 onCreate() 메소드 소스 코드 추가 – MarionaDSR

관련 문제