BroadcastReceiver从来没有在ViewPager的片段上调用OnReceive

问题描述:



我正在写一个应用程序,它包含由viewpager包装的两个片段。我试图获得蓝牙可用设备的列表,但列表视图从未改变。
这是我第一次使用碎片。我希望你们能帮助我。 在此先感谢!

这里的片段:BroadcastReceiver从来没有在ViewPager的片段上调用OnReceive

public class BluetoothDevicesFragment extends Fragment { 
    private ListView mListView; 
    private BluetoothListAdapter mAdapter; 
    private ArrayList<String> mArray; 
    private SwipeRefreshLayout mRefresh; 
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      //Finding devices 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
       // Get the BluetoothDevice object from the Intent 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       // Add the name and address to an array adapter to show in a ListView 
       //Snackbar.make(getView(), device.getName(), Snackbar.LENGTH_LONG).setAction("Action", null).show(); 
       mArray.add(device.getName() + "\n" + device.getAddress()); 
       mAdapter.notifyDataSetChanged(); 
      } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
       mRefresh.setRefreshing(false); 
       getActivity().unregisterReceiver(mReceiver); 
      } 
     } 
    }; 

    public BluetoothDevicesFragment() { 

    } 

    public static BluetoothDevicesFragment newInstance() { 

     Bundle args = new Bundle(); 

     BluetoothDevicesFragment fragment = new BluetoothDevicesFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_bluetooth, container, false); 
     mListView = (ListView) rootView.findViewById(R.id.listviewB); 
     mArray = new ArrayList<>(); 
     mAdapter = new BluetoothListAdapter(getContext(), R.layout.fragment_bluetooth, mArray); 
     mListView.setAdapter(mAdapter); 
     mRefresh = (SwipeRefreshLayout) rootView.findViewById(R.id.refresh); 
     mRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
       getActivity().registerReceiver(mReceiver, filter); 
       Bluetooth.bluetoothAdapter.cancelDiscovery(); 
       Bluetooth.bluetoothAdapter.startDiscovery(); 
      } 
     }); 
     return rootView; 
    } 
} 
+0

你有没有在清单注册它? –

+0

@kishorejethava没有。我必须吗? –

您必须先注册BroadcastReceiver接收事件

有两种方法可以做到这一点:

manifest文件中注册广播接收器

<receiver 
android:name="com.pycitup.pyc.MyReceiver" 
android:enabled="true" 
android:exported="true" > 
<intent-filter> 
    <action android:name="com.pycitup.BroadcastReceiver" /> 
</intent-filter> 

注册广播接收器通过编程

IntentFilter filter = new IntentFilter("packagename.customclass"); 

MyReceiver myReceiver = new MyReceiver(); 
registerReceiver(myReceiver, filter); 

添加许可manifest.xml

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

不要忘记检查运行许可abaove

+0

我已经按照Google的指导以编程方式完成了它,但它仍然不起作用 –

+0

我的意思是我仍然没有看到它缺少什么 –

+0

你试过[this](http://*.com/questions/32656510)/register-broadcast-receiver-dynamic-does-not-work-bluetoothdevice-action-f) –