Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用于多种目的的LocalBroadcastManager_Android_Android Intent_Android Fragments - Fatal编程技术网

Android 用于多种目的的LocalBroadcastManager

Android 用于多种目的的LocalBroadcastManager,android,android-intent,android-fragments,Android,Android Intent,Android Fragments,我正在一个应用程序中工作,我刚刚实现了ViewPager。我第一次使用选项卡,但当我更改ViewPager时,我开始出现从活动到片段的数据传输问题 我终于找到了解释这个问题的地方,以及在使用ViewPager时建议使用LocalBroadcastManager将数据从Activity发送到Framint的地方。我已经实现了此代码,工作正常: Fragment1.java public class Fragment1 extends Fragment { public static fi

我正在一个应用程序中工作,我刚刚实现了ViewPager。我第一次使用选项卡,但当我更改ViewPager时,我开始出现从活动到片段的数据传输问题

我终于找到了解释这个问题的地方,以及在使用ViewPager时建议使用LocalBroadcastManager将数据从Activity发送到Framint的地方。我已经实现了此代码,工作正常:

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发送到同一个片段1,我的问题是,如何在片段中管理另一个意图的传入


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

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

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

如果在调用该片段后导航到该片段,则可以使用getActivity()使其从活动中获取变量

我最终解决了向先前定义的IntentFilter添加操作的问题:

@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
        }
    }
};

在实现LocalBroadcastManager之前,我就是这样做的,但它不起作用。正如gunar在链接帖子
中所说,您无法直接访问驻留在ViewPager中的片段,因此无法直接引用它们。
好的,我没有看到这一点。关于你的问题,那么你应该使用相同的广播接收器,你应该只改变标签。然后检查片段中的标记是否为null以调用不同的方法。