Java 当初始加载片段时,将数据从活动传递给片段
所以我的问题是,我的MainActivity最初加载了一个片段,我们称之为MyFragment 我正在从在线加载JSON,并希望将其传递到我的MyFragment中 在MainActivity中调用setContentView时会出现问题,它在MyFragment中调用onCreateView,其中包含getArguments.getSerializable(“myTag”)。密钥没有传递,因为我还没有加载JSON 你能帮我解决这个问题吗 这是我的密码: 在我的MyFragment中:Java 当初始加载片段时,将数据从活动传递给片段,java,android,android-fragments,Java,Android,Android Fragments,所以我的问题是,我的MainActivity最初加载了一个片段,我们称之为MyFragment 我正在从在线加载JSON,并希望将其传递到我的MyFragment中 在MainActivity中调用setContentView时会出现问题,它在MyFragment中调用onCreateView,其中包含getArguments.getSerializable(“myTag”)。密钥没有传递,因为我还没有加载JSON 你能帮我解决这个问题吗 这是我的密码: 在我的MyFragment中: @Ove
@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。我不知道该怎么做
编辑2:
我修复了我的代码中的问题:(更改了变量名)
MainActivity.java
public TagsFragment passInfoToTagsFramgent(){
Bundle bundle = new Bundle();
bundle.putSerializable("tags", tagsList);
TagsFragment frag = new TagsFragment();
frag.setArguments(bundle);
return frag;
}
在MainActivity.java的OnPostExecute中:
Fragment tagFragment = passInfoToTagsFramgent();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, tagFragment);
transaction.commit();
loadJSON来自在线源代码,所以我假设它是一个异步任务 我通常用lamda表达式(kotlin)来表示: loadJSON应采用lamda表达式作为参数:
loadJSON(private val callback:()->Unit )
class JSONLoader : AsyncTask<....> {
JSONLoader(JSONLoadCallback callback) {
_callback = callback;
}
@Override
public void onPostExecute() {
_callback.loaded();
}
}
在AsyncTask::onPostExecute中,您应该调用回调:
callback.invoke()
或者只是
callback()
然后确保在加载JSON并将其传递给片段时打开片段
好的,让我试着用Java实现它
在加载JSON的AsyncTask中,您需要一个接口,例如
public interface JSONLoadCallback {
void loaded();
}
its构造函数以接口为参数:
loadJSON(private val callback:()->Unit )
class JSONLoader : AsyncTask<....> {
JSONLoader(JSONLoadCallback callback) {
_callback = callback;
}
@Override
public void onPostExecute() {
_callback.loaded();
}
}
并应将其自身传递给AsyncTask:
JSONLoader(this).executeOnExecutor();
这样,当JSON加载完成时,将触发loaded()函数
你看,Java代码是非常口头的,Kotlin几乎消除了Java接口的必要性。当加载所有json数据时,你应该在asynctask的post-execute方法中调用你的passTagsToFragment()方法
protected void onPostExecute(Long result) {
passTagsToFragment();
}
根据我的理解,您也可以在片段上调用Loadjson()方法并相应地使用数据,但如果您有一些特定的逻辑,您可以使用asynctask,在带有进度条的json检索上,您可以设置任何MyFragment回调并相应地更新您的片段。在onActivityCreated()中调用它 method@SavaDimitrijević遇到了相同的错误。您可以调用API从片段中的服务器获取JSON,也可以使用阻止进度对话框,直到从服务器检索到JSON,然后使用数据加载片段。谢谢,但是,我不理解您的代码。我正在运行AyncTask,你能帮我把它翻译成Java吗?同样的错误。在XML中,我添加了一个片段视图。因此,当我第一次启动应用程序时,它会在MainActivity.java之前加载Fragment.java。也许这有助于澄清问题。你能分享activity_main.xml及其java类的代码吗
protected void onPostExecute(Long result) {
passTagsToFragment();
}