无论如何要为已经创建的片段分配一个 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思维”。如果有更好的方法来做我想做的事,我对一切都持开放态度。我只想做正确的想法,并且将来不会因为用户按下后退按钮而出现问题。