Android的片段 - BroadcastReceiver调用片段方法

问题描述:

我有一个BroadcastReceiver接收广播发送到一个片段。 我收到了广播,但是如何从片段本身调用一个方法? 我基本上需要在广播到达时更新列表,列表&更新方法是片段的一部分。Android的片段 - BroadcastReceiver调用片段方法

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")); 
} 

我如何可以调用从片段的方法是什么?

+0

谁正在实施这个广播接收器,如果片段,然后即可轻松调用方法brodacast接收机内部。 – dex

+0

你可以在你的片段中注册一个接收器,并在那里实现,然后你可以调用你的片段的任何方法。 –

+0

您可以简单地从广播接收机的onReceive方法中调用片段的方法。你不能吗? –

you can implement your broadcast reciever in this way 

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 in 
     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 
     } 
    }; 
} 
+0

我必须使用'onCreateViewRAW'还是可以坚持'onCreateView'? –

+0

抱歉坚持onCreateView – dex

+0

我在清单文件中添加'receiver'时发现问题,因为它找不到'mYourBroadcastReceiver'。 –

在你的onReceive()方法中,你可以通过它的标签名(实例化你的分片的名字)找到你的分片并调用它的公有方法。

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

希望这会有所帮助!

+0

我收到一个错误'无法解析getSupportFragmentManager'。我相信Receiver类需要扩展'FragmentActivity',但它已经扩展'BroadcastReceiver'。 –

+0

包含您的接收器和/或片段的活动应该扩展FragmentActivity。 –

假设你有一个名为活动和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); 
}