捆绑创建的片段

时间:2013-07-10 06:01:04

标签: android android-fragments

无论如何要将Bundle分配给已经创建的片段吗?我试过这样的事情:

Bundle mArgumentos = new Bundle();
mArgumentos.putString("id", id);
this.setArguments(mArgumentos);

但我收到错误:片段已经激活。

我只是想知道我是否可以在不覆盖onBackPressed()方法的情况下实现这一目标。

我的目的是因为我有一个注册表格的新项目。从这里我可以使用项目的新id转到另一个片段(让我们称之为fragment_B)(我用一个分配新id的bundle调用fragment_B)。当用户按下后退按钮时,他会转到上一个表单,但是id丢失了(这是因为表单转到之前的状态,如空),所以如果他再次尝试转到fragment_B,他就会因为id而无法访问。

显然,如果表单尚未保存,用户无法转到fragment_B。因此,用户保存表单,然后按按钮以新ID:

转到fragment_B
FragmentB fragment = new FragmentB();

Bundle mArgumentos = new Bundle();
mArgumentos.putString("id",id);

fragment.setArguments(mArgumentos);

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();

ft.replace(android.R.id.tabcontent, fragment, tag);
ft.addToBackStack(tag);
ft.commit();

有什么建议吗?。

修改 enter image description here

碎片不在同一活动中。当我创建一个新项目并按下按钮保存时,我应该处于“编辑模式”。这意味着在我创建项目后,我可以返回并编辑它。我只是使用相同的片段来编辑和创建。所以,当我创建项目时,按下按钮转到fragment_B,然后按回按钮,我应该像这个项目的“编辑模式”。这意味着从fragment_B到之前我应该​​传递创建的项目的id。这就是为什么我想知道我是否可以在不覆盖onBackpress方法的情况下做到这一点。

EDIT2:

如果没有其他方法可以实现这一点,我正在考虑覆盖onBackpress方法,如下所示:

//get the fragment where I'm staying on.
Fragment fragmentActual = this.getSupportFragmentManager().findFragmentById(android.R.id.tabcontent);

//get the tag of the fragment
String fragmentTag = fragmentActual.getTag().toString();

if (fragmentTag.equals("tagFragmentB")){
    Fragment fragmentA = new FragmentA();

Bundle mArguments = fragmentActual.getArguments();
String id = mArguments.getString("id");

    if(id != null){

        fragmentA .setArguments(mArguments);

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();

        ft.replace(android.R.id.tabcontent, fragment, "fragmentA");
        ft.addToBackStack("fragmentA");
        ft.commit();
    }

}else{
    super.onBackPressed();
}

这是有效的,但正如您所注意到的,这会更改用户调用的片段的顺序,这对用户来说应该是不可见的。因此,这迫使我添加更多代码以获取用户所做的调用。

我对此有点新意,所以也许我没有“Android思维”。如果有更好的方法来做我想做的事情,我会对所有事情持开放态度。我只是想做正确的想法,并且因为用户按下后退按钮而在将来没有问题。

1 个答案:

答案 0 :(得分:0)

在我的特殊情况下,使其工作如下:我注意到当我填写表格,保存它,然后转到fragmentB,最后按回按钮,我的表格的信息被保留。所以我在表单中放了一个隐藏的etidText:

<EditText
    android:id="@+id/textEditHiddenId"
    android:visibility="gone"
    android:inputType="number" />

按下按钮保存后,我设置了此editText的内容:

etIdHidden.setText(id);

创建活动时,根据http://developer.android.com/guide/components/fragments.html,在onCreateView之后调用onResume方法。所以,我在这个方法中得到了textEditHiddenId的值:

@Override
public void onResume() {
    super.onResume();
    String id= etIdHidden.getText().toString();

    if(id.equals("")==false){
        mArgumentos=new Bundle();
        mArgumentos.putString("id", ""+id);

    }

};

第一次,textEditHiddenId的内容为空,但是当按下后退按钮并调用onResume方法时,我会初始化内容,并且我可以覆盖我的Bundle。

最简单的解决方案..