0
点赞
收藏
分享

微信扫一扫

Fragment的操作FragmentTransactio


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();


举报

相关推荐

0 条评论