【问题标题】:LocalBroadcastManager for multiple intentsLocalBroadcastManager 用于多个意图
【发布时间】:2014-09-15 15:37:44
【问题描述】:

我正在一个刚刚实现 ViewPager 的应用程序中工作。我第一次使用选项卡,但是当我对 ViewPager 进行更改时,我开始遇到从 Activity 到 Fragment 的数据传输问题。

我终于找到this post 解释了这个问题,并且在使用 ViewPager 时建议使用 LocalBroadcastManager 将数据从 Activity 发送到 Frament。我已经实现了这段代码并且工作正常:

Fragment1.java

public class Fragment1 extends Fragment {

    public static final String ACTION_INTENT = "fragment1.action.BOX_UPDATE";

    /*Register the receiver*/
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IntentFilter filter = new IntentFilter(ACTION_INTENT);
       LocalBroadcastManager.getInstance(getActivity()).registerReceiver(ActivityDataReceiver, filter);
    }

    /*Broadcast Receiver*/
    protected BroadcastReceiver ActivityDataReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(ACTION_INTENT.equals(intent.getAction())) {
                String text = intent.getStringExtra("TEXT");
                witeOnBox(text);
            }
        }
    };

    /*Method which changes the text with the icoming value*/
    public void witeOnBox(String text) {
        tv_log.setText(text);

    }

    /*Unregister receiver*/
    @Override
    public void onDestroy() {
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(ActivityDataReceiver);
        super.onDestroy();
    }

现在,在 MainActivity 中,我以这种方式将数据发送到片段:

protected void sendValueToFragment1(String text) {
    Intent intent = new Intent("fragment1.action.BOX_UPDATE");
    intent.putExtra("TEXT", text);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
} 

现在我需要将其他数据从 MainActivity 发送到同一个 Fragment1,我的问题是,如何在 Fragment 中管理另一个 Intent 的传入?

我必须创建另一个 BroadcastReceiver 来管理新的 Intent,还是可以在同一个 BroadcastRecevier 中管理新的 Intent?我看到我可以在 BroadcastReceiver 的 onReceive() 方法中使用if 来检查传入的意图过滤器,但是如果我在同一个片段中声明两个不同的意图过滤器,如何将它们分配给 BroadcastReceiver?

【问题讨论】:

    标签: android android-intent android-fragments


    【解决方案1】:

    比使用广播接收器更好的方法,

      Fragment frag = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + mPager.getCurrentItem());
                if(frag!=null && mPager.getCurrentItem()==1){
                    ((Fragment1) frag).setText(text);
                }
    

    如果你在调用它之后导航到 Fragment,你可以让它使用 getActivity() 从 Activity 中获取变量;

    【讨论】:

    • 这就是我在实施 LocalBroadcastManager 之前的做法,但它不起作用。正如 gunar 在链接帖子中所说的那样 You don't have access directly to your fragments that reside in ViewPager so you can't reference them directly.
    • 好吧,我没看到那一点。关于您的问题,您应该使用相同的广播接收器,您应该更改标签。然后检查 Fragment 中的 TAG 是否为 null 以调用不同的方法。
    【解决方案2】:

    我终于解决了在之前定义的IntentFilter中添加一个Action:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IntentFilter filter = new IntentFilter(ACTION_INTENT);
        filter.addAction(ACTION_INTENT2);
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(ActivityDataReceiver, filter);
    }
    

    然后在 BroadcastReceiver 我管理传入的操作:

    protected BroadcastReceiver ActivityDataReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(ACTION_INTENT.equals(intent.getAction())) {
                //Do
            }
            if(ACTION_INTENT2.equals(intent.getAction())) {
                //DO
            }
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多