无论如何要将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_BFragmentB 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方法的情况下做到这一点。
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思维”。如果有更好的方法来做我想做的事情,我会对所有事情持开放态度。我只是想做正确的想法,并且因为用户按下后退按钮而在将来没有问题。
答案 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。
最简单的解决方案..