[英]Pass Data to Fragment from Activity, when intially loaded with Fragment
所以我的问题基本上是我的MainActivity最初加载有一个Fragment,我们将其称为MyFragment。
我正在从网上加载JSON,并希望传递到MyFragment中。
在MainActivity中调用setContentView时会出现问题,它在MyFragment中调用onCreateView,其中包含getArguments.getSerializable(“ myTag”) 。 该密钥未传递,因为我尚未加载JSON。
您能帮我解决这个问题吗?
这是我的代码:
在我的MyFragment中:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(getArguments() != null) {
coll = (HashSet<String>) getArguments().getSerializable("myTag");
}
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_my, container, false);
}
MainActivity(假设我已经加载了JSON):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadJSON();
passTagsToFragment(); //passes to the fragment
}
public void passTagsToFragment(){
Bundle bundle = new Bundle();
bundle.putSerializable("myTags", tagsSet);
TagsFragment frag = new MyFragment();
frag.setArguments(bundle);
}
编辑:
基本上,我的问题是我想在甚至开始加载Fragment之前完全加载MainActivity。 不知道该怎么做。
编辑2:
我解决的问题是我的代码:(更改了变量名)
MainActivity.java
public TagsFragment passInfoToTagsFramgent(){
Bundle bundle = new Bundle();
bundle.putSerializable("tags", tagsList);
TagsFragment frag = new TagsFragment();
frag.setArguments(bundle);
return frag;
}
在MainActvity.java的OnPostExecute中:
Fragment tagFragment = passInfoToTagsFramgent();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, tagFragment);
transaction.commit();
loadJSON来自在线资源,因此我假设它是一个AsyncTask。
我通常将其作为lamda表达式(kotlin)来执行:
loadJSON({passTagsToFragment()})
loadJSON应该使用lamda表达式作为参数:
loadJSON(private val callback:()->Unit )
在AsyncTask :: onPostExecute中,您应该调用回调:
callback.invoke()
要不就
callback()
然后,确保在加载JSON并将其传递给片段时打开该片段。
好,让我尝试用Java制作它。
在加载JSON的AsyncTask中,您需要一个接口,例如,
public interface JSONLoadCallback {
void loaded();
}
并且其构造函数将接口作为参数:
class JSONLoader : AsyncTask<....> {
JSONLoader(JSONLoadCallback callback) {
_callback = callback;
}
@Override
public void onPostExecute() {
_callback.loaded();
}
}
并且您的Activity实现了JSONLoadCallback:
@Override
public void loaded() {
passTagsToFragment();
}
并且应该将自身传递给AsyncTask:
JSONLoader(this).executeOnExecutor();
这样,当JSON加载完成时,将触发loaded()函数。
您会看到,Java代码非常语言化,Kotlin几乎消除了Java接口的必要性。
加载所有json数据后,应在asynctask的 post execute方法中调用passTagsToFragment()方法。
protected void onPostExecute(Long result) {
passTagsToFragment();
}
根据我的理解,您也可以在片段上调用Loadjson()方法并相应地使用数据,但是如果您有一些特定的逻辑,则可以使用asynctask,并且在带有进度条的json检索中,可以设置任何MyFragment回调并相应地更新片段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.