【问题标题】:HTC Android Crash Report Fragment OnCreateHTC Android 崩溃报告片段 OnCreate
【发布时间】: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


【解决方案1】:

从外观上看,mXmlId 是基于 Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0 的 0。从您的onCreate 来看,这不足为奇。您依赖在调用onCreate 时设置mXmlId。如果您的片段因屏幕旋转更改而被破坏,您将在片段上调用 ​​onDestroy > onCreate,并使用Bundle 中的任何保存值。您没有使用捆绑包,因此不会重新填充该字段。

为了记录,这样做的“正确”方法是使用setArguments(Bundle) 将构造函数参数传递给Fragment。有关用于创建片段的 newInstance 模式的信息,请参阅 http://developer.android.com/reference/android/app/Fragment.html

【讨论】:

  • 我无法重现这个旋转问题或任何其他问题,但我会接受这可能是原因。希望这能解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多