Fragment栈

    |     2015年8月18日   |   Fragment碎片   |     0 条评论   |    1898

Activity 有任务栈,Fragment 也有回退栈。把 Fragment addToBackStack 之后点返回,就能回到上一个 Fragment。下面对照 APIDemo 的 FragmentStack。


一、效果与布局

Push 压栈、Pop 弹栈,中间 FrameLayout 承载当前 Fragment:

fragment_stack

布局 fragment_stack.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="4dip" >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:gravity="center_horizontal"
        android:measureWithLargestChild="true"
        android:orientation="horizontal"
        android:padding="4dip" >
        <Button
            android:id="@+id/new_fragment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Push" >
            <requestFocus />
        </Button>
        <Button
            android:id="@+id/delete_fragment"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:text="Pop" />
    </LinearLayout>
    <FrameLayout
        android:id="@+id/simple_fragment"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1" />
</LinearLayout>

二、压栈与弹栈

Push:mStackLevel++ 后 replace + addToBackStack(null)。Pop:mStackLevel-- 再 popBackStack()。CountingFragment 用 arguments 传入序号,背景色按 mNum % 3 轮换蓝绿橙(数组里还有红色未用到)。

public class FragmentStack extends Activity {
    int mStackLevel = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_stack);
        Button button = (Button) findViewById(R.id.new_fragment);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mStackLevel++;
                addFragmentToStack();
            }
        });
        button = (Button) findViewById(R.id.delete_fragment);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mStackLevel--;
                getFragmentManager().popBackStack();
            }
        });
    }

    void addFragmentToStack() {
        Fragment newFragment = CountingFragment.newInstance(mStackLevel);
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.simple_fragment, newFragment);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();
    }

    public static class CountingFragment extends Fragment {
        int mNum;
        private static int[] sColorValue = new int[] {
                android.R.color.holo_blue_light,
                android.R.color.holo_green_light,
                android.R.color.holo_orange_light,
                android.R.color.holo_red_light };

        static CountingFragment newInstance(int num) {
            CountingFragment f = new CountingFragment();
            Bundle args = new Bundle();
            args.putInt("num", num);
            f.setArguments(args);
            return f;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_stack_layout, container, false);
            View tv = v.findViewById(R.id.text);
            ((TextView) tv).setText("Fragment #" + mNum);
            tv.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.gallery_thumb));
            Log.v("TAG", "mNum % 3 " + mNum % 3);
            tv.setBackgroundColor(getActivity().getResources().getColor(sColorValue[mNum % 3]));
            return v;
        }
    }
}
操作 代码
压栈 replace 后 ft.addToBackStack(null)
弹栈 getFragmentManager().popBackStack()
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.addToBackStack(null);

getFragmentManager().popBackStack();

一句话总结:replace 之后必须 addToBackStack,返回键 / popBackStack 才能回到上一个 Fragment。

转载请注明来源:Fragment栈
本文链接地址:https://ai.zhousir.top/?p=985

上一篇:

下一篇:

回复 取消