我剛剛注意到一個事實,即方法addPreferencesFromResource(int preferencesResId)
在Android的文檔中( Reference Entry ) 已被標記爲已棄用 。 html
不幸的是,該方法的說明中沒有提供替代方法。 java
爲了將preferenceScreen.xml鏈接到匹配的PreferenceActivity,應該使用哪一種方法呢? android
要向上述正確答案添加更多信息,請閱讀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); } } }
從片斷中選擇更復雜的首選項可能還有其餘一些細微之處。 若是是這樣,我但願有人在這裏註明。 併發
@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:對不起,個人觀點是對的,可是,當您初來乍到並發現這樣的障礙時,您會無奈地感到沮喪!
除了使用例外,還可使用:
if (Build.VERSION.SDK_INT >= 11)
和使用
@SuppressLint("NewApi")
禁止顯示警告。
個人方法很是接近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(); } }
有關「真實」(但更復雜)的示例,請參見NusicPreferencesActivity和NusicPreferencesFragment 。
與其使用PreferenceActivity
直接加載首選項, AppCompatActivity
使用AppCompatActivity
或加載PreferenceFragmentCompat
等效項來加載您的首選項。 它是支持庫(如今爲Android Jetpack)的一部分,並提供與API 14的兼容性。
在build.gradle
, 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
。