将activity的回调状态通知给片段

Notify activity's callback state to fragment

我有一个 MainActivity,它有一个布尔变量 mMonthlySubscribed。 activity 有一个 onPurchasesUpdated 回调方法,该方法将 true 或 false 设置为 mMonthlySubscribed 变量。还有 loadFragment 方法在 Fragment 之间导航。

我的应用程序中有 2 个片段,分别是 FragmentSubscribed 和 FragmentUnsubscribed。我如何通知 mMonthlySubscribed 值已更改为片段。

目前我正在检查 mMonthlySubscribed 值并使用以下方法导航到适当的片段。当在 MainActivity 中触发 onPurchasesUpdated 回调并更改 boolean mMonthlySubscribed 时,我想从我的 Fragments 调用以下方法之一。

((MainActivity) getActivity()).loadFragment(new FragmentUnsubscribed()); 

((MainActivity) getActivity()).loadFragment(new FragmentSubscribed());  

简单地说,我的问题是当 activity 的 onPurchasesUpdated 回调被触发时,我如何将其通知给当前片段,以便我可以相应地调用上述方法。

MainActivity 的回调

    @Override
    public void onPurchasesUpdated(List<Purchase> purchaseList) {

        for (Purchase purchase : purchaseList) {
            if (purchase.getSku().equals(SKU_MONTHLY)) {
                Toast.makeText(getApplicationContext(), "Subscription is valid! - server", Toast.LENGTH_SHORT).show();
                mMonthlySubscribed = true;
            } else {
                Toast.makeText(getApplicationContext(), "Subscription is invalid! - server", Toast.LENGTH_SHORT).show();
                mMonthlySubscribed = false;
            }
        }
        // save state 
        saveSubscriptionStateSharedPreference();

        // todo : notify the current state to the fragment

    }

MainActivity 的导航方式

public void loadFragment(Fragment fragment) {
    // load passed fragment within the frame_container of activity_main
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.frame_container, fragment);
    transaction.commit();
}

据我了解,你可以试试这个:

 public void onPurchasesUpdated(List<Purchase> purchaseList) {

        for (Purchase purchase : purchaseList) {
            if (purchase.getSku().equals(SKU_MONTHLY)) {
                Toast.makeText(getApplicationContext(), "Subscription is valid! - server", Toast.LENGTH_SHORT).show();
                mMonthlySubscribed = true;
                ParsePush.subscribeInBackground("SignalChannel");
((MainActivity) getActivity()).loadFragment(new FragmentSubscribed());
            } else {
                Toast.makeText(getApplicationContext(), "Subscription is invalid! - server", Toast.LENGTH_SHORT).show();
                mMonthlySubscribed = false;
                ParsePush.unsubscribeInBackground("SignalChannel");
    ((MainActivity) getActivity()).loadFragment(new FragmentUnsubscribed()); 
            }
        }
        // save state 
        saveSubscriptionStateSharedPreference();

        // todo : notify the current state to the fragment

    }

你为什么不从 onPurchasesUpdated

调用 loadFragment 方法

我设法使用 LocalBroadcastManager 完成了这项工作。我将 post 我的回答是为了帮助其他正在寻找此类用例解决方案的人。

在我的 MainActivity 中,我实现了 sendMessage() 方法来发送本地广播。

private void sendMessage() {
    Log.d("sender", "Broadcasting message subscription state update");
    Intent intent = new Intent("subscription_state");
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

然后在 onPurchasesUpdated() 的回调中发送上面的广播消息。如下所示,

@Override
public void onPurchasesUpdated(List<Purchase> purchaseList) {

        for (Purchase purchase : purchaseList) {
            if (purchase.getSku().equals(SKU_MONTHLY)) {
                Log.d(TAG, "Subscription is valid! - server");
                mMonthlySubscribed = true;
            }
        }
        //// save state and notify the current state to the fragment
        saveSubscriptionStateSharedPreference();
        sendMessage();
} 

在每个 Fragment 中,我都实现了下面的监听器来监听上面给出的广播消息。

@Override
public void onStart() {
    super.onStart();
    LocalBroadcastManager.getInstance(activity).registerReceiver(mMessageReceiver,
            new IntentFilter("subscription_state"));
    activity.queryPurchases();
    Log.d("receiver", "Receiver created " + TAG);

}

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // if subscription state is true, load subscribe screens
        if (mMonthlySubscribed)
            activity.loadFragment(new SubscriptionFragment());
        Log.d("receiver", "Subscription state update received " + TAG);
    }
};

广播接收器接收到广播消息时,将触发每个片段中实现的onReceive()。

因此当触发onPurchasesUpdated() 回调方法时,MainActivity 使用sendMessage() 发送本地广播消息。每个片段都会监听这个广播消息,一旦收到消息,它就会触发 loadFragment() 并导航到适当的片段。