将片段中的多个数据发送到MainActivity(Android Studio)

时间:2015-06-05 23:47:32

标签: java android android-fragments

我目前有一个包含两个微调器的片段,我想将两个微调器的信息发送到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_CalculationFragment2'是片段2和' tellMeWhatEachPersonOwesES是我的方法' ve在片段2中实现:

//Send data to Even Split Fragment 2

evenSplit_CalculationFragment2.tellMeWhatEachPersonOwesES(eachPersonOwesESString);

在片段2中,我实现了以下内容:

//What Each Person Owes (from Main Activity) 

public void tellMeWhatEachPersonOwesES (String eachPersonOwesThisESString) {
amountEachPersonOwesES.setText(eachPersonOwesThisESString);
    }

但是,我为这两者提出了空指针异常。我试过通过替换“eachPersonOwesThisESString'用一个实际的字符串(例如" test")但是大多数人都感到困惑,我仍然得到一个空指针异常。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

您应该使用Handler

ptrdiff_t

您可以使用一个具有不同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 }; }; 代码的处理程序来区分它们。在活动中初始化并发送到片段,当您编写msg.what

时,它将启动

答案 1 :(得分:0)

如果我想解决这个问题,我要做的就是使用事件总线(尽管如果你真的想要,你可以在技术上使用带有Parcelables的LocalBroadcastManager)。

使用Otto事件总线,它看起来像这样

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
    }
}