【问题标题】:HoloEverywhere + ListPreference = CrashHoloEverywhere + ListPreference = 崩溃
【发布时间】:2012-12-21 02:02:47
【问题描述】:

我一直在努力让 ListPreference 与 HoloEverywhere 合作。 我在一个 XML 文件中定义了我的设置。我为属性使用了 holo 命名空间。与首选项相关的所有内容都使用 org.holoeverywhere 包中的类,因此问题出在其他地方。

当我在我的应用程序中单击 ListPreference 时会出现问题。首选项应打开一个对话框,其中包含可供选择的选项。相反,它崩溃了,给了我以下堆栈跟踪:

12-20 09:42:59.363: E/AndroidRuntime(3005): FATAL EXCEPTION: main
12-20 09:42:59.363: E/AndroidRuntime(3005): java.lang.NullPointerException
12-20 09:42:59.363: E/AndroidRuntime(3005):     at org.holoeverywhere.ArrayAdapter.createViewFromResource(ArrayAdapter.java:204)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at org.holoeverywhere.ArrayAdapter.getView(ArrayAdapter.java:250)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.AbsListView.obtainView(AbsListView.java:2267)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.ListView.onMeasure(ListView.java:1156)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.View.measure(View.java:15172)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at org.holoeverywhere.widget.LinearLayout.measureChildWithMargins(LinearLayout.java:233)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.View.measure(View.java:15172)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at org.holoeverywhere.widget.LinearLayout.measureChildWithMargins(LinearLayout.java:233)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.View.measure(View.java:15172)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.View.measure(View.java:15172)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.View.measure(View.java:15172)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.View.measure(View.java:15172)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.View.measure(View.java:15172)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1075)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.Choreographer.doCallbacks(Choreographer.java:555)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.Choreographer.doFrame(Choreographer.java:525)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.os.Handler.handleCallback(Handler.java:615)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.os.Looper.loop(Looper.java:137)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at android.app.ActivityThread.main(ActivityThread.java:4745)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at java.lang.reflect.Method.invokeNative(Native Method)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at java.lang.reflect.Method.invoke(Method.java:511)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-20 09:42:59.363: E/AndroidRuntime(3005):     at dalvik.system.NativeStart.main(Native Method)

我目前使用的是PreferenceFragment,但当我尝试使用addPreferencesFromResource(int) 直接在PreferenceActivity 中添加首选项时,会发生完全相同的事情。

列表首选项 (XML) 本身:

    <ListPreference
        holo:defaultValue="false"
        holo:dialogTitle="@string/sett_inet_access_dial"
        holo:entries="@array/sett_inet_access_names"
        holo:entryValues="@array/sett_inet_access_values"
        holo:key="@string/keysett_inet_access"
        holo:summary="@string/sett_inet_access_summ"
        holo:title="@string/sett_inet_access_name" />

我还想补充一点,我的所有 ListPreference 项目都会发生这种情况(我有多个)。

【问题讨论】:

  • 好的。我发现了一些有趣的事情。这似乎只发生在我的模拟器上(在我的例子中是 Jar of Beans)。我已经在两个物理设备(4.2 和 4.1)上对其进行了测试,它在那里工作......奇怪......物理设备上唯一的错误是首选项对话框完全忽略了我的应用程序的主题并恢复为库存全息外观。
  • 不幸的是,这不仅仅是一个模拟器问题。我刚刚在运行 4.0.4 的 SGSIII 上尝试过,同样的问题出现了......
  • 我现在想到的唯一解决方案是实现我自己的ListPreference,我想避免这样做......

标签: android android-preferences listpreference android-holo-everywhere


【解决方案1】:

好的。我想通了。

事实证明。 HoloEverywhere 1.4.0 中有一个错误。 该问题已被报告并修复: https://github.com/ChristopheVersieux/HoloEverywhere/issues/203

不幸的是,该修复尚未合并到 HE GitHub 项目的主分支。它静静地坐在开发分支上,很可能等待下一个版本......

所以如果你和我有同样的问题,那么你应该使用 dev 分支,或者 fork 存储库并将cherry-pick THIS 提交到你的 master 分支。

样式未正确应用于对话框的问题仍然存在。

【讨论】:

    【解决方案2】:

    查看source code

       private View createViewFromResource(int position, View convertView,
            ViewGroup parent, int resource) {
        View view;
        TextView text;
        if (convertView == null) {
            view = FontLoader.apply(mInflater.inflate(resource, parent, false));
        } else {
            view = convertView;
        }
        try {
            if (mFieldId == 0) {
                text = (TextView) view;
            } else {
                text = (TextView) view.findViewById(mFieldId);
            }
        } catch (ClassCastException e) {
            Log.e("ArrayAdapter",
                    "You must supply a resource ID for a TextView");
            throw new IllegalStateException(
                    "ArrayAdapter requires the resource ID to be a TextView", e);
        }
    
        T item = getItem(position);
        if (item instanceof CharSequence) {
            text.setText((CharSequence) item);
        } else {
            text.setText(item.toString());
        }
        return view;
    }
    

    textView好像是null,不是从layout解析出来的

    【讨论】:

    • 我确实这样做了。事实上,TextView 在这一行 view = FontLoader.apply(mInflater.inflate(resource, parent, false)); 中被正确实例化,但后来比较 if (mFieldId == 0) 失败,因此运行 text = (TextView) view.findViewById(mFieldId);,这使得文本 null...
    • 但就我所知...我不知道为什么会这样...我已经重建了所有项目,清理了它们等,以确保 @987654327 @ 文件是新鲜的,但这没有帮助。
    • 列表条目的布局在哪里?
    • 这是 ListPreference 的默认值。我没有自定义它,因为我没有必要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2011-11-22
    • 2021-05-14
    相关资源
    最近更新 更多