不是抽象的,不会覆盖抽象方法OnPreferenceChange(Preference,Object)

时间:2017-06-21 19:36:36

标签: android

我想注册列表首选项的首选项更改,如此

import android.preference.PreferenceFragment;
import android.support.v7.preference.Preference;

public class MyFragment extends PreferenceFragment {

    ListPreference mListPreferece;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.my_prefs);

        String preferenceName = getString(R.string.list_pref);
        mListPreferece = (ListPreference) findPreference(preferenceName);

        mListPreferece.setOnPreferenceChangeListener(
                new android.preference.Preference.OnPreferenceChangeListener() {

                    @Override
                    public boolean onPreferenceChange(Preference preference, Object newValue) {
                        System.out.print(newValue.toString());
                        return false;
                    }
        });
    }
}

我似乎正确地覆盖了接口方法,但我收到了这个错误

  

[My Fragment]不是抽象的,不会覆盖抽象方法OnPreferenceChange(Preference,Object)

这是导致错误的行

new android.preference.Preference.OnPreferenceChangeListener() {

3 个答案:

答案 0 :(得分:1)

您正在混合支持和框架Preference类。前者在android.support.v7.preference.Preference下可用,而后者在android.preference.Preference。你不能混合这些,因为他们都期望从他们的包中OnPreferenceChangeListener。现在您可以选择:使用框架1或支持框架。

选项1 - 框架类

如果你的应用程序的其余部分使用android.app.Fragment类(那么框架文件),请使用此选项。在这种情况下,您必须从

更改Preference类的import语句
import android.support.v7.preference.Preference;

import android.preference.Preference;

选项2 - 支持类(v14)

如果您的应用使用框架片段,但您想使用支持库的首选项,则必须主要从

更改导入
import android.preference.PreferenceFragment;

import android.support.v14.preference.PreferenceFragment;

然后从首选项更改侦听器的新实例中删除完全限定的包名称,以便您使用支持OnPreferenceChangeListener

mListPreferece.setOnPreferenceChangeListener(
        new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                System.out.print(newValue.toString());
                return false;
            }
});

选项3 - 支持类(v7)

如果您的应用使用支持片段(android.support.v4.app.Fragment的实例),则需要更改首选项中的一些内容。

首先从首选项更改侦听器的新实例中删除完全限定的包名称,这样您就可以使用支持OnPreferenceChangeListener

mListPreferece.setOnPreferenceChangeListener(
        new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                System.out.print(newValue.toString());
                return false;
            }
});

在这种情况下,您还需要使用PreferenceFragmentCompat而不是现在使用的PreferenceFragment,因此请更改

public class MyFragment extends PreferenceFragment 

public class MyFragment extends PreferenceFragmentCompat
  

注意两个支持版本都要求您使用onCreatePreferences(...)来扩充首选项XML,而不是onCreate(...)

P.S。:如果您想使用支持v7选项,我建议使用library fix来解决官方实施中的一些常见错误/问题。

答案 1 :(得分:0)

已更改

import android.support.v7.preference.Preference;

import android.preference.PreferenceFragment;

答案 2 :(得分:-1)

OnPreferenceChangeListener是一个接口,而不是一个类,所以它需要通过活动或片段来实现,而不是实例化。

尝试更像这样的东西(不是可运行的代码!):

public class MyFragment extends PreferenceFragment 
    implements OnPreferenceChangeListener {

    @Override
    public boolean onPreferenceChange(
         Preference preference, Object newValue) {
         System.out.print(preference.getKey().toString());
         if ( /* preference.getKey() is preferenceName */ ) {
             System.out.print(newValue.toString());
             return false;
         }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {

        mListPreferece.setOnPreferenceChangeListener(this);

    }