在PreferenceActivity中使用什麼代替「 addPreferencesFromResource」?

我剛剛注意到一個事實,即方法addPreferencesFromResource(int preferencesResId)在Android的文檔中( Reference Entry被標記爲已棄用html

不幸的是,該方法的說明中沒有提供替代方法。 java

爲了將preferenceScreen.xml鏈接到匹配的PreferenceActivity,應該使用哪一種方法呢? android


#1樓

要向上述正確答案添加更多信息,請閱讀Android-er示例,我發現您能夠輕鬆地將您的偏好活動轉換爲偏好片斷。 若是您有如下活動: git

public class MyPreferenceActivity extends PreferenceActivity
{
    @Override
    protected void onCreate(final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.my_preference_screen);
    }
}

您要作的惟一更改是建立一個內部片斷類,將addPreferencesFromResources()移入片斷,而後從活動中調用該片斷,以下所示: github

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

從片斷中選擇更復雜的首選項可能還有其餘一些細微之處。 若是是這樣,我但願有人在這裏註明。 併發


#2樓

@Garret Wilson很是感謝! 做爲android編碼的新手,我一直困擾着首選項不兼容問題達數小時之久,但令我失望的是,他們不同意將某些方法/方法用於較舊的API不支持的新方法/方法必須採起各類變通辦法來使您的應用在各類設備上運行。 真使人沮喪! ide

您的課程很棒,由於它使您能夠按照喜愛使用新的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)中測試成功。 gradle

爲何個人代碼如此糟糕: ui

我是android編碼的菜鳥,我不是最偉大的Java迷。

爲了不過期的警告並迫使Eclipse容許我進行編譯,我不得不求助於註釋,可是這些註釋彷佛隻影響類或方法,所以我不得不將代碼移至兩個新方法上才能利用此註釋。

我不想每次將類複製並粘貼到新的PreferenceActivity時都必須兩次寫入xml資源ID,因此我建立了一個新變量來存儲此值。

我但願這對其餘人有用。

PS:對不起,個人觀點是對的,可是,當您初來乍到並發現這樣的障礙時,您會無奈地感到沮喪!


#3樓

除了使用例外,還可使用:

if (Build.VERSION.SDK_INT >= 11)

和使用

@SuppressLint("NewApi")

禁止顯示警告。


#4樓

個人方法很是接近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();
    }
}

有關「真實」(但更復雜)的示例,請參見NusicPreferencesActivityNusicPreferencesFragment


#5樓

與其使用PreferenceActivity直接加載首選項, AppCompatActivity使用AppCompatActivity或加載PreferenceFragmentCompat等效項來加載您的首選項。 它是支持庫(如今爲Android Jetpack)的一部分,並提供與API 14的兼容性。

build.gradlebuild.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

相關文章
相關標籤/搜索