package com.example.fragmentanimation; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.KeyEvent; import com.example.fragmentanimation.OneFragment.OnNewFragemntListener; public class MainActivity extends FragmentActivity implements OnNewFragemntListener { private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); } private void findView() { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); ft.setCustomAnimations(R.anim.push_left_in,R.anim.push_left_in); OneFragment oneFragment = (OneFragment) manager.findFragmentByTag("one"); if(oneFragment==null){ oneFragment = new OneFragment(); Log.e(TAG, "new OneFragment"); } ft.replace(R.id.fl_container, oneFragment, "one"); ft.commit(); } @Override public void onNewFragemnt() { FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); //设置替换和退栈的动画 ft.setCustomAnimations(R.anim.push_left_in,R.anim.push_left_in,R.anim.back_left_in,R.anim.back_right_out); // ft.setCustomAnimations(R.anim.push_left_in,R.anim.push_left_in); TwoFragment twoFragment = (TwoFragment) manager.findFragmentByTag("two"); if(twoFragment==null){ Log.e(TAG, "new TwoFragment"); twoFragment = new TwoFragment(); } ft.replace(R.id.fl_container, twoFragment, "two"); ft.addToBackStack(null); ft.commit(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { FragmentManager fm = getSupportFragmentManager(); int count = fm.getBackStackEntryCount(); if(keyCode==KeyEvent.KEYCODE_BACK && count>0){ Log.e(TAG, "back to list "+count); fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); return true; } return super.onKeyDown(keyCode, event); } }
如果后退也需要动画的的话,需要用 FragmentTransaction.setCustomAnimations(R.anim.push_left_in,R.anim.push_left_in,R.anim.back_left_in,R.anim.back_right_out);
同时设置 enter/exit 和popEnter/popExit动画
package com.example.fragmentanimation; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class OneFragment extends Fragment implements OnClickListener { private static final String TAG = OneFragment.class.getSimpleName(); private OnNewFragemntListener mCallback; @Override public void onAttach(Activity activity) { try { mCallback = (OnNewFragemntListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnNewFragemntListener"); } super.onAttach(activity); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.e(TAG, "onCreateView"); View view = inflater.inflate(R.layout.fragment_one, null); findView(view); return view; } private void findView(View view) { Button bt_open = (Button) view.findViewById(R.id.bt_open); bt_open.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_open: Log.e(TAG, "open TwoFragment"); //回调Activity中的方法 mCallback.onNewFragemnt(); break; default: break; } } /** * 后退 回调接口 */ public interface OnNewFragemntListener { public void onNewFragemnt(); } }
package com.example.fragmentanimation; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; public class TwoFragment extends Fragment implements OnClickListener { private static final String TAG = TwoFragment.class.getSimpleName(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.e(TAG, "onCreateView"); View view = inflater.inflate(R.layout.fragment_two, null); findView(view); return view; } private void findView(View view) { Button bt_back = (Button) view.findViewById(R.id.bt_back); bt_back.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_back: Log.e(TAG, "back to previous"); //后退 getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); break; default: break; } } }