popBackStackImmediate()似乎无法正常工作

时间:2016-08-15 17:25:24

标签: android android-fragments

快速概览

我有一个Activity,有多个Fragments

在一个片段(A)中,我打电话给另一个片段(B),当我完成时,我点击这个片段(B)上的一个按钮,然后我回到另一个片段(A)。

问题是,在这个片段(A)中我有按钮,但是当我从片段(B)返回时再次点击它时,它们不起作用。

相反,它们在片段(B)中执行一个函数,即使我们在片段(A)中。

片段(A)中的

onClick()方法:

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.nextMessage:
            System.out.println("NextMessage - Start");
            game();
            System.out.println("NextMessage - End");
            break;
        case R.id.playersList:
            System.out.println("PlayersList - Start");
            lookUpPlayers();
            System.out.println("PlayersList - End");
            break;
        default:
            break;

    }
}
片段(B)中的

onClick()方法:

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.backToGame:
            provider.getFragmentSwitcher().back();
            System.out.println("Back executed.");
            break;
        default:
            System.out.println("Default executed.");
            break;
    }
    }

当我从(B)回到Fragment(A)时,(A)中的所有按钮都执行(B)中的witcher的默认值! 所以输出是:"默认执行。"

为什么?

这是back()方法:

public void back(){
    fragmentManager.popBackStackImmediate();
}

问题

这是什么原因......奇怪的问题?为什么片段A在片段B中执行方法?

资源

如果你想要一个跑步或外观,这里是GitHub项目!

1 个答案:

答案 0 :(得分:1)

我刚刚为您构建了测试应用程序。 我将在这里分享。

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

MainAcitivty.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FragmentA fragmentA = new FragmentA();
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.container, fragmentA)
                .commit();

} }

layout_fragment_a.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_mainLayout"
    tools:context="com.nikolay.fragmentmanagertest.FragmentA">

    <!-- TODO: Update blank fragment layout -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginTop="20dp"
            android:textColor="@android:color/black"
            android:textSize="32sp"
            android:layout_centerHorizontal="true"
            android:text="FragmentA"/>

        <Button
            android:id="@+id/next_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Next"
            android:textSize="18sp"
            android:layout_centerInParent="true"/>
    </RelativeLayout>

</FrameLayout>

FragmentA.java

public class FragmentA extends Fragment {
    private Button nextBtn;
    public FragmentA() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View rootView = inflater.inflate(R.layout.fragment_layout_a, container, false);
        nextBtn = (Button)rootView.findViewById(R.id.next_btn);
        nextBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentB fragmentB = new FragmentB();
                getChildFragmentManager().beginTransaction().replace(R.id.fragment_mainLayout, fragmentB).addToBackStack(null).commit();
            }
        });
        return rootView;
    }
}

layout_fragment_b.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment_mainLayout"
    android:background="@android:color/white"
    android:clickable="true"
    tools:context="com.nikolay.fragmentmanagertest.FragmentB">

    <!-- TODO: Update blank fragment layout -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginTop="20dp"
            android:textColor="@android:color/black"
            android:textSize="32sp"
            android:layout_centerHorizontal="true"
            android:text="FragmentB"/>

        <Button
            android:id="@+id/back_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Back"
            android:textSize="18sp"
            android:layout_centerInParent="true"/>
    </RelativeLayout>

</FrameLayout>

FragmentB.java

public class FragmentB extends Fragment {
    private Button backButton;

    public FragmentB() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_layout_b, container, false);
        backButton = (Button) rootView.findViewById(R.id.back_btn);
        backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getParentFragment().getChildFragmentManager().popBackStackImmediate();
            }
        });
        return rootView;
    }
}

我已经测试了这个代码。我认为它可以按你的意愿运作。

请尝试使用此功能,然后让我知道结果。 我希望这对你有好处。

尼古拉