Я пытаюсь изменить этот образец , чтобы он использовал PreferenceActivity вместо FragmentActivity.
В примере есть действие:
public abstract class BaseGamePlayActivity extends FragmentActivity implements BillingProvider {
, которое загружает фрагмент в обработчик (используя FragmentActivity):
/**
* User clicked the "Buy Gas" button - show a purchase dialog with all available SKUs
*/
public void onPurchaseButtonClicked(final View arg0) {
Log.d(TAG, "Purchase button clicked.");
if (mAcquireFragment == null) {
mAcquireFragment = new AcquireFragment();
}
if (!isAcquireFragmentShown()) {
mAcquireFragment.show(getSupportFragmentManager(), DIALOG_TAG);
if (mBillingManager != null
&& mBillingManager.getBillingClientResponseCode()
> BILLING_MANAGER_NOT_INITIALIZED) {
mAcquireFragment.onManagerReady(this);
}
}
}
В моем коде вместо этого используется PreferenceActivity. (из которого мне нужны прослушиватели предпочтений):
public class SettingsActivity extends PreferenceActivity implements BillingProvider {
и обработчик:
/**
* Handle an iap
*/
public void onPurchaseIapButtonClicked(final Preference preference) {
Log.d(TAG, "Iap purchase button clicked.");
if (mAcquireFragment == null) {
mAcquireFragment = new AcquireFragment();
}
if (!isAcquireFragmentShown()) {
// --------------------------
// There is no getSupportFragmentManager in PreferenceActivity
// --------------------------
mAcquireFragment.show(getSupportFragmentManager(), DIALOG_TAG);
if (mBillingManager != null
&& mBillingManager.getBillingClientResponseCode()
> BILLING_MANAGER_NOT_INITIALIZED) {
mAcquireFragment.onManagerReady(this);
}
}
}
Как фрагмент может быть загружен (расширение класса) PreferenceActivity?
Проект состоит из двух частей:
- логика игры в единстве (которая экспортируется как .aar)
- логика Android (обрабатывает взаимодействие с .aarчерез общие предпочтения)
На стороне андроида это выглядит так:
/**
* Reference to default {@code SharedPreferences}.
*/
private SharedPreferences mDefaultPreferences;
/**
* Notifies C# side about preferences changes.
*/
private final SharedPreferences.OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener =
new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
LiveWallpaperUnityFacade.getEventsProxy().preferenceChanged(key);
}
};
@Override
protected void onResume() {
super.onResume();
// Notify C# about opening
LiveWallpaperUnityFacade.getEventsProxy().preferencesActivityTriggered();
// Get Preferences and attach preferences change listener
mDefaultPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
mDefaultPreferences.registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
}
@Override
protected void onPause() {
super.onPause();
// Detach preferences change listener
mDefaultPreferences.unregisterOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
// Close the Activity. This is required because preferences could be changed from Unity,
// but values in Activity won't be refreshed. By closing the Activity each time when it goes
// into background, we can be sure it'll always have up-to-date values.
finish();
}