2015-05-12 2 views
1

У меня есть внутренняя дискуссия о том, какой способ лучше обмениваться информацией между содержимым фрагментов внутри активности контроллера. В первом классическим способом, вы можете задать аргументы, когда вы собираетесь заменить фрагменты следующим образом:Фрагменты Android об обмене информацией

   //Just now i'm inside Fragment 1 and i'll navigate to Fragment 2 
       Fragment newFragment = getFragmentManager().findFragmentByTag(Fragment2.TAG); 

       Bundle b = new Bundle(); 
       b.putBoolean("test1", true); 

       // Create new fragment and transaction 
       if(newFragment==null) 
        newFragment = Fragment2.newInstance(b); 

       FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
       transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)//.setCustomAnimations(R.anim.enter_anim, R.anim.exit_anim) 
          .replace(R.id.fragment_place, newFragment, Fragment2.class.getName()) 
          .addToBackStack(newFragment.getClass().getName()) 
          .commit(); 

Метод newInstace делает, как я имел в виду выше, поэтому, с setArguments:

public static Fragment2 newInstance(Bundle arguments){ 
    Fragment2 f = new Fragment2(); 
    if(arguments != null){ 
     f.setArguments(arguments); 
    } 
    return f; 
} 

Но Fragment1 и Fragment2 они оба находятся внутри ControllerActivity, поэтому я также могу подумать о втором способе обмена информацией, полученной в Fragment1 по направлению к Fragment2, путем объявления атрибутов в ControllerActivity, поэтому я мог бы сделать (объявив ранее объект в активности) следующим образом внутри любой фрагмент:

EDIT

public class ControllerActivity extends FragmentActivity{ 

int value = 5; 
... 

А потом, в моем фрагменте:

((SplashActivity)getActivity()).value = 10; //i can assign or recover value when i desire 

Мой вопрос: что неудобствами бы делать в качестве второго пути.

+0

Вы будете использовать асинхронные операции в своем приложении, которые могут изменять значения активности? –

+0

Вы имеете в виду «inter-fragment communication»? – Paritosh

+0

Единственное зло, которое я знаю таким образом, это демоны Статические переменные развязывают! Сказав, что я не могу сопротивляться их использованию. – Skynet

ответ

1

Письменный код с использованием 2-го способа быстро. Но проблема в том, что вам нужно отбросить общее число Activity к конкретному SplashActivity, в котором существует переменная value. Если вы хотите использовать Фрагмент с другим действием или хотите, чтобы фрагмент был компонентом пользовательского интерфейса общего назначения, вы должны использовать interface для передачи данных.

Как уже упоминалось в комментариях, гофрированные ссылки предоставляют более подробную информации о interface/callback методы:

Надеется, что это ответ на ваш вопрос.