用什么代替" addpreferencesfromresourcequot;在PreferenceActivity中?

我刚刚注意到一个事实,即方法addPreferencesFromResource(int preferencesResId)在Android的文档(参考条目)中被标记为弃用

不幸的是,该方法的描述中没有提供替代方法。

应该使用哪个方法来将preferenceScreen.xml连接到匹配的PreferenceActivity?

165376 次浏览

该方法的描述中没有提供替代方法,因为首选方法(从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()移动到片段中,并从活动中调用片段,如下所示:

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

从片段中制作更复杂的首选项可能还有其他微妙之处;如果有,我希望有人能在这里记下。

@Garret Wilson非常感谢!作为一个android编码的新手,我已经被首选项不兼容的问题困扰了好几个小时,我发现他们不赞成使用一些旧api不支持的新方法/方法,因此不得不求助于各种各样的变通方法,让你的应用程序在广泛的设备上工作。这真的很令人沮丧!

你的类很棒,因为它允许你像以前一样使用首选项在新的api中工作,但是它不向后兼容。由于我试图接触到广泛的设备,我修补了它一点,使它在pre 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,所以我创建了一个新变量来存储这个值。

我希望这对其他人有用。

附注:抱歉我固执己见,但当你来到新地方,发现这样的障碍时,你会不由自主地感到沮丧!

不要使用异常,只需使用:

if (Build.VERSION.SDK_INT >= 11)

和使用

@SuppressLint("NewApi")

压制警告。

我的方法非常接近阁楼威尔逊的(谢谢,我投票给你;)

此外,它还向下兼容Android <3.

我刚刚意识到我的解更接近凯文·雷莫。它只是稍微干净一点(因为它不依赖“期望”反模式)。

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

有关“真实”(但更复杂)的示例,请参阅NusicPreferencesActivityNusicPreferencesFragment

与其使用PreferenceActivity直接加载首选项,不如使用AppCompatActivity或等效对象来加载加载首选项的PreferenceFragmentCompat。它是支持库(现在是Android Jetpack)的一部分,并提供了API 14的兼容性。

build.gradle中,为首选项支持库添加一个依赖项:

dependencies {
// ...
implementation "androidx.preference:preference:1.0.0-alpha1"
}

注意:我们假设您已经创建了首选项XML。

为您的活动创建一个新的活动类。如果你使用材质主题,你应该扩展AppCompatActivity,但你可以灵活地这样做:

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

现在是最重要的部分:创建一个片段,从XML加载你的首选项:

public class MyPreferencesFragment extends PreferenceFragmentCompat {


@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.my_preferences_fragment); // Your preferences fragment
}
}

有关更多信息,请阅读Android Developers 文档中的PreferenceFragmentCompat