[英]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.