Java 将多段数据从片段发送到MainActivity(Android Studio)

Java 将多段数据从片段发送到MainActivity(Android Studio),java,android,android-fragments,Java,Android,Android Fragments,我目前有一个包含两个微调器的片段,我想将这两个微调器的信息发送到MainActivity。这可能吗?当我仅从一个微调器发送信息时,我的代码可以工作,但只要我尝试从两个微调器发送信息(如下所示),所有信息都不会被传输: @Override public void onAttach(Activity activity) { super.onAttach(activity); try { onNumberInPartyListener = (onNumberInPar

我目前有一个包含两个微调器的片段,我想将这两个微调器的信息发送到MainActivity。这可能吗?当我仅从一个微调器发送信息时,我的代码可以工作,但只要我尝试从两个微调器发送信息(如下所示),所有信息都不会被传输:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        onNumberInPartyListener = (onNumberInPartyListener) activity;
        onMethodOfSplitListener = (onMethodOfSplitListener) activity;
    }
    catch (Exception ex){}

}
我需要创建两个onAttach方法、两个片段还是有其他方法

谢谢

更新:

因此,我最终放弃了上述内容,而是使用了一个“接口”java类将信息从片段1发送到主活动,但是现在我在将信息从主活动发送到片段2时遇到了问题

在我的主要活动中,我使用以下代码将信息发送到片段2(“evenSplit_Calculation Fragment2”是片段2,“TellmeheachPersonowes”是我在片段2中实现的方法):

在片段2中,我实现了如下:

//What Each Person Owes (from Main Activity) 

public void tellMeWhatEachPersonOwesES (String eachPersonOwesThisESString) {
amountEachPersonOwesES.setText(eachPersonOwesThisESString);
    }
然而,我为这两个都提出了一个空指针异常。我试着用一个实际的字符串(例如“test”)替换“eachpersonowesthissestring”,以测试这一点,但最令人困惑的是,我仍然得到一个空指针异常。感谢您的帮助。

您应该使用


您可以将一个处理程序与不同的
msg.what
代码一起使用以区分它们。在activity中初始化它并发送到fragment,当您编写
h.sendMessage

时,它将启动。如果我想解决此问题,我将使用事件总线(尽管如果您确实需要,您可以在技术上使用LocalBroadcastManager和包裹)

有了奥托事件巴士,情况会是这样的

public enum SingletonBus {
    INSTANCE;

    private Bus bus;

    private Handler handler = new Handler(Looper.getMainLooper());

    private SingletonBus() {
        this.bus = new Bus(ThreadEnforcer.ANY);
    }

    public <T> void postToSameThread(final T event) {
        bus.post(event);
    }

    public <T> void postToMainThread(final T event) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                bus.post(event);
            }
        });
    }

    public <T> void register(T subscriber) {
        bus.register(subscriber);
    }

    public <T> void unregister(T subscriber) {
        bus.unregister(subscriber);
    }
}

public class YourFragment extends android.support.v4.Fragment {
     public static class SpinnersSelectedEvent {
          public String firstSpinnerData;
          public String secondSpinnerData;

          public SpinnersSelectedEvent(String firstSpinnerData, String secondSpinnerData) {
              this.firstSpinnerData = firstSpinnerData;
              this.secondSpinnerData = secondSpinnerData;
          }
     }

     @OnClick(R.id.yourfragment_thebutton) 
     public void theButtonClicked() {
          SingletonBus.INSTANCE.postToSameThread(new SpinnersSelectedEvent(firstSpinner.getSelectedItem(), secondSpinner.getSelectedItem()); //pseudo code on the spinner part
     }

}

public class MainActivity extends AppCompatActivity {
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        //...
        SingletonBus.INSTANCE.register(this);
    }

    public void onDestroy() {
        super.onDestroy();
        SingletonBus.INSTANCE.unregister(this);
    }

    @Subscribe
    public void onSpinnersSelectedEvent(YourFragment.SpinnersSelectedEvent e) {
        String firstData = e.firstSpinnerData;
        String secondData = e.secondSpinnerData;
        // do things
    }
}
公共枚举单总线{
例子
私家巴士;
私有处理程序Handler=新处理程序(Looper.getMainLooper());
专用单总线(){
this.bus=新总线(ThreadEnforcer.ANY);
}
公共无效后读取(最终T事件){
巴士.邮政(事件);;
}
公共void postToMainThread(最终T事件){
handler.post(新的Runnable(){
@凌驾
公开募捐{
巴士.邮政(事件);;
}
});
}
公共无效登记簿(T用户){
总线寄存器(用户);
}
公共无效注销(T用户){
总线注销(用户);
}
}
公共类YourFragment扩展了android.support.v4.Fragment{
公共静态类喷丝头SelectedEvent{
公共字符串数据;
公共字符串数据;
公共喷丝头SelectedEvent(字符串第一喷丝头数据、字符串第二喷丝头数据){
this.firstSpinnerData=firstSpinnerData;
this.secondSpinnerData=secondSpinnerData;
}
}
@单击(R.id.yourfragment\u按钮)
public void按钮已单击(){
SingletonBus.INSTANCE.PostToSametRead(新微调器SelectedEvent(firstSpinner.getSelectedItem(),secondSpinner.getSelectedItem());//微调器部件上的伪代码
}
}
公共类MainActivity扩展了AppCompatActivity{
创建公共void(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
//...
SingletonBus.INSTANCE.register(this);
}
公共空间{
super.ondestory();
SingletonBus.INSTANCE.unregister(此);
}
@订阅
Spinners SelectedEvent(YourFragment.Spinners SelectedEvent e)上的公共无效{
字符串firstData=e.firstSpinnerData;
字符串secondData=e.secondSpinnerData;
//做事
}
}

那么到底发生了什么呢?您是否因为空的
catch
块而得到一个异常并忽略它?另外,您知道一个侦听器可以有多个方法,对吗?您有理由为一个片段使用两个侦听器吗?您不应该捕获该异常,如果您将类转换搞砸了,这就是您需要注意的编程错误应该知道。事实上,它可能不起作用,因为您忘记将第二个侦听器添加到活动中。
h = new Handler() {
      public void handleMessage(android.os.Message msg) {
        // Getting data from Handler
        tvInfo.setText("Data from Spinner1: " + msg.what);
        if (msg.what == 10)
          // do what you need
      };
    };
public enum SingletonBus {
    INSTANCE;

    private Bus bus;

    private Handler handler = new Handler(Looper.getMainLooper());

    private SingletonBus() {
        this.bus = new Bus(ThreadEnforcer.ANY);
    }

    public <T> void postToSameThread(final T event) {
        bus.post(event);
    }

    public <T> void postToMainThread(final T event) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                bus.post(event);
            }
        });
    }

    public <T> void register(T subscriber) {
        bus.register(subscriber);
    }

    public <T> void unregister(T subscriber) {
        bus.unregister(subscriber);
    }
}

public class YourFragment extends android.support.v4.Fragment {
     public static class SpinnersSelectedEvent {
          public String firstSpinnerData;
          public String secondSpinnerData;

          public SpinnersSelectedEvent(String firstSpinnerData, String secondSpinnerData) {
              this.firstSpinnerData = firstSpinnerData;
              this.secondSpinnerData = secondSpinnerData;
          }
     }

     @OnClick(R.id.yourfragment_thebutton) 
     public void theButtonClicked() {
          SingletonBus.INSTANCE.postToSameThread(new SpinnersSelectedEvent(firstSpinner.getSelectedItem(), secondSpinner.getSelectedItem()); //pseudo code on the spinner part
     }

}

public class MainActivity extends AppCompatActivity {
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        //...
        SingletonBus.INSTANCE.register(this);
    }

    public void onDestroy() {
        super.onDestroy();
        SingletonBus.INSTANCE.unregister(this);
    }

    @Subscribe
    public void onSpinnersSelectedEvent(YourFragment.SpinnersSelectedEvent e) {
        String firstData = e.firstSpinnerData;
        String secondData = e.secondSpinnerData;
        // do things
    }
}