0

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

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

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

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

我这样做的目的是因为我有一个用于注册新项目的表格。从这里我可以使用项目的新 id 转到另一个片段(我们称之为 fragment_B)(我用一个分配新 id 的包调用 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();

有什么建议么?。

编辑: 在此处输入图像描述

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

编辑2:

如果没有其他方法可以实现这一点,我想像这样覆盖 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思维”。如果有更好的方法来做我想做的事,我对一切都持开放态度。我只想做正确的想法,并且将来不会因为用户按下后退按钮而出现问题。

4

1 回答 1

0

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

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

当按下按钮保存时,我设置了这个editText的内容:

etIdHidden.setText(id);

在创建activity时,根据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。

有史以来最简单的解决方案..

于 2013-07-10T15:16:03.127 回答