将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() 并导航到适当的片段。
我有一个 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() 并导航到适当的片段。