2015-06-05 5 views
0

У меня есть фрагмент, содержащий два прядильника, и я хочу отправить информацию от обоих прядильщиков в MainActivity. Это возможно? В то время как мой код работает, когда я отправить информацию только от одного блесен, как только я пытаюсь отправить информацию из обоего блесен (согласно ниже), ни одна из информации не представляется, передаются:Отправка нескольких фрагментов данных из фрагмента в MainActivity (Android Studio)

@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» - это метод, который я использую реализованный в фрагменте 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); 
    } 

Однако я придумывая исключением Null Pointer для обоих из них. Я пробовал проверить это, заменив «eachPersonOwesThisESString» на фактическую строку (например, «test»), но в большинстве случаев я все еще получаю исключение Null Pointer. Любая помощь оценивается.

+0

Так что же происходит? Вы получаете исключение и игнорируете его из-за пустого блока catch? Кроме того, вы знаете, что слушатель может иметь несколько методов, не так ли? У вас есть причина иметь 2 слушателя для 1 фрагмента? – tachyonflux

+1

Вы не должны улавливать это исключение, если вы испортите классное литье, это ошибка программирования, о которой вы должны знать **. На самом деле это может не сработать, потому что вы забыли добавить второго слушателя в свою деятельность. – EpicPandaForce

ответ

0

Вы должны использовать Handler

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 кодов, чтобы отличить их. Инициализируйте его в действии и отправьте на фрагмент, он запустится, когда вы напишете h.sendMessage

0

Если я хотел решить эту проблему, то я бы использовал шину событий (хотя, если вы действительно этого хотите, вы можете технически использовать LocalBroadcastManager с Parcelables).

С шиной событий Отто, он выглядел бы как этот

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 
    } 
} 
Смежные вопросы