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