1

我在Android中有这个问题。考虑三个片段:ABCC可以调用 fromA或 from 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 (这就是为什么我想知道我是否知道谁打电话给谁)

第一次调用片段 B 时,我不传递参数,因为它是一个空白表单。但是当我在 B 中调用 C 时,我需要将参数传递给片段 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。也许它让我的想法更清楚。

4

4 回答 4

3

我认为 Luksprog 的答案是最好的:“您可能想要解决这些问题。您始终可以选择将带有数据的 Bundle 传递给新创建的片段,并提及谁调用了它。然后在片段中使用 getArgument() 就会知道谁叫的。”

我还没有找到更好的方法。

于 2013-05-29T21:53:50.413 回答
1

您可以使用setTargetFragment方法来设置哪个是父片段。然后,您可以使用getTargetFragment方法找出谁给您打电话。

于 2013-05-23T17:06:24.317 回答
0

您正在做的是在 Fragment 之间转换,调用 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();
    }
}
于 2013-05-23T15:57:30.963 回答
0

您可以使用 FragmentManager 创建片段的回栈。您还必须首先使用 Fragment Transactions。更多信息见:http: //developer.android.com/guide/components/fragments.html#Transactions

于 2013-05-23T16:00:46.973 回答