在PreferenceActivity中使用什么而不是“addPreferencesFromResource”?
我只注意到在Android的文档( 参考条目 )中标记为弃用 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); } }
你必须做的唯一的改变是创build一个内部的片段类,将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不支持新的方法必须诉诸各种解决方法,使您的应用程序工作在广泛的设备。 真令人沮丧!
你的class级非常好,因为它可以让你继续以新的方式工作在新的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)testing成功。
为什么我的代码看起来如此糟糕:
我是android编码的小菜鸟,我不是最伟大的java粉丝。
为了避免被弃用的警告,并迫使Eclipse允许我编译我不得不诉诸注释,但这些似乎只影响类或方法,所以我不得不将代码移动到两个新的方法来利用这一点。
我不想在每次复制和粘贴新的PreferenceActivity类时都要编写两次xml资源标识,所以我创build了一个新的variables来存储这个值。
我希望这对其他人有用。
PS:对于我个人的观点来说,抱歉,但是当你来到新的地方,发现这样的障碍的时候,你却忍不住要沮丧!
我的方法非常接近Garret Wilson (谢谢,我投票支持你;)
另外它提供了与Android <3的向下兼容性。
我只是意识到我的解决scheme更接近Kevin Remo的那个。 这只是一点清洁剂(因为它不依赖于“预期”反模式 )。
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 (ie API lvl * < 11). */ @SuppressWarnings("deprecation") private void onCreatePreferenceActivity() { addPreferencesFromResource(R.xml.preferences); } /** * Wraps {@link #onCreate(Bundle)} code for Android >= 3 (ie API lvl >= * 11). */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void onCreatePreferenceFragment() { getFragmentManager().beginTransaction() .replace(android.R.id.content, new MyPreferenceFragment ()) .commit(); } }
对于“真实”(但更复杂)的例子,请参阅NusicPreferencesActivity和NusicPreferencesFragment 。
而不是例外,只需使用:
if (Build.VERSION.SDK_INT >= 11)
并使用
@SuppressLint("NewApi")
压制警告。