我想像这样注册列表首选项的首选项更改
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);
}