Android 在片段之间传递数据,而不新实例化接收片段
f.i.回答说,在片段之间传递数据是一种常见的情况。您构建了一个由片段的主机活动实现的接口。在活动的实现方法中,接收片段是新实例化的,新传输的数据作为一个包 问题是:我需要一个包含新信息的接收片段的旧实例,而不是一个新实例 我有一个带有一个片段容器的主活动。第一个片段是一个表单,用户必须在其中填写一些数据。某个按钮打开第二个片段,其中选择了树视图中的项目。选择必须传输到第一个片段中的文本字段。当然,第一个片段中的条目永远无法删除 我可以将所有输入字段的内容放在一个接口中,然后将它们重新填充到firstFragment的新实例中,但这对我来说似乎相当愚蠢 “一个容器多个片段”模式是否适用于我的情况?或者我应该使用第二个碎片容器并打开和关闭Visibility 遗憾的是,startactivityforresult不适用于片段 非常感谢 编辑:这是我主要活动的代码Android 在片段之间传递数据,而不新实例化接收片段,android,android-fragments,appcompatactivity,Android,Android Fragments,Appcompatactivity,f.i.回答说,在片段之间传递数据是一种常见的情况。您构建了一个由片段的主机活动实现的接口。在活动的实现方法中,接收片段是新实例化的,新传输的数据作为一个包 问题是:我需要一个包含新信息的接收片段的旧实例,而不是一个新实例 我有一个带有一个片段容器的主活动。第一个片段是一个表单,用户必须在其中填写一些数据。某个按钮打开第二个片段,其中选择了树视图中的项目。选择必须传输到第一个片段中的文本字段。当然,第一个片段中的条目永远无法删除 我可以将所有输入字段的内容放在一个接口中,然后将它们重新填充到fi
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//init Databinding
oBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
setSupportActionBar(oBinding.toolbar);
if(oBinding.mainContainer != null){
//are we restoring the instance state?
if(savedInstanceState != null){
return; //yes - do nothing
}
MainFragment oMainFragment = new MainFragment();
getSupportFragmentManager()
.beginTransaction()
.add(oBinding.mainContainer.getId(), oMainFragment)
.commit();
}
}
@Override
public void onCatButtonClicked() {
NewCatFragment oSubFragment = new NewCatFragment();
getSupportFragmentManager()
.beginTransaction()
.replace(oBinding.mainContainer.getId(), oSubFragment)
.addToBackStack(null)
.commit();
}
@Override
public void onItemSelected(String sItem) {
//here i'd like old instance qith just some new stuff
MainFragment oMainFragment = new MainFragment();
Bundle oBundle = new Bundle();
oBundle.putString("ITEM", sItem);
oMainFragment.setArguments(oBundle);
getSupportFragmentManager()
.beginTransaction()
.replace(oBinding.mainContainer.getId(), oMainFragment)
.addToBackStack(null)
.commit();
}
感谢@Levi Albuquerque,我找到了一个简单的解决方案。我只是把片段放在一个全局变量中并重用它——我想我必须总是实例化它。在那个例子中,我可以简单地调用setter方法
private MainFragment oMainFragmentInstance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//init Databinding
oBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
setSupportActionBar(oBinding.toolbar);
if(oBinding.mainContainer != null){
//are we restoring the instance state?
if(savedInstanceState != null){
return; //yes - do nothing
}
oMainFragmentInstance = new MainFragment();
getSupportFragmentManager()
.beginTransaction()
.add(oBinding.mainContainer.getId(), oMainFragmentInstance)
.commit();
}
}
@Override
public void onCItemSelected(String sItem) {
oMainFragmentInstance.SetCat(sItem);
getSupportFragmentManager()
.beginTransaction()
.replace(oBinding.mainContainer.getId(), oMainFragmentInstance)
.addToBackStack(null)
.commit();
}
就我个人而言,我不喜欢全局变量,这是一种不好的做法,你需要每次定期更新它们,以便在你想要的地方使用它们 我的解决方案是只使用片段管理器的findFragment
Fragment fragment = getFragmentManager().findFragmentByTag("yourstringtag");
从这里,您可以执行以下操作:
fragment.getArguments().putString("existing key","newValue");
您可以实例化片段一次,并根据需要在容器中简单地替换它们,将必要的数据保存为活动的实例变量。您不需要每次都用数据填充片段,只需在现有片段上使用setter方法即可。如果你发布你的代码,我可以给你展示一个听起来像解决方案的例子,只是添加了我的代码。非常感谢你!很高兴你弄明白了:)谢谢-findfragmentbytag似乎更像是android检索片段的方式