Android 使用什么来代替“引用”;addPreferencesFromResource“;在优惠活动中?
我刚刚注意到,方法Android 使用什么来代替“引用”;addPreferencesFromResource“;在优惠活动中?,android,xml,Android,Xml,我刚刚注意到,方法addPreferencesFromResource(int preferencesResId)在Android文档()中被标记为已弃用 不幸的是,该方法的描述中没有提供替代方法 为了将preferenceScreen.xml连接到匹配的PreferenceActivity,应该使用哪种方法?该方法的描述中没有提供替代方法,因为首选方法(从API级别11开始)是实例化对象以从资源文件加载首选项。请参阅此处的示例代码:要为上述正确答案添加更多信息,请在阅读“我发现”后,轻松地将首
addPreferencesFromResource(int preferencesResId)
在Android文档()中被标记为已弃用
不幸的是,该方法的描述中没有提供替代方法
为了将preferenceScreen.xml连接到匹配的PreferenceActivity,应该使用哪种方法?该方法的描述中没有提供替代方法,因为首选方法(从API级别11开始)是实例化对象以从资源文件加载首选项。请参阅此处的示例代码:要为上述正确答案添加更多信息,请在阅读“我发现”后,轻松地将首选项活动转换为首选项片段。如果您有以下活动:
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中工作,但它不向后兼容。由于我试图接触范围广泛的设备,因此我对其进行了一些修补,以使其在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
}
}
}
导入android.annotation.TargetApi;
导入android.os.Bundle;
导入android.preference.PreferenceActivity;
导入android.preference.PreferenceFragment;
公共类MyPrefsActivity扩展了PreferenceActivity
{
私有静态int-prefs=R.xml.myprefs;
@凌驾
创建时受保护的void(最终捆绑包savedInstanceState)
{
super.onCreate(savedInstanceState);
试一试{
getClass().getMethod(“getFragmentManager”);
添加ResourceAPI11和更大();
}catch(NoSuchMethodException){//Api<11
AddResourceApiLessThan11();
}
}
@抑制警告(“弃用”)
受保护的void addResourceApilesThan11()
{
从资源中添加首选项(首选项);
}
@塔吉塔皮(11)
受保护的void addResourceAPI11和更高版本()
{
getFragmentManager().beginTransaction().replace(android.R.id.content,
新建PF()).commit();
}
@塔吉塔皮(11)
公共静态类PF扩展了PreferenceFragment
{
@凌驾
创建时的公共void(最终捆绑包savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(MyPrefsActivity.prefs);//外部类
//私有成员似乎对内部类可见,并且
//让它成为静态会让事情变得容易得多
}
}
}
在两个模拟器(2.2和4.2)中测试成功
为什么我的代码看起来如此糟糕:
我是android编码的新手,我不是最伟大的java爱好者
为了避免不推荐的警告并迫使Eclipse允许我编译,我不得不求助于注释,但这些注释似乎只影响类或方法,因此我不得不将代码转移到两个新方法上以利用这一点
我不想在为新的PreferenceActivity复制和粘贴类时必须编写两次xml资源id,所以我创建了一个新变量来存储这个值
我希望这对其他人有用
旁白:很抱歉我的观点过于固执己见,但当你发现新事物存在这样的障碍时,你会情不自禁地感到沮丧 不要使用异常,只需使用:
if (Build.VERSION.SDK_INT >= 11)
和使用
@SuppressLint("NewApi")
取消警告。我的方法非常接近(谢谢,我投票支持你;) 此外,它还提供了与Android<3的向下兼容性 我刚刚意识到我的解决方案更接近于一个接一个的解决方案。它只是稍微干净一点(因为它不依赖于环境)
公共类MyPreferenceActivity扩展了PreferenceActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if(Build.VERSION.SDK\u INT=3(即API lvl>=
* 11).
*/
@TargetApi(构建版本代码蜂窝)
私有void onCreatePreferenceFragment(){
getFragmentManager().beginTransaction()
.replace(android.R.id.content,新的MyPreferenceFragment())
.commit();
}
}
有关“真实”(但更复杂)的示例,请参见和。不要使用
PreferenceActivity
直接加载首选项,而是使用AppCompatActivity
或加载加载首选项的PreferenceFragmentCompat
的等效工具。它是支持库(现在的Android Jetpack)的一部分,并提供与API 14的兼容性
在build.gradle
中,为首选项支持库添加依赖项:
dependencies {
// ...
implementation "androidx.preference:preference:1.0.0-alpha1"
}
注意:我们假设您已经创建了您的首选项XML
对于y
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
}
}