java - 将activity的回调状态通知给fragment

标签 java android android-fragments broadcastreceiver

我有一个 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/

相关文章:

c# - 如何使用高级 OpenType 功能编写程序?

android - 如何清除 android marshmallow 中的浏览历史记录

java - 使用 jackson 序列化数组

java - 围绕 jdbc 的方解石模式以及每个用户的过滤表

android - 外部 "C"DLL_PUBLIC

android - 如何将类对象传递给 Activity

android - 在 onStart() 中获取 fragment 宽度 0

android - 如何不使用 XML 文件而是使用 Java 将 header 和首选项对象添加到 PreferenceActivity?

java - 删除然后创建记录导致Spring Data JPA重复 key 冲突

java - 如何从图库中选取图像并将其存储到 SqLite 数据库中