我想注册列表首选项的首选项更改,如此
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() {
答案 0 :(得分:1)
您正在混合支持和框架Preference
类。前者在android.support.v7.preference.Preference
下可用,而后者在android.preference.Preference
。你不能混合这些,因为他们都期望从他们的包中OnPreferenceChangeListener
。现在您可以选择:使用框架1或支持框架。
如果你的应用程序的其余部分使用android.app.Fragment
类(那么框架文件),请使用此选项。在这种情况下,您必须从
Preference
类的import语句
import android.support.v7.preference.Preference;
到
import android.preference.Preference;
如果您的应用使用框架片段,但您想使用支持库的首选项,则必须主要从
更改导入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;
}
});
如果您的应用使用支持片段(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);
}