我在Android中遇到此问题。考虑三个片段:A
,B
,C
。可以从C
或A
调用B
。反正知道从哪个片段调用了C
?
被修改
好的,我要解释一下我要做的事情。假设我有这个电话:A呼叫B,B呼叫C.当我按下C中的后退按钮它让我到B,没关系。但是当我再次按下后退按钮时,它会转到C而不是A。
这是我的代码:
@Override
public void onBackPressed() {
//this is the current fragment
Fragment fragmentActual = this.getSupportFragmentManager().findFragmentById(android.R.id.tabcontent);
String fragmentTag = fragmentoActual.getTag().toString();
//If I press the back button in C:
if(fragmentTag.equals("TAG C")){
Fragment removefragment = this.getSupportFragmentManager().findFragmentByTag("TAG B");
Fragment fragmentClient = this.getSupportFragmentManager().findFragmentByTag("TAG C");
//If Im NOT passing arguments to B, I know this is a new form
if(removefragment.getArguments()== null){
//I always pass arguments to fragment C, but just in case:
if(fragmentClient.getArguments()!= null){
Bundle mArguments = fragmentClient.getArguments();
//FRAGMENT B
FragmentB fragmentB = new FragmentB ();
fragment.setArguments(mArguments);
FragmentManager manager = this.getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.addToBackStack(null);
ft.replace(android.R.id.tabcontent,fragmentB,"TAG B");
ft.commit();
}
}else{
super.onBackPressed();
}
}else{
super.onBackPressed();
}
}
现在我要解释代码。基本上它的作用是在调用片段C时替换片段B.我这样做,因为我需要将参数传递给片段B.但是当我做替换时,片段B的“历史”丢失了,我的意思是当我按下B中的后退按钮时,我不能回到片段A < strong>(这就是为什么我想知道我能否知道谁会打电话)。
我调用片段B时的第一次,我不传递参数,因为它是一个空白表格。但是当我调用C,停留在B中时,我需要将参数传递给片段B(当按下后退按钮时),因此它可以显示更新的信息。
如果有什么不清楚的地方,请告诉我,以便我能更好地解释自己。
已编辑2:此问题与此https://stackoverflow.com/questions/16703604/back-press-button-when-i-save-a-form-for-the-first-time-a-list-view-is-not-updat有关。也许这让我的想法更加明确。
答案 0 :(得分:3)
Luksprog的答案我认为是最好的:“你可能想要解决这些问题。你总是可以选择将数据包传递给新创建的片段,提及谁调用它。然后在中使用getArgument()片段会知道谁叫它。“。
我还没有找到另一种更好的方法。
答案 1 :(得分:1)
您可以使用setTargetFragment方法设置哪个是父片段。然后,您可以使用方法getTargetFragment找出谁给您打电话。
答案 2 :(得分:0)
你正在做的是在Fragments之间转换,调用addToBackStack()作为FragmentTransaction的一部分:
我想,这就是你需要的。
private final static String TAG_FRAGMENT = "TAG_FRAGMENT";
private void showFragment() {
final Myfragment fragment = new MyFragment();
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment, fragment, TAG_FRAGMENT);
transaction.addToBackStack(null);
transaction.commit();
}
@Override
public void onBackPressed() {
final Myfragment fragment = (Myfragment) getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not
super.onBackPressed();
}
}
答案 3 :(得分:0)
您可以使用FragmentManager创建片段的后栈。您还必须首先使用Fragment Transactions。更多信息请参见:http://developer.android.com/guide/components/fragments.html#Transactions