Я пишу приложение, использующее bluetooth-соединение для чтения некоторых данных из COM-порта через Bluetooth. Я использую ViewPager
для отображения нескольких фрагментов, которые я использую для отображения некоторых данных (каждый фрагмент по-другому). Приложение имеет 2 вида деятельности:Инициализация и обновление фрагментов в ViewPager
MainActivity
- инициализация соединения Bluetooth и управление ими упоминалось фрагментыActivity
, используемые для поиска устройств Bluetooth
Когда MainActivity
начинается, он активирует Bluetooth в случае, если это выкл и отображает первый фрагмент. Я могу сканировать устройства, нажав кнопку на панели действий.
Моя проблема довольно проста: я хотел бы подтолкнуть некоторые исходные данные (о соединении) к фрагментам после инициализации MainActivity
, а после создания BT-соединения я хочу нажать некоторые данные (около 10 раз/сек) только к видимому фрагменту.
Я попытался сделать это, используя LocalBroadcastManager во всех фрагментах, но broadcastReceiver
не зарегистрирован, что рано, и он не получает все сообщения. Я попытался перевести регистрацию в onCreate
в классы фрагментов, но это тоже не сработало. Я также попытался реализовать интерфейс обратного вызова для основной деятельности, но я получал NPE.
Кроме того, одна проблема, о которой я беспокоюсь, может оказаться не лучшим решением проблемы обновления одного или нескольких фрагментов об изменениях. Я открыт для советов.
класс Mainactivity:
@Override
protected void onStart() {
super.onStart();
if (!bluetoothAdapter.isEnabled()) {
Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBluetoothIntent, REQUEST_ENABLE_BLUETOOTH);
} else {
if (btService == null) {
btService = new BluetoothConnectionService(this, msgHandler);
}
}
}
private final Handler msgHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Intent intent = new Intent(STATUS_EVENT);
switch (msg.what) {
case MESSAGE_STATE_CHANGE:
switch (msg.arg1) {
case BluetoothConnectionService.STATE_CONNECTED:
intent.putExtra("status", "Connected");
// tell fragments about the state change
break;
case BluetoothConnectionService.STATE_CONNECTING:
intent.putExtra("status", "Connecting");
// tell fragments about the state change
break;
case BluetoothConnectionService.STATE_NONE:
intent.putExtra("status", "Not connected");
// tell fragments about the state change
break;
default:
intent.putExtra("status","Unknown state");
break;
}
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
}
}
};
BTService часть:
public void setCurrentConnectionState(int currentConnectionState) {
this.currentConnectionState = currentConnectionState;
msgHandler.obtainMessage(MainActivity.MESSAGE_STATE_CHANGE, currentConnectionState, -1).sendToTarget();
}
public BluetoothConnectionService(Context context, Handler handler){
this.context = context;
this.msgHandler = handler;
setCurrentConnectionState(STATE_NONE);
}
Один из фрагментов:
public class ConnectionStatusFragment extends Fragment {
TextView connectionStatus;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_connection_info, container, false);
connectionStatus = (TextView) rootView.findViewById(R.id.connectionStatus);
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(broadcastReceiver, new IntentFilter(MainActivity.STATUS_EVENT));
return rootView;
}
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
connectionStatus.setText(intent.getStringExtra("status"));
}
};
}
Что мешает вам добавить функцию к Фрагмент и передача данных через параметры функции? – BVB
Это на самом деле довольно сложный вопрос, потому что вы спрашиваете, что является лучшим способом поговорить с фрагментом. Я бы порекомендовал проверить библиотеку otto squareup. Ваши фрагменты могут стать позиционируемыми, добавив свою позицию в пакет и фрагмент.setArguments (bundle) в ViewPager.getView(). Затем вы можете опубликовать событие с информацией и информацией, которую вы хотите обновить. Другое предложение - установить тег на фрагмент. Таким образом, вы можете найти его из FragmentManager (FragmentSupportManager) и посмотреть, является ли он нулевым или нет, а затем обновлять данные. – MinceMan
Мое предупреждение с помощью фрагментатора - вы можете в конечном итоге с действиями и фрагментами в случайных состояниях, которые могут действительно запутать вас, otto предотвращает это. – MinceMan