繁体   English   中英

通知活动的回调状态以分段

[英]Notify activity's callback state to fragment

我有一个MainActivity,它具有一个布尔变量mMonthlySubscribed。 此活动具有onPurchasesUpdated回调方法,该方法将mMonthlySubscribed变量设置为true或false。 也可以使用loadFragment方法在片段之间导航。

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

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

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

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

简而言之,我的问题是何时触发活动的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完成此操作。 我将发布答案,以帮助正在寻找这种用例解决方案的其他任何人。

在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()并导航至适当的片段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM