我有一个 MainActivity,它有一个 boolean 变量 mMonthlySubscribed。此 Activity 有一个 onPurchasesUpdated 回调方法,该方法将 mMonthlySubscribed 变量设置为 true 或 false。还有 loadFragment 方法在 Fragments 之间导航。
我的应用程序中有 2 个 fragment ,分别为 FragmentSubscribed 和 FragmentUnsubscribed。我如何通知 mMonthlySubscribed 值已更改为 Fragment。
目前,我正在检查 mMonthlySubscribed 值并使用以下方法导航到适当的 fragment 。当 MainActivity 中触发 onPurchasesUpdated 回调并更改 boolean 值 mMonthlySubscribed 时,我想从我的 Fragments 调用以下方法之一。
((MainActivity) getActivity()).loadFragment(new FragmentUnsubscribed());
和
((MainActivity) getActivity()).loadFragment(new FragmentSubscribed());
简单地说,我的问题是当 Activity 的 onPurchasesUpdated 回调被触发时,我如何通知当前 fragment ,以便我可以相应地调用上面的方法。
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();
}
最佳答案
我设法使用 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);
}
};
当广播接收者收到广播消息时,将触发每个 fragment 中实现的onReceive()。
因此,当 onPurchasesUpdated() 回调方法被触发时,MainActivity 使用 sendMessage() 发送本地广播消息。每个 fragment 都会监听此广播消息,一旦收到消息,就会触发 loadFragment() 并导航到适当的 fragment 。
关于java - 将activity的回调状态通知给fragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49843700/