2016-06-18 2 views
0

Я пытаюсь передать данные между фрагментом и активностью, и я не могу. У меня нет ошибок или исключений. На моем фрагменте у меня есть значение vallue и on activity, значение которого равно null. Я использую интерфейсы.Android: данные между фрагментами и действиями

Код HoroscopeChoice Фрагмент, который является фрагментом с кнопками. Каждая кнопка имеет значение, которое я хочу передать в действие каждый раз, когда я их нажимаю.

(...) 
    static OnInfoChangedListener mCallback; 

public HoroscopeChoice() {} 
    /****************************** 
    * Callback 
    ********/ 
    public static void OnInfoChangedListener(OnInfoChangedListener callback) { 
     mCallback = callback; 
    } 
    public interface OnInfoChangedListener { 
     public void onInfoChanged(String horosocopo); 
    } 
public View onCreateView(final LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_horoscope_choice, 
       container, false); 

     Button aquarius; 
     aquarius = (Button) view.findViewById(R.id.aquarius1); 

     final int id = view.getId(); 

     View.OnClickListener onClickListener = new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       String horoscopo = onClick2(v.getId()); 
       Log.d("HoroscopeChoice", "push button->"+horoscopo); 
       mCallback.onInfoChanged(horoscopo); 
      } 
     }; 

     aquarius.setOnClickListener(onClickListener); 

public String onClick2(int id) 
{ 
    String horoscopo=""; 

    if (id == R.id.aquarius1) { 
     horoscopo = "Aquarius"; 
    } 
} 
(...) 

Код деятельности:

(...) 
public void onInfoChanged(String horoscopo) { 
     Log.d("SchedulerActivity","OnInfoChanged na Scheduler->"+horoscope); 

     mHoroscopeDisplay = (TextView) findViewById(R.id.dailyHoroscope4); 
     mHoroscopeDisplay.setText(horoscopo); 
    } 

Когда я Log.d в Фрагменте я получаю значение, на операцию я не имеют никакого значения. Кто-нибудь знает, что не так?

+0

1. Как устанавливается 'mCallback'? 2. Возможно, проблема находится внутри метода onClick2(). Что там? – Karakuri

+0

@ Karakuri Я забыл поместить его здесь, но я добавил. Когда я печатаю Log.d(), который у меня есть в коде, я получаю действительное значение в Fragment, но в Activity no ... – porthfind

+0

Вы не добавили, где 'mCallback' _assigned_. Вы только добавили, где это _declared_. Я ищу что-то вроде 'mCallback = {something}' – Karakuri

ответ

0

Вы можете сделать это через обратные вызовы через интерфейс, но есть еще более простой способ с большой сторонней библиотекой, называемой EventBus, которая идеально подходит для такого рода вещей. Вы можете отправить любой объект с одного места на другой.

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

0

Не используйте объект статического слушателя, особенно для хранения чего-то вроде Activity. Вместо этого вы должны сделать слушателем переменную экземпляра. Стандартный шаблон для использования интерфейса между фрагментами и действиями - это использование onAttach().

private OnInfoChangedListener mCallback; 

@Override 
public void onAttach(Activity activity) { 
    if (!(activity instanceof OnInfoChangedListener)) { 
     throw new IllegalStateException("Activity must implement OnInfoChangedListener!"); 
    } 
    mCallback = (OnInfoChangedListener) activity; 
} 

@Override 
public void onDetach() { 
    mCallback = null; 
} 
+0

После внесения изменений, я все равно не получаю значение от активности. Я думаю, что проблема связана с деятельностью, но я не знаю, где. – porthfind

+0

@porthfind, тогда вам, вероятно, потребуется добавить больше кода в свой пост – Karakuri

Смежные вопросы