我有这款蓝牙耳机,每次都会向主要活动发送消息。在主要活动中,我有一个处理器,它将处理这些消息并相应地输出。
我有一个片段可以使用这些消息。我找不到从MainActivity向片段发送实时数据的方法,我也不想将处理程序代码复制/粘贴到片段中。
有没有办法将实时数据从mainActivity发送到片段。我提供了一些代码供您更好地理解。
MainActivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_dashboard);
//Bluetooth headset which send live data
tgDevice = new TGDevice(bluetoothAdapter, handler);
tgDevice.connect(false);
}
/**
* Handles messages from TGDevice
* @param menu
* @return
*/
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TGDevice.MSG_STATE_CHANGE:
switch (msg.arg1) {
case TGDevice.STATE_IDLE:
break;
case TGDevice.STATE_CONNECTING:
//androidVersion.setText("Connecting...\n");
break;
case TGDevice.STATE_CONNECTED:
//androidVersion.setText("Connected" + "\t" +wifiInfo.getSSID());
tgDevice.start();
break;
case TGDevice.STATE_NOT_FOUND:
//tv.append("Can't find\n");
break;
case TGDevice.STATE_NOT_PAIRED:
//tv.append("not paired\n");
break;
case TGDevice.STATE_DISCONNECTED:
//tv.append("Disconnected\n");
}
break;
case TGDevice.MSG_POOR_SIGNAL:
poorSignalValue = msg.arg1;
actionBar.setTitle("Signal: " + poorSignalValue);
Log.v("Poor", "Signal: " + poorSignalValue + "\n");
break;
default:
break;
}
}
};
片段将使用poorsignal以及其他变量。做这个的最好方式是什么?其他片段也将使用TGDevice。
答案 0 :(得分:1)
我会使用EventBus之类的东西。您的Fragment
会注册某个活动,而您的Activity
会发布更新。
答案 1 :(得分:0)
实现观察者模式,其中片段充当观察者和活动主体。有关更多信息,请参阅:
http://en.wikipedia.org/wiki/Observer_pattern
您也可以参考以下链接:
http://developer.android.com/training/basics/fragments/communicating.html.In此链接将片段作为主体和活动作为观察者。您需要反过来。
答案 2 :(得分:0)
查看此链接: http://developer.android.com/training/basics/fragments/communicating.html
您可以从主要活动中调用片段的功能。
public class Main extends FragmentActivity{
MyFragment articleFrag = (MyFragment)
getSupportFragmentManager().findFragmentById(R.id.fragment_id);
MyFragment.function();
}
public class MyFragment extends Fragment{
....
public void function(){
//do something ....
}
}
答案 3 :(得分:0)
您可以使用Android View Model和Live数据共享实现所需的行为。
//View model
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
//Fragment
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
}
}
确保从片段调用时传递ViewModelProviders.of( getActivity())而不是ViewModelProviders.of( this )。
有关详细信息:https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing