Java 将多段数据从片段发送到MainActivity(Android Studio)
我目前有一个包含两个微调器的片段,我想将这两个微调器的信息发送到MainActivity。这可能吗?当我仅从一个微调器发送信息时,我的代码可以工作,但只要我尝试从两个微调器发送信息(如下所示),所有信息都不会被传输: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
@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
}
}