繁体   English   中英

初始加载Fragment时,将数据从Activity传递到Fragment

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM