Отображение фрагмента в предпочтительной деятельности - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь изменить этот образец , чтобы он использовал 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();
}
...