web-dev-qa-db-fra.com

Comment s'inscrireRécepteur dans Fragment

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.

8
Pamme Cobos

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.

25
abhilvare

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).

1
Bruno L.

é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é.

0
abedfar

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.

0
Tanis.7x