android - 在不重新实例化接收 fragment 的情况下在 fragment 之间传递数据

标签 android android-fragments appcompatactivity

在 fragment 之间传递数据是一种常见的场景,f.i. 回答道。 here .您构建一个由 fragment 的宿主 Activity 实现的接口(interface)。在Activity的实现方法中,接收 fragment 被重新实例化,新的传输数据作为一个Bundle。

问题:我需要一个添加了新信息的接收 fragment 的旧实例,而不是新实例。

我有一个主要 Activity 与一个 fragment 容器。第一个 fragment 是一个表单,用户必须在其中填写一些数据。某个按钮打开第二个 fragment ,其中从 TreeView 中选择了一个项目。选择必须传输到第一个 fragment 中的文本字段。当然,第一个 fragment 中的条目永远无法删除。

我可以将所有输入字段的内容放在一个界面中,然后将它们重新填充到 firstFragment 的新实例中,但这对我来说似乎相当愚蠢。

“一个容器多个 fragment ”模式是否适用于我的情况?或者我应该使用第二个 fragment 容器并打开和关闭可见性?

不幸的是,startactivityforresult 不适用于 fragment 。

非常感谢!

编辑:这是我主要 Activity 的代码。

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,我找到了一个简单的解决方案。我只是把 fragment 放在一个全局变量中并重新使用它——我想我必须总是实例化它。在那种情况下,我能够简单地调用一个 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();
}

关于android - 在不重新实例化接收 fragment 的情况下在 fragment 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49583037/

相关文章:

android - 在 4.0.4 中删除包含 videoView 的 fragment 时出错

android - 类型的预期接收者,但得到了 android.support.v7.widget.TintContextWrapper

Android:使用 RandomAccessFile 从内部存储访问文件

android - 如何解决错误 : getSharedPreferences(String, int) is undefined for the type new View.OnClickListener(){}

android - Mobikwik Dashboard 仪表板

java.lang.RuntimeException : Unable to start activity ComponentInfo{. .}java.lang.NullPointerException

android - AppCompatActivity 自定义 ActionBar 按钮不出现在 Android 4.1.2

android - 使用 Toolbar 和 SwipeRefreshLayout 的正确方法是什么?

java - 如何在 android EditText 中实现撤消/重做并保留方向更改的值?

android - 微调器删除项目