addPreferencesFromResource(int preferencesResId)
被标记为已弃用(参考资料)。不幸的是,在该方法的描述中没有提供替代方法。
应该使用哪个方法来连接preferenceScreen.xml与对应的PreferenceActivity呢?
在方法的描述中没有提供替代方法,因为(自API级别11起)首选方法是实例化PreferenceFragment对象来从资源文件加载您的偏好设置。请参见此处的示例代码:PreferenceActivity
为了给上面正确答案添加更多信息,阅读了Android-er的一个示例后,我发现您可以轻松将您的首选项活动转换为首选项片段。如果您有以下活动:
public class MyPreferenceActivity extends PreferenceActivity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.my_preference_screen);
}
}
您需要做出的唯一更改是创建一个内部片段类,将addPreferencesFromResources()
移动到该片段中,并从活动中调用该片段,像这样:
唯一需要进行的更改就是创建一个内部碎片类,将addPreferencesFromResources()
移动到该碎片中,并且从活动中调用该碎片,如下所示:
public class MyPreferenceActivity extends PreferenceActivity
{
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
}
public static class MyPreferenceFragment extends PreferenceFragment
{
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.my_preference_screen);
}
}
}
制作更复杂的偏好设置可能存在其他微妙之处;如果有的话,我希望有人在这里记录它们。
addPreferencesFromResources()
,转而使用PreferenceFragment?从初学者的角度来看,这似乎是不必要的。 - Howdy_McGee@Garret Wilson非常感谢你!作为一个Android编码的新手,我一直被偏好设置不兼容问题困扰了很多小时,而且我发现他们废弃了一些方法/方法来支持新API,这些新API不支持旧的API,因此必须采用各种解决方法使您的应用程序在各种设备上运行。这真的很令人沮丧!
你的课程非常棒,因为它允许你以过去的方式使用偏好设置来继续在新API中工作,但它不具有向后兼容性。由于我正在尝试覆盖广泛的设备,我稍微调整了一下,以使其在早期API 11设备以及更新的API中都可以工作:
import android.annotation.TargetApi;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
public class MyPrefsActivity extends PreferenceActivity
{
private static int prefs=R.xml.myprefs;
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
try {
getClass().getMethod("getFragmentManager");
AddResourceApi11AndGreater();
} catch (NoSuchMethodException e) { //Api < 11
AddResourceApiLessThan11();
}
}
@SuppressWarnings("deprecation")
protected void AddResourceApiLessThan11()
{
addPreferencesFromResource(prefs);
}
@TargetApi(11)
protected void AddResourceApi11AndGreater()
{
getFragmentManager().beginTransaction().replace(android.R.id.content,
new PF()).commit();
}
@TargetApi(11)
public static class PF extends PreferenceFragment
{
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(MyPrefsActivity.prefs); //outer class
// private members seem to be visible for inner class, and
// making it static made things so much easier
}
}
}
在两个模拟器(2.2和4.2)上测试成功。
为什么我的代码看起来这么糟糕:
我是一个Android编程新手,也不是很喜欢Java。
为了避免过时警告并强制Eclipse允许我编译,我不得不使用注释,但这似乎只影响类或方法,所以我不得不将代码移到两个新方法上以利用此功能。
我不想每次将类复制粘贴到新的PreferenceActivity中时都要写两次xml资源ID,因此我创建了一个新变量来存储这个值。
我希望这对其他人有用。
P.S.:对于我的偏见观点,我感到抱歉,但当你新来临并发现这样的障碍时,你就不得不感到沮丧!
我的方法非常接近Garret Wilson的(谢谢,我已经给你投票了;)
此外,它与 Android < 3 向下兼容。
我刚才发现,我的解决方案甚至更接近Kevin Remo的解决方案。只是稍微更干净一点(因为它不依赖于"expection"反模式)。
public class MyPreferenceActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
onCreatePreferenceActivity();
} else {
onCreatePreferenceFragment();
}
}
/**
* Wraps legacy {@link #onCreate(Bundle)} code for Android < 3 (i.e. API lvl
* < 11).
*/
@SuppressWarnings("deprecation")
private void onCreatePreferenceActivity() {
addPreferencesFromResource(R.xml.preferences);
}
/**
* Wraps {@link #onCreate(Bundle)} code for Android >= 3 (i.e. API lvl >=
* 11).
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void onCreatePreferenceFragment() {
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new MyPreferenceFragment ())
.commit();
}
}
对于一个“真实”的(但更加复杂的)例子,请参见NusicPreferencesActivity和NusicPreferencesFragment。
@SuppressLint("NewApi")
? - schnatterer不要使用异常,改用以下方式:
if (Build.VERSION.SDK_INT >= 11)
并使用
@SuppressLint("NewApi")
抑制警告信息。
不要使用 PreferenceActivity
直接加载偏好设置,而是使用 AppCompatActivity
或等效的方式来加载一个 PreferenceFragmentCompat
来加载您的偏好设置。这是支持库(现在是 Android Jetpack)的一部分,并提供向后兼容性到 API 14。
在你的 build.gradle
中,添加偏好设置支持库的依赖:
dependencies {
// ...
implementation "androidx.preference:preference:1.0.0-alpha1"
}
public class MyPreferencesActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_preferences_activity)
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, MyPreferencesFragment())
.commitNow()
}
}
}
public class MyPreferencesFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.my_preferences_fragment); // Your preferences fragment
}
}
如需更多信息,请阅读Android开发者文档,了解PreferenceFragmentCompat
。
addPreferencesFromResource(int preferencesResId)
。我有什么遗漏吗? - Jammo