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();
}
将当前事务添加到回退栈: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(); } }