gia*_*doe 4 android single-instance fragmentpageradapter
我找到了像我这样的类似问题的主题但是找不到我到目前为止找到的答案.我的应用程序包含一个FragmentActivity托管ViewPagerAdapter(FragmentPagerAdapter的子代)并在每个选项卡中包含一个片段的应用程序.我的ViewPagerAdapter在父活动的OnCreateView函数中实例化
_adapter = new ViewPagerAdapter(getApplicationContext()
, getSupportFragmentManager()
, numOfTabs
, status);
Run Code Online (Sandbox Code Playgroud)
ViewPagerAdapter实现了所需的最少方法 getItem,getCount以及getItemPosition
我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;
}
Run Code Online (Sandbox Code Playgroud)
要将呼叫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;
}
Run Code Online (Sandbox Code Playgroud)
一个更重要的信息是父活动被声明为singleInstance,我想保留这个由于某些原因.
一切正常,但在某些时候,当活动在后台运行一段时间后,我尝试通过TaskManager或单击应用程序图标返回到它我得到异常
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
Run Code Online (Sandbox Code Playgroud)
类名肯定存在,它是公共的,并且没有像空的那样的构造函数.我甚至显式地添加了一个空构造函数但是这也没有帮助,尽管我验证它被调用.
从我从各种帖子中了解到的是Android在恢复应用程序时,将FragmentPagerAdapter放置在未链接到原始活动的片段的新实例中.我也验证了这一点,因为当从片段内部调用getActivity时我收到null ..但我不明白为什么我得到这个例外,因为有一个空的构造函数...我甚至不知道在哪里修复这个,因为执行进入活动的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)
Run Code Online (Sandbox Code Playgroud)
请注意$1错误的结尾.这是对匿名类的引用,而不是名为的片段FragmentNearbyOffers:
无法实例化片段com.advisor.FragmentNearbyOffers $ 1
由于片段需要默认构造函数,并且匿名类永远不能提供,因此片段必须始终是命名类.在Java语言规范,部分15.9.5.1状态:
匿名类不能具有显式声明的构造函数.
本节还解释了根据声明匿名类的上下文自动生成构造函数.所有这些构造函数都有参数,因此它们具有与默认构造函数不同的签名.结合的效果是匿名类永远不会有一个与默认构造函数的签名匹配的构造函数.
您可以在其自己的文件中声明片段类,也可以将其声明为静态嵌套类:
public static class NestedFragment extends BaseFragment { ...
Run Code Online (Sandbox Code Playgroud)
这两种方法都应该可以正常工作.
| 归档时间: |
|
| 查看次数: |
12236 次 |
| 最近记录: |