Fragment的操作FragmentTransactio
package faveweek.li.com.a02_fragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
//Activity有三种 一种是Activity 二种是AppCompatActivity 第三种是FragmentActivity
public class MainActivity extends AppCompatActivity {
private int index=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.v("wang","Activity onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void add(View view){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragment=fragmentManager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("title","add"+index);
MyFragment myFragment=new MyFragment();
//fragment.addToBackStack(null);//控制返回键
fragment.addToBackStack("add"+index);//回退操作
myFragment.setArguments(bundle);
//添加一个Fragment到Activity到指定的内部控件
fragment.add(R.id.frameLayoutId,myFragment,"fragment");
fragment.commit();//提交事务
index++;
}
@Override
public void onBackPressed() {//返回键监听器
super.onBackPressed();
//获取到低版本兼容的FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
//fragmentManager.popBackStack("add1",0);//表示按下返回键返回到add1里面
fragmentManager.popBackStack("add1",FragmentManager.POP_BACK_STACK_INCLUSIVE);//表示按下返回键返回到add1的后面一个 就是表示回到上一步
}
public void replace(View view){
//获取Fragment控件
FragmentManager fragmentManager= getSupportFragmentManager();
//开始使用Fragment控件
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
//提交数据
MyFragment myFragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString("title","replase"+index);
myFragment.setArguments(bundle);
//进行绑定
// 第一个参数表示UI中的Fragment中的Id表示需要显示的Fragment
// 第二个参数表示Fragment类
// 第三个参数鄙视,Fragment标签 标签必须添加
fragmentTransaction.replace(R.id.frameLayoutId,myFragment,"replace");//作用会将容器内部的所有fragment清除,->添加 如果当前在点击就会执行他自己
fragmentTransaction.commit();//提交事务
}
//解除某个绑定
public void detach(View view){
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
MyFragment myFragment=(MyFragment) fragmentManager.findFragmentByTag("replace");
fragmentTransaction.detach(myFragment);//解除绑定
fragmentTransaction.commit();
}
//重新绑定
public void attach(View view){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("replace");
fragmentTransaction.attach(myFragment);//重新绑定
fragmentTransaction.commit();
}
public void remove(View view){
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
MyFragment myFragment=(MyFragment) fragmentManager.findFragmentByTag("replace");
fragmentTransaction.remove(myFragment);//直接关闭整个Fragment
fragmentTransaction.commit();
}
//显示
public void show(View view){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
MyFragment myFragment=(MyFragment) fragmentManager.findFragmentByTag("replace");
fragmentTransaction.show(myFragment);//显示Fragment
fragmentTransaction.commit();
}
//隐藏
public void hide(View view){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
MyFragment myFragment=(MyFragment) fragmentManager.findFragmentByTag("replace");
fragmentTransaction.hide(myFragment);
fragmentTransaction.commit();
}
//该方法Activity即将被系统回收的时候调用的 就是屏幕转动时调用
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onStop() {
super.onStop();
// FragmentManager fragmentManager=getSupportFragmentManager();
// FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
// MyFragment myFragment=(MyFragment) fragmentManager.findFragmentByTag("replace");
// fragmentTransaction.detach(myFragment);//解除绑定
// fragmentTransaction.commitAllowingStateLoss();//意思就是允许状态丢失
}
}
add--将一个Fragment添加到一个页面,可以重复叠加
add(int containerViewId, Fragment fragment, String tag)
containerViewId 将Fragment加入的ViewGroup的id
fragment 被操作的Fragment
tag 被操作的Fragment的标示,我们操作成功后可以使用这个tag找到相应的Fragment
replace--将容器内的Fragemnt移除后,再进行添加
replace(int containerViewId, Fragment fragment, String tag)
containerViewId 将Fragment替换的ViewGroup的id
fragment 被操作的Fragment tag
被操作的Fragment的标示,我们操作成功后可以使用这个tag找到相应的Fragment
detach--将一个Fragment从UI上面解绑
注意解绑并不是删除,我们还可以通过其他方法把解绑的Fragment重新绑定到UI上面。
attach--将一个Fragment从重新绑定到UI
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentByTag(
"标签名android:tag=‘标签名’"
); FragmentTransaction transaction = fm.beginTransaction(); transaction.attach(fragment); transaction.commit();
remove--将一个Fragment从Activity删除
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentByTag("标签名android:tag=‘标签名’");
FragmentTransaction transaction = fm.beginTransaction();
transaction.remove(fragment);
transaction.commit();
Show--显示一个Fragement
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentByTag("my");
FragmentTransaction transaction = fm.beginTransaction();
transaction.show(fragment);
transaction.commit();
hide--隐藏一个Fragment
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentByTag("my");
FragmentTransaction transaction = fm.beginTransaction();
transaction.hide(fragment);
transaction.commit();
commit与commitAllowingStateLoss
Activity在以下的操作下容易引起回收并触发onSaveInstanceState()
1.按下HOME键
2.按下电源按键(关闭屏幕显示)时
3.屏幕方向切换
4.Activity跳转的时候
以上几种情况下不能进行状态的提交,如果提交的话会出现以下错误
Can not perform this action after onSaveInstanceState
出现这个错误的时候,我们有两个解决方法:
1 不在onSaveInstanceState后提交commit
2 使用commitAllowingStateLoss
Fragment与返回键
默认情况下,Fragment是不会响应返回键的。如果需要做到类似Activity回退到上一个界面这样 的效果,必须将FragmentTransaction,加入返回栈。加入回退栈的方法如下:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragment=fragmentManager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putString("title","add"+index);
MyFragment myFragment=new MyFragment();
//fragment.addToBackStack(null);//控制返回
fragment.addToBackStack("add"+index);//回退操作
myFragment.setArguments(bundle);
//添加一个Fragment到Activity到指定的内部控件
fragment.add(R.id.frameLayoutId,myFragment,"fragment");
fragment.commit();//提交事务
index++;
addToBackStack(String name); name 参数代表这次FragmentTransion的名称,我们可以根据这 个名称找到相应的操作,并进行回退动作。也可以传null,代表不记录该次操作的名称。 如果我 们将某次操作加入回退栈的话,我们有一下几种方式进行回退:
1.使用返回键系统自动回退到上一次操作前的状态。
2.使用popBackStack回退到指定的操作的状态
popBackStack()回退到上一次操作前的状态 popBackStack(String name, int flags)回退到某次 name的操作状态,flag为0或 POP_BACK_STACK_INCLUSIVE,
POP_BACK_STACK_INCLUSIVE代表清除name的状态 popBackStack(int id, int flags)回退某个 id的操作状态,id为commit()返回的。
Fragment动画
默认情况下Fragment显示和隐藏是不显示动画的,不过FragmentTransaction提供了三种显示的 动画的方式 :
setTransition 使用系统提供的默认显示动画
setCustomAnimations 使用自定义动画。
setTransition (int transit) 可以使用系统提供的默认动画,可供选择的有 TRANSIT_NONE, TRANSIT_FRAGMENT_OPEN, or TRANSIT_FRAGMENT_CLOSE
setCustomAnimations (int enter, int exit,int popenter,int popexit) 能够使用自定义动画.
enter 设置Fragment进入动画
exit 设置Fragment退出动画
popenter popback后回滚状态后上一个Fragment的动画
popexit popback后回滚状态后当前的Fragment的动画
fragmentManager.beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).add(R.id.frameLayoutId,new FragmentTwo(),"two").commit();