Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在片段之间传递数据,而不新实例化接收片段_Android_Android Fragments_Appcompatactivity - Fatal编程技术网

Android 在片段之间传递数据,而不新实例化接收片段

Android 在片段之间传递数据,而不新实例化接收片段,android,android-fragments,appcompatactivity,Android,Android Fragments,Appcompatactivity,f.i.回答说,在片段之间传递数据是一种常见的情况。您构建了一个由片段的主机活动实现的接口。在活动的实现方法中,接收片段是新实例化的,新传输的数据作为一个包 问题是:我需要一个包含新信息的接收片段的旧实例,而不是一个新实例 我有一个带有一个片段容器的主活动。第一个片段是一个表单,用户必须在其中填写一些数据。某个按钮打开第二个片段,其中选择了树视图中的项目。选择必须传输到第一个片段中的文本字段。当然,第一个片段中的条目永远无法删除 我可以将所有输入字段的内容放在一个接口中,然后将它们重新填充到fi

f.i.回答说,在片段之间传递数据是一种常见的情况。您构建了一个由片段的主机活动实现的接口。在活动的实现方法中,接收片段是新实例化的,新传输的数据作为一个包

问题是:我需要一个包含新信息的接收片段的旧实例,而不是一个新实例

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

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

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

遗憾的是,startactivityforresult不适用于片段

非常感谢

编辑:这是我主要活动的代码

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检索片段的方式