java - 带有嵌套谷歌地图 fragment 的 fragment 中后按 NullPointerException

标签 java android google-maps android-fragments nullpointerexception

我有一个使用多个 fragment 显示内容的 Activity 。这些 fragment 之一需要在其中显示谷歌地图 fragment 。我已经使用下面的代码正确显示了 map fragment ,并且该应用程序可以在不同 fragment 之间正常转换,但是,每次我通过按带有 map 的 fragment 的后退按钮退出应用程序时,我都会收到一条 android 错误警报消息,并且logcat 中出现以下 nullpointerException 错误。日志响应没有指向我的代码中可以处理异常的任何地方。我认为问题出在 ondestroyView() 方法上,但我目前对 fragment 了解不够,无法修复它。有什么想法吗?

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)

这是发生错误的 fragment :

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

fragment 的 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 类中控制 fragment 的部分。

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

最佳答案

经过长时间的研究,我遇到了同样的问题,我发现了以下答案:-

@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();
        }
    }
}

关于java - 带有嵌套谷歌地图 fragment 的 fragment 中后按 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21047497/

相关文章:

java - Java 中是否可以有无限数量的类型参数?

java - 创建类似于MouseListener的Listener

java - 二进制 XML 文件行 #7 : You must supply a layout_width attribute

android - phonegap 失败 - cordova.js 错误 3725

android - 通过 Android Intent 在 Google map 中添加多个航路点

iphone - 如何将文本的 nsstring 值转换为 objective-c 中的 CLLocationCoordinate2D for google map

java - 突然通知没有从 java 服务器到达 Android

android - 三星 S3 中 onActivityResult(int requestCode, int resultCode, Intent data) 中的相机 Intent 数据为空

android - netstream 无法在 adobe air - amazon s3 - signed cloudfront 上运行

android - Activity 中间区域的谷歌地图