2013-05-09 99 views
4

我发现了类似于我的问题的主题,但找不到我目前为止所找到的答案。 我的应用程序由一个FragmentActivity组成,其中包含ViewPagerAdapter(FragmentPagerAdapter的子项),每个选项卡中都有一个片段。 我ViewPagerAdapter在父活动java.lang.InstantiationException:无法实例化类...没有空的构造函数

_adapter = new ViewPagerAdapter(getApplicationContext() 
         , getSupportFragmentManager() 
         , numOfTabs 
         , status); 

的ViewPagerAdapter的OnCreateView功能实例实现了最小所需的方法getItemgetCountgetItemPosition

getItem初始化不同片段的每个位置:

@Override 
public Fragment getItem(int position) 
{ 
    Fragment f = new Fragment(); 
    Log.d("Adbox",String.format("Inside ViewPagerAdapter.getItem(%s)",position)); 

    switch(position) 
    { 
     case 0: 
      Log.d("Adbox","All offers =="); 
      f=FragmentAllOffers.newInstance(_context); 
      f.setRetainInstance(true); 
      break; 
     case 1: 
      Log.d("Adbox","Nearby offers =="); 
      f=FragmentNearbyOffers.newInstance(_context); 
      //f.setRetainInstance(true); 
      break; 
     case 2: 
      Log.d("Adbox","My coupons =="); 
      f=FragmentCoupons.newInstance(_context); 
      f.setRetainInstance(true); 
      break; 
     case 3: 
      Log.d("Adbox","Account =="); 
      f=FragmentAccount.newInstance(_context); 
      f.setRetainInstance(true); 
      //f=LayoutLocal.newInstance(_context); 
      break; 
     case 4: 
      Log.d("Adbox","Preferences =="); 
      f=FragmentPreferences.newInstance(_context); 
      f.setRetainInstance(true); 
      break; 
     default: 
      break; 
    } 
    return f; 
} 

致电setRetainInstance(true)是为了解决我的问题而添加的面对但也没有帮助。

最后,上面的每个片段实现了一个公共静态newInstance()函数,其中应用程序上下文作为参数。例如,FragmentNearbyOffers包含以下内容:

public static android.support.v4.app.Fragment newInstance(Context ctx) 
{ 
    FragmentNearbyOffers f = new FragmentNearbyOffers(); 
    ctx = context; 
    //Bundle bdl = new Bundle(); 
    return f; 
} 

一个更重要的信息是父活动被声明为singleInstance,我想保持这种类似这样的一些原因。

一切工作正常,但在某些时候,当活动是在后台一段时间,我尝试要么通过任务管理器或通过点击应用程序图标我得到的异常返回到它

android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.advisor.FragmentNearbyOffers$1: make sure class name exists, is public, and has an empty constructor that is public 

类名肯定存在,它是公共的,并没有一个构造函数,就像有一个空的构造函数。我甚至明确添加了一个空的构造函数,但这也没有帮助,虽然我证实它被调用。

从我从这里的各种帖子了解到的是,Android在恢复应用程序时,正在将未链接到原始活动的碎片的新实例放置在FragmentPagerAdapter中。我验证了这一点,这也是因为在调用getActivity时在我收到空片段 但我不明白为什么我得到这个异常,因为有一个空的构造函数...我不知道在哪里解决这个,因为执行进入的onCreate活动,然后立即进入片段的空构造函数,然后我得到异常..片段的任何其他方法,即onAttach,onCreate等根本不会被调用..因此,似乎它实际上是在构造片段时崩溃。 。

我附上整个堆栈跟踪我得到以防万一它有助于:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.advisor/com.advisor.AdBoxWidgetConfigurationFragment}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.advisor.FragmentNearbyOffers$1: make sure class name exists, is public, and has an empty constructor that is public 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
    at android.app.ActivityThread.access$700(ActivityThread.java:140) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4921) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.advisor.FragmentNearbyOffers$1: make sure class name exists, is public, and has an empty constructor that is public 
    at android.support.v4.app.Fragment.instantiate(Fragment.java:399) 
    at android.support.v4.app.FragmentState.instantiate(Fragment.java:97) 
    at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1760) 
    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:200) 
    at com.advisor.AdBoxWidgetConfigurationFragment.onCreate(AdBoxWidgetConfigurationFragment.java:60) 
    at android.app.Activity.performCreate(Activity.java:5206) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 
    ... 11 more 
Caused by: java.lang.InstantiationException: can't instantiate class com.advisor.FragmentNearbyOffers$1; no empty constructor 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1319) 
    at android.support.v4.app.Fragment.instantiate(Fragment.java:388) 
+0

我想你应该发布你的整个FragmentActivity类 – 2013-05-09 14:54:36

+0

。你有没有尝试重新启动eclipse? – Blackbelt 2013-05-09 15:14:40

+0

我设法解决了这个问题..这是一个非常棘手的问题,因为这个异常消息是误导性的。在我的片段中,我有另一个嵌套的片段,我在运行时创建了一个内部类。 '' – giannisdoe 2013-05-11 18:18:09

回答

2

我设法解决这个问题。它是相当棘手的一个,因为异常消息是误导。在我的片段中,我有另一个嵌套的片段,我在运行时创建了一个内部类。

 mMapFragment = new SupportMapFragment() 
    { 
     @Override 
     public void onResume() 
     { 
      // TODO Auto-generated method stub 
      super.onResume(); 
      //initMap(); 
     } 

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

      map = mMapFragment.getMap(); 
      if (map != null) 
      { 
       // map.setMapType(GoogleMap.MAP_TYPE_NONE); 
       map.setMyLocationEnabled(true); 
       CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(lat, lng)); 
       zoom = CameraUpdateFactory.zoomTo(18); 
       map.moveCamera(center); 
       map.animateCamera(zoom); 
      } 

     } 
    }; 

由于应用程序是由Android杀害后,恢复回它的时候,机器人再现的片段,我猜它不可能重新嵌套一个因为内部类的构造函数是不可见的。按照其他一些帖子的建议,我把课程移到了一个单独的文件中,并且它工作正常。

+0

我在同一个文件中声明它是一个公共静态类,它也可以正常工作。片段实例不能是匿名类。 – 2013-05-31 20:49:59

7

注意错误结束时的$1。这是一个匿名类的引用,没有命名FragmentNearbyOffers片段:

无法实例片段com.advisor.FragmentNearbyOffers $ 1

由于片段需要一个默认的构造函数和匿名类不能提供一,片段必须始终是一个命名类。该Java Language Specification, section 15.9.5.1状态:

匿名类不能有一个明确的声明的构造。

本节还解释了构造函数是根据声明匿名类的上下文自动生成的。所有这些构造函数都有参数,因此它们具有与默认构造函数不同的签名。综合的效果是匿名类永远不会有一个匹配默认构造函数签名的构造函数。

您可以声明片段类在它自己的文件或声明为一个Static Nested Class和

public static class NestedFragment extends BaseFragment { ... 

两种这些方法应该只是罚款。

相关问题