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



我想像这样注册列表首选项的首选项更改

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;
}
});
}
}

我似乎正在正确覆盖接口方法,但我收到此错误

[我的片段] 不是抽象的,不会覆盖抽象方法 OnPreferenceChange(Ppreferences,Object)

这是导致错误的行

new android.preference.Preference.OnPreferenceChangeListener() {

您正在将支持和框架混合Preference类。前者在android.support.v7.preference.Preference下可用,而后者则android.preference.Preference。您不能混合使用它们,因为它们都希望从它们的包中获得OnPreferenceChangeListener。现在你有一个选择:使用框架或支持框架。

选项 1 - 框架类

如果应用的其余部分使用android.app.Fragment类(即框架类),请使用此选项。在这种情况下,您必须将Preference类的导入语句从

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(...)


PS:如果你想使用支持v7选项,我推荐我的库修复,它解决了官方实现中的几个常见错误/问题。

已更改

import android.support.v7.preference.Preference;

import android.preference.PreferenceFragment;

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);
}

最新更新