Fragment的回退栈,Activity管理Fragment交互,降低耦合

1、Fragment的回退栈
   将当前事务添加到回退栈:transaction.addToBackStack(null);
   不考虑回退栈的情况下,FragmentA用replace跳转到FragmentB,FragmentA实例会被销毁,此时按back键,Activity退出。
   添加当前事务到回退栈后,FragmentA实例不会被销毁,但视图层次依然会被销毁,此时按back键,回到FragmentA,再按back键,Activity退出。
   视图重绘(replace):
   OneFragment oneFragment = new OneFragment();
   FragmentTransaction transaction = getFragmentManager().beginTransaction();
   transaction.replace(R.id.containerFragment,oneFragment,"ONE");
   transaction.addToBackStack(null);
   transaction.commit();
   视图不重绘(hide+add):
   TwoFragment twoFragment = new TwoFragment();
   FragmentTransaction transaction = getFragmentManager().beginTransaction();
   transaction.hide(this);
   transaction.add(R.id.containerFragment,twoFragment,"TWO");
   transaction.addToBackStack(null);
   transaction.commit();
   
   
   public class FragmentDemoActivity extends AppCompatActivity implements TwoFragment.FTwoBtnClickListener{
    private FrameLayout containerFragment;
    private OneFragment oneFragment;
    private TwoFragment twoFragment;
    DialogFragment




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_demo);
        containerFragment = (FrameLayout)findViewById(R.id.containerFragment);
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
//        if(dm.widthPixels > dm.heightPixels){
//            oneFragment = new OneFragment();
//            // transaction.add(R.id.containerFragment,oneFragment,"ONE");
//            //用add在屏幕旋转的时候会有fragment重叠问题,改成replace后没有重叠问题了
//            transaction.replace(R.id.containerFragment,oneFragment,"ONE");
//        }else{
//            twoFragment = new TwoFragment();
//            transaction.replace(R.id.containerFragment,twoFragment,"TWO");
//        }
        //第二种解决屏幕旋转fragment重叠问题:
        if(savedInstanceState == null) {
            if (dm.widthPixels > dm.heightPixels) {//横屏显示的Fragment
                oneFragment = new OneFragment();
                transaction.add(R.id.containerFragment, oneFragment, "ONE");
            } else { //竖屏显示的Fragment
                twoFragment = new TwoFragment();
                transaction.add(R.id.containerFragment, twoFragment, "TWO");
            }
            transaction.commit();
        }


    }



//Activity管理Fragment之间的互操作,不要在一个Fragment里操作另一个Fragment,降低耦合性
    @Override
    public void onFTwoBtnClick() {
        if(oneFragment == null){
            oneFragment = new OneFragment();
            oneFragment.setFOneBtnClickListener(new OneFragment.FOneBtnClickListener() {
                @Override
                public void onFOneBtnClick() {
                    if(twoFragment == null){
                        twoFragment = new TwoFragment();
                    }
                    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//                    transaction.hide(oneFragment);
//                    transaction.add(R.id.containerFragment,twoFragment,"TWO");
                    transaction.replace(R.id.containerFragment,twoFragment,"TWO");
                    transaction.addToBackStack(null);
                    transaction.commit();
                }
            });
        }
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.containerFragment,oneFragment,"ONE");
        transaction.addToBackStack(null);
        transaction.commit();
    }

}



public class TwoFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;
    private Button takeBtn,backStackBtn;
    private TextView changeTv;

//    private OnFragmentInteractionListener mListener;

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

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment TwoFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static TwoFragment newInstance(String param1, String param2) {
        TwoFragment fragment = new TwoFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_two, container, false);
        takeBtn = (Button)view.findViewById(R.id. takeBtn);
        backStackBtn = (Button)view.findViewById(R.id.backStackBtn);
        changeTv = (TextView)view.findViewById(R.id.changeTv);
        if(savedInstanceState != null) {
            String saveText = savedInstanceState.getString("two");
            changeTv.setText(saveText);
        }
        return view;

    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
//        if (mListener != null) {
//            mListener.onFragmentInteraction(uri);
//        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
//        if (context instanceof OnFragmentInteractionListener) {
//            mListener = (OnFragmentInteractionListener) context;
//        } else {
//            throw new RuntimeException(context.toString()
//                    + " must implement OnFragmentInteractionListener");
//        }
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.my_menu,menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.sing:
                Toast.makeText(getActivity(),"探云溪",Toast.LENGTH_LONG).show();
                break;
        }
        return true;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
       takeBtn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               TextView textView = (TextView)getActivity().findViewById(R.id.longTv);
               Toast.makeText(getActivity(),textView.getText(),Toast.LENGTH_LONG).show();
           }
       });
        backStackBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                OneFragment oneFragment = new OneFragment();
//                FragmentTransaction transaction = getFragmentManager().beginTransaction();
//                transaction.replace(R.id.containerFragment,oneFragment,"ONE");
//                transaction.addToBackStack(null);
//                transaction.commit();

                if(getActivity() instanceof FTwoBtnClickListener){
                    ((FTwoBtnClickListener) getActivity()).onFTwoBtnClick();
                }
            }
        });
    }


    //Activity重启前保存数据以便后面恢复
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("two","这是缘亦是命中注定的相见");
    }

    @Override
    public void onDetach() {
        super.onDetach();
//        mListener = null;
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }

    //自定义接口用于Activity管理Fragment之间的交互
    public interface FTwoBtnClickListener{
        void onFTwoBtnClick();
    }
}

猜你喜欢

转载自blog.csdn.net/u010015933/article/details/80916008
今日推荐