Android 片段-实例化异常:没有空构造函数->;谷歌地图v2?

Android 片段-实例化异常:没有空构造函数->;谷歌地图v2?,android,constructor,fragment,instantiationexception,Android,Constructor,Fragment,Instantiationexception,当我通过应用程序更改按钮再次打开已关闭的应用程序时,我收到此错误消息: 原因:java.lang.实例化异常:无法实例化类com.*.FragmentContact$1;没有空构造函数 我发现了一些关于内部类和使它们成为静态类等的技巧。但是这个FragmentContact是*.java文件中的公共类,并且有一个公共空构造函数。 我在这个项目中使用Google Maps Api v2,并在internet上的某个地方做了一个技巧来设置我的MapView。看这里: @Override publi

当我通过应用程序更改按钮再次打开已关闭的应用程序时,我收到此错误消息:

原因:java.lang.实例化异常:无法实例化类com.*.FragmentContact$1;没有空构造函数
我发现了一些关于内部类和使它们成为静态类等的技巧。但是这个FragmentContact是*.java文件中的公共类,并且有一个公共空构造函数。 我在这个项目中使用Google Maps Api v2,并在internet上的某个地方做了一个技巧来设置我的MapView。看这里:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_contact, null);

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

    fragment = new SupportMapFragment() {
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            mMap = fragment.getMap();
            if (mMap != null) {
                setupMap();
            }
        }
    };

    getFragmentManager().beginTransaction().replace(R.id.fragment_orte_map_parent, fragment).commit();

    return v;
}
当我把地图视图的东西剪下来的时候,一切都很好。也许有人能解释我做错了什么

我的完整堆栈跟踪:

致命异常:main
java.lang.RuntimeException:无法启动活动组件信息{com.*/com.*.MainActivity}:android.support.v4.app.Fragment$InstantiationException:无法实例化Fragment com.*.FragmentContact$1:确保类名存在,是公共的,并且具有公共的空构造函数
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2357)
在android.app.ActivityThread.access上$600(ActivityThread.java:153)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:5226)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
在dalvik.system.NativeStart.main(本机方法)
原因:android.support.v4.app.Fragment$instanceionException:无法实例化Fragment com.*.FragmentContact$1:确保类名存在、是公共的,并且有一个公共的空构造函数
位于android.support.v4.app.Fragment.instantiate(Fragment.java:405)
位于android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
位于android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1767)
位于android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:208)
位于com.*.MainActivity.onCreate(MainActivity.java:20)
位于android.app.Activity.performCreate(Activity.java:5104)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)上
... 还有11个
原因:java.lang.InstanceException:无法实例化类com.*.FragmentContact$1;没有空构造函数
位于java.lang.Class.newInstanceImpl(本机方法)
位于java.lang.Class.newInstance(Class.java:1319)
位于android.support.v4.app.Fragment.instantiate(Fragment.java:394)
... 还有18个
但是这些FragmentContact是*.java文件中的一个公共类,并且有一个公共空构造函数

该错误不是抱怨
片段contact
。它正在抱怨第一个内部类
FragmentContact
FragmentContact$1
)。不能将
片段
实现为任何内容的内部类,因为它不能从外部类实例化。
static
内部类就可以了

  private Entity mEntity;
  public YourFragment() {}
  public static YourFragment getInstance(Entity mEntity) {
    YourFragment fragment = new YourFragment();
    fragment.mEntity = mEntity;
    return fragment;
  }

当您使用这个片段时,只需调用静态方法
getInstance

这个问题我已经有很多年了,最后这里的注释为我解决了这个问题。关于
$1
这意味着匿名内部类的好信息

将地图初始化移动到一个新的公共类,例如
MyMapFragment.java
。这将允许在不使用实例的情况下实例化片段

对于那些仍然不确定如何修复它的人。编写如下代码(使用原始问题中的示例代码):

创建新的
MyMapFragment.java
,使其不再是一个内部类。这将允许在没有外部类的情况下创建片段

public class MyMapFragment extends SupportMapFragment 
{
    GoogleMap mMap;
    public MyMapFragment() {
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
         mMap = fragment.getMap();
         if (mMap != null) {
             mCallback.onLoaded(mMap);
        }
    }
}    
创建
MapLoadedCallback.java
,允许您处理地图何时完成加载以及检索已加载地图对象的实例

public interface MapLoadedCallback {
    void onLoaded(GoogleMap map);
}

对不起,是我的错。我不认识匿名内部类,因为我一直在考虑非匿名内部类。你完全正确。我重写了activitycreated(Bundle savedInstanceState)上的
公共void
,因此我使用了一个匿名内部类。真丢脸…@Osiriz:
$1
意味着它是一个匿名的内部类——否则,它将是
$whateyoucalledtheinerClass
。话虽如此,我在最初阅读您的代码时错过了它,以为它在其他文件中。我必须承认,我甚至不知道stacktrace中
$1
的含义,直到现在。很多坦克!你好,我面临着同样的问题。。。我真的不懂这些解释,也不懂怎么解释。。避免这个问题的最简单方法是什么?@Waza_Be:不要将片段创建为常规(非静态)内部类。它们需要是静态内部类或常规(独立)Java类。。。因为这不是静态的内部类。。。唯一的区别是,这不是匿名的…@塞尔文:我不知道你的意思。由于该类不再是匿名的,因此问题得以解决。如果是静态的,这个问题本来就不存在,因为静态内部类可以正确解决。内部非静态类仍然没有空构造函数(在外部类范围之外)。。。您不能调用
new Outer.internal()
(是的,您可以调用
new internal()
inside
Outer
片段。实例化
不能这样做)--换句话说:java的基础。。。内非静态氯离子
public interface MapLoadedCallback {
    void onLoaded(GoogleMap map);
}