【发布时间】:2014-01-21 19:10:00
【问题描述】:
在下面的崩溃报告中,我看到了一些奇怪的东西。这发生在运行 4.3 的 HTC One 上,我无法访问这些手机进行调试,但它看起来像是在我的 PenelopeMainActivity(扩展活动)期间在 super.onCreate()第 236 行期间创建我的 SettingFragment(扩展 PreferenceFragment)。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.harmonicprocesses.penelopefree/com.harmonicprocesses.penelopefree.PenelopeMainActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2517)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2574)
at android.app.ActivityThread.access$600(ActivityThread.java:162)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1413)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:5789)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:843)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.content.res.Resources.getValue(Resources.java:1129)
at android.content.res.Resources.loadXmlResourceParser(Resources.java:2354)
at android.content.res.Resources.getXml(Resources.java:994)
at android.preference.GenericInflater.inflate(GenericInflater.java:261)
at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:272)
at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:285)
at com.harmonicprocesses.penelopefree.settings.SettingsFragment.onCreate(SettingsFragment.java:62)
at android.app.Fragment.performCreate(Fragment.java:1775)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:863)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1101)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083)
at android.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1989)
at android.app.Activity.onCreate(Activity.java:929)
at com.harmonicprocesses.penelopefree.PenelopeMainActivity.onCreate(PenelopeMainActivity.java:236)
at android.app.Activity.performCreate(Activity.java:5195)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2473)
... 11 more
现在 SettingsFragment 使用在调用 super.OnCreate() 之后设置的 XmlId。事实上,调用 OnCreate() 时不应该有 SettingsFragment 的实例。我错过了什么吗?当进程被杀死时,这可能与 onStop() 和 onStart() vs onCreate() 有关吗?
但它应该从一开始就重新创建 onCreate(),而不是尝试构建设置菜单,即使设置菜单已打开?对吧?
这里是onCreate方法和xmlId设置方法 com.harmonicprocesses.penelopefree.settings.SettingsFragment.onCreate()
public SettingsFragment setXmlId(int xmlId){
mXmlId = xmlId;
return this;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAct = getActivity();
mRes = mAct.getResources();
mFrag = getFragmentManager();
// Load the preferences from an XML resource
addPreferencesFromResource(mXmlId); // <<<-------------------*** LINE 62 ***
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(preferenceChangeListener);
}
这是我创建 SettingsFragment 实例的地方:
public boolean onOptionsItemSelected(MenuItem item){
mHideHandler.removeCallbacks(mHideRunnable);
if (item.getItemId() == R.id.options_menu_special_efects) {
//Intent intent = new Intent(this, SpecialEffects.class);
mSettingsFragment = new SettingsFragment().setXmlId(R.xml.special_effects);
mSettingsFragment.setContext(mContext)
.setPurchaseManager(purchaseManager)
.setAudioProcessor(mAudioProcessor)
.setPcam(mPcamera);
getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, mSettingsFragment)
.commit();
mFragmentViewGroup.setVisibility(View.VISIBLE);
mSystemUiHider.hide();
mSystemUiHider.disable();
}
return false;
}
【问题讨论】:
-
看起来您在某处将资源参数值设为 0。这似乎很明显,但如果您通过查看代码没有看到它是如何发生的,那么您应该尝试在模拟器上重现它。如果它与错误的生命周期管理有关,您可能已经在开发过程中重现了它。
-
没错。添加了更多代码以显示如何设置 XmlId(即资源参数值 0)。这可能是打开设置菜单时方向发生变化的时候吗?让我测试一下。
-
您是否将 Bundle 中的所有参数传递给您的片段 - 使用 setArguments() 片段方法?
-
不,我没有使用捆绑包。我可能应该。我将更新它以使用 Bundle args,希望这将纠正错误。反正不会受伤:)
标签: android android-fragments android-activity