2

我有一個活動,顯示使用多個片段的內容。其中一個片段需要在其中顯示Google地圖片段。我有地圖片段正確顯示下面的代碼和應用程​​序工作正常過渡不同的片段之間,但是,每次我退出應用程序通過按地圖片段後退按鈕,我得到一個android錯誤警報消息和logcat中出現以下nullpointerexception錯誤。日誌響應不會指向我的代碼中可以處理異常的任何地方。我認爲問題在於ondestroyView()方法,但目前我還不知道有關碎片的問題以解決問題。有任何想法嗎?NullPointerException在背部按下片段與嵌套谷歌地圖片段

logcat的錯誤:

01-10 14:15:42.888: E/AndroidRuntime(15039): FATAL EXCEPTION: main 
01-10 14:15:42.888: E/AndroidRuntime(15039): java.lang.NullPointerException 
01-10 14:15:42.888: E/AndroidRuntime(15039): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1410) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at android.os.Handler.handleCallback(Handler.java:725) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at android.os.Looper.loop(Looper.java:137) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at android.app.ActivityThread.main(ActivityThread.java:5041) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at java.lang.reflect.Method.invokeNative(Native Method) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at java.lang.reflect.Method.invoke(Method.java:511) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-10 14:15:42.888: E/AndroidRuntime(15039): at dalvik.system.NativeStart.main(Native Method) 

這裏是發生錯誤的片段:

public class HomeFragment extends Fragment { 


public HomeFragment(){} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_home, container, false); 

    return rootView; 
} 


public void onDestroyView() { 

    Fragment fragment = (getFragmentManager().findFragmentById(R.id.mainmap)); 
    FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); 
    ft.remove(fragment); 
    ft.commit(); 

    super.onDestroyView(); 
} 

爲片段的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" 
    android:background="@color/bg"> 

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

控制片段的MainActivity類的部分。

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ... 

    } 


    // Display fragment view 
    private void displayView(int position) { 

     Fragment fragment = null; 

     switch (position) { 
     case 0:   
      fragment = new HomeFragment(); 
      break; 
     case 1: 
      fragment = new PromotionsFragment(); 
      break; 
     case 2: 
      fragment = new ProfileFragment(); 
      break; 
     case 3: 
      fragment = new SettingsFragment(); 
      break; 
     default: 
      break; 
     } 


     if (fragment != null) { 

      FragmentManager fragmentManager = getFragmentManager(); 

      fragmentManager.beginTransaction() 
        .replace(R.id.frame_container, fragment).commit(); 

     } else { 
      // error in creating fragment 
      Log.e("MainActivity", "Fragment creation error"); 
     } 
    } 
+1

接下來的問題是,如果你想退出應用程序,你爲什麼刪除片段,如果活動將被銷燬反正 –

+1

片段之間的轉換我得到了一個InflateException如果我沒有刪除次,當我發現e地圖碎片上的摧毀。 – user1996723

+0

我也有同樣的問題,你有沒有得到任何解決方案? –

回答

-1

試試這個。添加FragmentManager靜態字段在類

private static FragmentManager mFragmentManagerSupport; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      mFragmentManagerSupport = this.getSupportFragmentManager(); 

      .... 

     } 

,當你第一次調用片段,你需要調用「添加」或「替換」的方法是這樣的。

mFragmentManagerSupport.beginTransaction() 
     .replace(R.id.content_frame, mContent) 
     .commit(); 

沒有這個你的fragmentmanager將有0個片段。

+0

嗨,謝謝你,雖然沒有修復它。我在我的MainActivity中的代碼初始化片段已經是這樣的。唯一的區別是我的代碼不使用靜態FragmentManager。我添加了靜態字段以查看它是否可以工作,但沒有任何改變。 – user1996723

+0

剛剛更新我的問題,以包括我的MainActivity類的相關部分。 – user1996723

0

如果在XML文件中聲明瞭UI元素,則不能刪除它。如果你想要某些元素是可移動的,你必須從代碼中添加它們,而不是使用XML。此外,在您尚未添加的onDestroyView中刪除它並沒有意義。

0

你只需要初始化FragmentManager和片段爲全局變量 這就是我所做的事情,對我的工作:

private static FragmentManager fragmentManager; 
private Fragment fragment = null; 
6

我經過長期的研究,我發現下面的答案後不得不面對同樣的問題: -

@Override 
public void onDestroyView() 
{ 
    super.onDestroyView(); 
    SupportMapFragment f = (SupportMapFragment) getFragmentManager().findFragmentById(R.id.map); 
    if (!getActivity().isFinishing()) 
    { 
     if (f != null) 
     { 
      getFragmentManager().beginTransaction().remove(f).commit(); 
     } 
    } 
}