将实时数据从主要活动发送到片段

时间:2014-08-19 16:40:58

标签: java android android-fragments

我有这款蓝牙耳机,每次都会向主要活动发送消息。在主要活动中,我有一个处理器,它将处理这些消息并相应地输出。

我有一个片段可以使用这些消息。我找不到从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。

4 个答案:

答案 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