Android碎片 - BroadcastReceiver调用碎片方法

3

我有一个 BroadcastReceiver 接收 Fragment 发送的广播。 我已经成功接收到了广播,但是如何调用 Fragment 自身的方法呢? 基本上,当广播到达时,我需要更新列表,这个列表和更新方法都属于 Fragment。

public class FragmentReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(action != null && action.equals("AllTasksFragmentUpdate"))
        {
            //
        }
    }
}

注册接收器:

    @Override
public void onCreate(final Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getActivity().registerReceiver(new FragmentReceiver(), new IntentFilter("AllTasksFragmentUpdate"));
}

如何从Fragment中调用方法?

如果是Fragment实现的广播接收器,那么你可以在广播接收器中轻松调用方法。 - dex
你可以在你的fragment中注册一个接收器,然后在那里实现,然后你就可以调用你的fragment的任何方法。 - Shadab Ansari
你可以在广播接收器的onReceive方法中直接调用Fragment的方法。不是吗? - Ruchira Randana
@dex,提供示例代码会很好!我对Android这方面还是非常新手。 - David Faizulaev
1
@DavidFaiz 我已经给你提供了实现广播接收器的样本代码。 - dex
显示剩余3条评论
4个回答

11

您可以按照以下方式实现广播接收器:

import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.LocalBroadcastManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.adobe.libs.connectors.R;

public class YourFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater,
                                @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        //Start listening for refresh local file list   LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mYourBroadcastReceiver,
                new IntentFilter(<YOUR INTENT FILTER>));

        return inflater.inflate(R.layout.your_fragment_layout, null, true);
    }

    @Override
    public void onDestroyView() {
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mYourBroadcastReceiver);
    }

    private final BroadcastReceiver mYourBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Now you can call all your fragments method here
        }
    };
}

我必须使用'onCreateViewRAW'还是可以使用'onCreateView'? - David Faizulaev
抱歉,坚持使用onCreateView。 - dex
当我在清单文件中添加“接收器”时,发现了一个问题,因为它找不到“mYourBroadcastReceiver”。 - David Faizulaev
我们能不能很快聊一下这个? - David Faizulaev
当然,如果您分享一下您在清单中放置的接收器,那就太好了。 - dex
在onPause()和onResume()中,你不应该(取消)注册吗? - c0dehunter

2

在您的onReceive()方法中,您可以通过标签名称(使用该名称实例化片段)找到您的片段并调用其公共方法。

SampleFragment fragment = (SampleFragment) getSupportFragmentManager().findFragmentByTag(<fragment_tag_name>);
                if (fragment != null && fragment.isAdded()) {
                    fragment.method(); //Call any public method
                }

希望这能有所帮助!

我遇到了一个错误:“无法解析getSupportFragmentManager”。我认为Receiver类需要扩展“FragmentActivity”,但它已经扩展了“BroadcastReceiver”。 - David Faizulaev
包含您的接收器和/或片段的活动应该扩展FragmentActivity。 - Shadab Ansari
getSupportFragmentManager在BroadcastReceiver中不是可用的方法。如果BroadcastReceiver是一个独立的类,你的代码将无法工作。 - gyleg5

2
假设您有一个名为MyActivity的活动,并且在代码的某个地方,您想要进行广播以供MyFragment接收。您可以按以下方式执行:
在MyActivity中,使用LocalBroadcastManager使用过滤器进行广播:
String filter = "thisIsForMyFragment";
Intent intent = new Intent(filter); //If you need extra, add: intent.putExtra("extra","something");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

在MyFragment中,在onCreateView()方法中添加以下内容以注册接收器:
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(myBroadcastReceiver,
        new IntentFilter("thisIsForMyFragment"));

在MyFragment中(不在onCreateView()方法内),创建接收广播的接收器方法:
private final BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, android.content.Intent intent) {
        Toast.makeText(getActivity(), "Broadcast received!", Toast.LENGTH_SHORT).show();//Do what you want when the broadcast is received...

    }
};

最后,在MyFragment中添加以下代码以在onDestroyView中注销接收器:
@Override
public void onDestroyView()
{
    super.onDestroyView();
    LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(myBroadcastReceiver);
}

0
activity!!.registerReceiver(receiver, IntentFilter(DataKeys.STATUS))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接