2015-05-12 62 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; 
} 

但片段1和Fragment2它们都在ControllerActivity中,所以我也可以考虑通过在ControllerActivity中声明属性来共享在Fragment1中获取的信息的第二种方法,以便我可以在活动中声明以前的对象,如下所示任何片段:

编辑

public class ControllerActivity extends FragmentActivity{ 

int value = 5; 
... 

然后,我的片段里面:

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

我的问题是什么不便之处将有做的第二种方式。

+0

你会在你的应用程序中使用异步操作,它可以改变活动值? –

+0

你的意思是“片段间通信”吗? – Paritosh

+0

我以这种方式知道的唯一的邪恶就是恶魔的静态变量释放!说了我不能拒绝使用它们。 – Skynet

回答

1

使用第二种方式编写代码很快。但问题是您必须将Activity转换为更具体的SplashActivity,其中value变量存在。如果您想将碎片与其他活动一起使用,或者您希望碎片成为通用用户界面组件,则必须使用interface来传递数据。

正如评论所说,波纹管链接提供了更多详细的interface/callback方法:

希望这回答了你的问题。