@ Гаррет Уилсон Спасибо большое! Как нуб к кодированию 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
}
}
}
Испытано в двух эмуляторах (2.2 и 4.2) с успехом.
Почему мой код выглядит таким дерьмовым:
Я нуб к кодированию Android, и я не лучший поклонник Java.
Чтобы избежать устаревшего предупреждения и заставить Eclipse позволить мне компилировать, мне пришлось прибегнуть к аннотациям, но, похоже, они затрагивают только классы или методы, поэтому мне пришлось перенести код на два новых метода, чтобы воспользоваться этим.
Мне бы не хотелось писать мой идентификатор ресурса xml дважды каждый раз, когда я копирую и вставляю класс для новой PreferenceActivity, поэтому я создал новую переменную для хранения этого значения.
Я надеюсь, что это будет полезно для кого-то еще.
PS: Извините за мои убежденные взгляды, но когда вы приходите в себя и обнаруживаете такие недостатки, вы ничего не можете с этим поделать, кроме как расстроиться!