【问题标题】:EditTextPreference causes Inflate ExceptionEditTextPreference 导致 Inflate 异常
【发布时间】:2017-03-23 21:52:38
【问题描述】:

大约 1 小时后,在相关主题中寻找解决我的问题的方法后,我决定公开我的案例。就是这样:每次我尝试打开我的 PreferenceActivity 时都会遇到 InflateException。

日志

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: lineo.smarteam, PID: 5087
                  Theme: themes:{}
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{lineo.smarteam/lineo.smarteam.activity.SettingsActivity}: android.view.InflateException: Binary XML file line #5: Error inflating class lineo.smarteam.preference.MyEditTextPreference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5461)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: android.view.InflateException: Binary XML file line #5: Error inflating class lineo.smarteam.preference.MyEditTextPreference
                      at android.preference.GenericInflater.createItem(GenericInflater.java:388)
                      at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:432)
                      at android.preference.GenericInflater.rInflate(GenericInflater.java:483)
                      at android.preference.GenericInflater.rInflate(GenericInflater.java:495)
                      at android.preference.GenericInflater.inflate(GenericInflater.java:327)
                      at android.preference.GenericInflater.inflate(GenericInflater.java:264)
                      at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:273)
                      at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:304)
                      at lineo.smarteam.activity.SettingsActivity$SettingsFragment.onCreate(SettingsActivity.java:57)
                      at android.app.Fragment.performCreate(Fragment.java:2198)
                      at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:942)
                      at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
                      at android.app.BackStackRecord.run(BackStackRecord.java:793)
                      at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
                      at android.app.FragmentController.execPendingActions(FragmentController.java:325)
                      at android.app.Activity.performStart(Activity.java:6267)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5461) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                   Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]

我有一个首选项屏幕,有几个 EditTextPreferences 允许配置一些整数参数。

res\xml\preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory     android:title="@string/scores_category_title"
                            android:key="pref_key_scores_settings">
        <lineo.smarteam.preference.MyEditTextPreference
            android:title="@string/pref_title_win_score"
            android:inputType="numberSigned"
            android:maxLength="9"
            android:defaultValue="@integer/def_win_score"
            android:key="pref_key_win_score" >
        </lineo.smarteam.preference.MyEditTextPreference>
        (more of the same)
    </PreferenceCategory>
</PreferenceScreen>

因为我很固执,并且我希望光标在每次单击任何首选项时都与文本末尾对齐,所以我创建了一个自定义 EditTextPreference。

preference\MyEditTextPreference.java

package lineo.smarteam.preference;

import android.content.Context;
import android.preference.EditTextPreference;
import android.util.AttributeSet;
import android.widget.EditText;

public class MyEditTextPreference extends EditTextPreference {
    public MyEditTextPreference(Context context) {
        super(context);
    }
    public MyEditTextPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public MyEditTextPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onClick() {
        super.onClick();
        EditText et = getEditText();
        et.setSelection(et.getText().length());
    }
}

如您所见,我基本上拥有与此问题相关的所有主题中提到的所有构造函数。 然后我有了实际的 PreferenceActivity:

活动\设置活动

package lineo.smarteam.activity;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.MenuItem;

import lineo.smarteam.MyApplication;
import lineo.smarteam.R;

public class SettingsActivity extends PreferenceActivity {
    static SharedPreferences sharedPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Context context = this;
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
    }

    public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            setListeners();
        }

        //EDIT:
        public void setListeners(){
            setListenerA();
            //other listeners
        }

        pulic void setListenerA(){
            findPreference("KEY_PREF_WIN_SCORE").setOnPreferenceChangeListener() {
                //(...)
            }
        }
    }
}

如上所述,在省略的最后一段代码的某处,我调用了 getActivity(),正如我在某处读到的那样,这可能会导致这个问题。问题是我已经尝试评论对该方法的所有调用,但问题仍然存在。因此,我得出结论,这不是原因。另外,我读到该方法可能会抛出 NullPointerException,所以我每次使用它时都会检查它。

我感觉解决方案就在我面前,我只是没看到。我读过的大多数相关主题都是这种情况。

谁能帮我找到它?

谢谢

编辑:

按照 Vijai 的建议,我重新安装了该应用程序。它仍然在相同的操作中崩溃,但错误已经改变。

新日志

E/AndroidRuntime: FATAL EXCEPTION: main
Process: lineo.smarteam, PID: 19210
Theme: themes:{}
java.lang.RuntimeException: Unable to start activity ComponentInfo{lineo.smarteam/lineo.smarteam.activity.SettingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setOnPreferenceChangeListener(android.preference.Preference$OnPreferenceChangeListener)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5461)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

  • 您是否启用了 ProGuard?如果是这样,您可能需要@Keep 您的自定义Preference
  • 我不知道那是什么......
  • 有趣!将来可能会有用。谢谢。但由于我不知道,不,我没有启用 ProGuard。
  • 您是否尝试清除数据或卸载/重新安装应用程序?即时运行可能是原因

标签: android android-preferences preferenceactivity inflate-exception edittextpreference


【解决方案1】:

我找到了。

我试图在preferences.xml 文件中查找ID 不匹配的首选项。

这真是一个愚蠢的错误。它是在我没有分享的一段代码中先吃了(对不起)。

无论如何,感谢所有试图提供帮助的人!

【讨论】:

    【解决方案2】:

    错误表示您的MyEditTextPreference 类中有错误。

    Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
    

    我之前也遇到过这个错误,但这可能很大程度上取决于您的情况。您可以尝试几件事:

    1. 查看您的 MyEditTextPreference 类并查看您的布局 xml 是否调用了正确的首选项。 包装必须相同。这是我犯错的地方。

    2. 尝试修改您的 MyEditTextPreference 类,例如删除我的建议是:

      protected void onClick() { super.onClick(); EditText et = getEditText(); et.setSelection(et.getText().length()); }

    或者你也可以修改你的构造函数。看看你是否发现了新的错误日志。

    1. 在部署到设备之前构建 gradle 并清理您的项目。通常这会指出你在 xml 中的错误。

    如果一切都不起作用,那么您应该修复 MyEditTextPreference 类。这是我的建议,希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2017-02-16
      相关资源
      最近更新 更多