Как registerReceiver в фрагменте

Я показываю устройства Bluetooth в ListView. Я попробовал это в Activity раньше и это работало, но теперь я должен включить это ListView на Fragment

ясно, что одна или две вещи не принадлежат здесь, как registerReceiver, unregisterReceiver и 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();
        }
    }

строки, которые начинаются с registerReceiver, unegisterReceiver и if(resultCode==RESULT_CANCELED){ дают мне проблемы.

как aditional факт, я попытался изменить его на активность вместо фрагмента, но мой Основной класс имеет ошибку с этим, потому что я работаю с фрагментами.

4 ответов


все эти методы и переменные, принадлежащие Activity класса. Поэтому рассмотрим их вызов с контекстом родительской активности фрагмента.

вы можете вызвать необходимые методы как:

 getActivity().registerReceiver(receiver, filter);

и

 getActivity().unregisterReceiver(receiver);

if(resultCode==RESULT_CANCELED){

можно заменить на

if(resultCode == Activity.RESULT_CANCELED){

надеюсь, что это решит вашу проблему.


Что касается широковещательного сообщения, Вы ничего не получите, если зарегистрируетесь так:

getActivity().registerReceiver(receiver, filter);

вы должны написать:

LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, filter);

например, случай намерения, отправленного из службы (IntentService).


на registerReceiver() и unregisterReceiver() методы методы Context класса. В этом случае вам понадобится ваш Activity (это Context).

фрагменты обеспечивают легкий доступ к их содержащей активности через getActivity() метод.

RESULT_CANCELED - это просто статическая переменная на Activity класс, поэтому вы можете получить доступ к нему в любом месте через Activity.RESULT_CANCELED.


учитывая, что активность воссоздается при изменении конфигурации, а фрагмент сопротивляется, это означает, что контекст активности может исчезнуть, что приводит к потере приемников в рекреации активности. Поэтому я бы предложил зарегистрировать широковещательные приемники в вашем фрагменте с контекстом уровня приложения. Затем вы можете зарегистрировать и отменить регистрацию своих приемников в onResume() и onPause() фрагмента соответственно. Таким образом, ваши приемники привязаны к жизненному циклу фрагмента, а не к активности.