Как 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()
фрагмента соответственно. Таким образом, ваши приемники привязаны к жизненному циклу фрагмента, а не к активности.