Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用什么来代替“引用”;addPreferencesFromResource“;在优惠活动中?_Android_Xml - Fatal编程技术网

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