0



我正在寫一個應用程序,它包含由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沒有。我必須嗎? –

回答

1

您必須先註冊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://stackoverflow.com/questions/32656510)/register-broadcast-receiver-dynamic-does-not-work-bluetoothdevice-action-f) –

相關問題