Je montre les périphériques Bluetooth dans une ListView
. Je l'ai essayé dans une Activity
auparavant et cela a fonctionné, mais maintenant je dois inclure cette ListView
dans une Fragment
Il est clair qu’une ou deux choses n’appartiennent pas à nous, comme registerReceiver
, unregisterReceiver
et RESULT_CANCELED
.
protected void onResume() {
registerReceiver(receiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
registerReceiver(receiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(receiver, filter);
filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(receiver, filter);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
unregisterReceiver(receiver);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_CANCELED){
Toast.makeText(getActivity() , "El Bluetooth debe estar activado para continuar", Toast.LENGTH_SHORT).show();
getActivity().finish();
}
}
Les lignes qui commencent par registerReceiver
, unegisterReceiver
et if(resultCode==RESULT_CANCELED){
me causent des problèmes.
En tant que fait supplémentaire, j'ai essayé de changer cela en une activité au lieu d'un fragment, mais ma classe principale a une erreur avec cela parce que je travaille avec des fragments.
Toutes ces méthodes et variables appartiennent à la classe Activity
. Pensez donc à les appeler avec le contexte de l'activité parent du fragment.
Vous pouvez appeler les méthodes requises en tant que:
getActivity().registerReceiver(receiver, filter);
et
getActivity().unregisterReceiver(receiver);
if(resultCode==RESULT_CANCELED){
peut être remplacé par
if(resultCode == Activity.RESULT_CANCELED){
J'espère que cela résoudra votre problème.
En ce qui concerne un message diffusé, vous ne recevrez rien si vous vous enregistrez comme ça:
getActivity().registerReceiver(receiver, filter);
Vous devriez écrire soit:
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, filter);
Par exemple, le cas d'une intention envoyée à partir d'un service (IntentService).
étant donné que l'activité est recréée dans les modifications de configuration alors que fragment résiste, cela signifie que le contexte de l'activité peut disparaître, ce qui entraîne la perte des récepteurs lors de la reconstitution de l'activité. Je suggère donc d'inscrire les récepteurs de diffusion dans votre fragment avec un contexte de niveau d'application. Vous pouvez ensuite enregistrer et désinscrire vos destinataires dans onResume()
et onPause()
du fragment, respectivement. De cette façon, vos destinataires sont liés au cycle de vie des fragments et non à l'activité.
Les méthodes registerReceiver()
et unregisterReceiver()
sont des méthodes de la classe Context
. Dans ce cas, vous avez besoin de votre Activity
(qui est un Context
).
Les fragments fournissent un accès facile à leur activité contenant via la méthode getActivity()
.
RESULT_CANCELED
est simplement une variable statique dans la classe Activity
, afin que vous puissiez y accéder n'importe où via Activity.RESULT_CANCELED
.