导读
1.Fragment的介绍
2.Fragment的生命周期
3.Fragment的加载
4.Fragment的删除与替换
5.Fragment的隐藏与显示
6.Fragment间的信息传递
Fragment的介绍
Fragment是Android 3.0之后提出的一个UI控件,它实际上是将layout分成更小的设计单位,同样有生命周期
有了Fragment就可以将平板的布局运用于手机,而不用再单独写一个
Fragment的生命周期
Fragment的加载
在xml文件的静态加载方法
Fragment布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#bebebe">
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:text="Fragment"/>
</LinearLayout>
Fragment的java文件
package com.hala.view01;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by air on 2018/1/28.
* xml静态加载Fragment的步骤:
* 1。创建Fragment的java文件,要继承Fragment,同时要重写onCreateView方法
* 2。设置Fragment的布局文件
* 3。在要显示Fragment的布局文件(activity_main2.xml)中,编写fragment项,并绑定2中的Fragment布局文件
*/
public class Fragment_test extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
/*
第一个参数:Fragment要加载的布局文件
第二个参数:参数列表中的container,是加载页面的容器
第三个参数:是否加载布局文件的根视图
*/
return inflater.inflate(R.layout.layout,container,false);
}
}
第一页面的布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hala.view01.MainActivity">
<Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
android:text="Fragment基本使用"
android:onClick="click"/>
</android.support.constraint.ConstraintLayout>
第一页面的java文件
package com.hala.view01;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
startActivity(new Intent(MainActivity.this,Main2Activity.class));
}
}
第二页面的布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hala.view01.Main2Activity"
android:id="@+id/main2_layout">
<TextView
android:id="@+id/bt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在xml文件中直接使用Fragment"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent" />
<!--此处有两点需要注意
1.fragment内要有tool项指定设定好的Fragmrnt布局文件
2.外层布局中要有这一行 android:id="@+id/main2_layout"-->
<fragment xmlns:tools="@layout/layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="com.hala.view01.Fragment_test"
tools:layout_editor_absoluteY="0dp"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/bt2"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp">
</fragment>
</android.support.constraint.ConstraintLayout>
第二页面的java文件
package com.hala.view01;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
}
显示结果
动态加载的方法
其他文件不变
页面二布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hala.view01.Main2Activity"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add"
android:onClick="click"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp" />
<!--这里不太一样,最终加载的Fragment会出现在默认位置-->
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fl_fragment"></FrameLayout>
</android.support.constraint.ConstraintLayout>
页面二java文件
package com.hala.view01;
import android.content.Intent;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
public void click(View v){
//这里的处理方式类似于数据库对事务的处理方式,注意要选择v4包里的
FragmentManager fm=getSupportFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
//这就是创建的Fragment的java文件那个类
Fragment_test ft1=new Fragment_test();
//第一个参数:main2Activity布局文件中Fragment的id
//第二个参数:创建的Fragment类,而这个类又加载了Fragment布局文件
ft.add(R.id.fl_fragment,ft1);
//这一步是提交事务步骤
ft.commit();
}
}
显示结果
Fragment的删除与替换
其他文件不变
新增Fragment布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ff0000">
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:text="Fragment" />
</LinearLayout>
新增Fragment的java文件
package com.hala.view01;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by air on 2018/1/28.
*/
public class Fragment_test1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.layout1,container,false);
}
}
页面二布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hala.view01.Main2Activity"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add"
android:onClick="click"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:id="@+id/button" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fl_fragment"></FrameLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:onClick="delete"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/button"
android:id="@+id/button2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="replace"
android:text="replace"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="0dp"
app:layout_constraintTop_toBottomOf="@+id/button2" />
</android.support.constraint.ConstraintLayout>
页面二java文件
package com.hala.view01;
import android.content.Intent;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
public void click(View v){
//这里的处理方式类似于数据库对事务的处理方式,注意要选择v4包里的
FragmentManager fm=getSupportFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
//这就是创建的Fragment的java文件那个类
Fragment_test ft1=new Fragment_test();
//第一个参数:main2Activity布局文件中FragmentLayout的id
//第二个参数:创建的Fragment类,而这个类又加载了Fragment布局文件
//第三个参数:tag 用来标记是哪个fragment,以便后边的删除操作
ft.add(R.id.fl_fragment,ft1,"del");
//这一步是提交事务步骤
ft.commit();
}
public void delete(View v){
FragmentManager supportFragmentManager = getSupportFragmentManager();
FragmentTransaction ft= supportFragmentManager.beginTransaction();
//这里可以根据id也可以根据tag来确定删除的对象
ft.remove(supportFragmentManager.findFragmentByTag("del"));
ft.commit();
}
public void replace(View v){
FragmentManager fm=getSupportFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
Fragment_test1 ft2=new Fragment_test1();
//这里的第一个参数是要替换的Fragment或Activity的id
//第二个参数是上边实例化的Fragment
//第三个参数是tag
ft.replace(R.id.fl_fragment, ft2,"del");
ft.commit();
}
}
显示结果
添加操作
替换操作
删除操作
Fragment的隐藏与显示
hide与show的作用是优化界面,使得Fragment切换时不在重新构建
页面二布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hala.view01.Main2Activity"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add"
android:onClick="click"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
android:id="@+id/button" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fl_fragment"></FrameLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hide"
android:onClick="hide"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/button"
android:id="@+id/button2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="show"
android:text="show"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="0dp"
app:layout_constraintTop_toBottomOf="@+id/button2" />
</android.support.constraint.ConstraintLayout>
页面二java文件
package com.hala.view01;
import android.content.Intent;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
public void click(View v){
//这里的处理方式类似于数据库对事务的处理方式,注意要选择v4包里的
FragmentManager fm=getSupportFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
//这就是创建的Fragment的java文件那个类
Fragment_test ft1=new Fragment_test();
//第一个参数:main2Activity布局文件中FragmentLayout的id
//第二个参数:创建的Fragment类,而这个类又加载了Fragment布局文件
//第三个参数:tag 用来标记是哪个fragment,以便后边的删除操作
ft.add(R.id.fl_fragment,ft1,"del");
//这一步是提交事务步骤
ft.commit();
}
//hide和show只是让Fragment隐藏或显示,并没有删除,没有改变其数据
public void hide(View v){
FragmentManager supportFragmentManager = getSupportFragmentManager();
FragmentTransaction ft= supportFragmentManager.beginTransaction();
//这里可以根据id也可以根据tag来确定删除的对象
ft.hide(supportFragmentManager.findFragmentByTag("del"));
ft.commit();
}
public void show(View v){
FragmentManager supportFragmentManager = getSupportFragmentManager();
FragmentTransaction ft= supportFragmentManager.beginTransaction();
//这里可以根据id也可以根据tag来确定删除的对象
ft.show(supportFragmentManager.findFragmentByTag("del"));
ft.commit();
}
}
Fragment间的信息传递
页面一的按钮触发页面二,页面二的Fragment加载了第一个Fragment,第一个Fragment的按钮可以将信息传到第二个Fragment上,并替换为第二个Fragment
第一个页面布局文件 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hala.view01.MainActivity">
<Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
android:text="Fragment数据传递"
android:onClick="click"/>
</android.support.constraint.ConstraintLayout>
第一个页面java文件 MainActivity.java
package com.hala.view01;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
startActivity(new Intent(MainActivity.this,Main2Activity.class));
}
}
第二个页面布局文件 activity_main2.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hala.view01.Main2Activity"
>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fl_fragment"></FrameLayout>
</android.support.constraint.ConstraintLayout>
第二个页面java文件 Main2Activity.java
package com.hala.view01;
import android.content.Intent;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//简写方式 将第一个Fragment加载到第二页面上来
getSupportFragmentManager().beginTransaction().add(R.id.fl_fragment,new Fragment_test()).commit();
}
}
第一个Fragment布局文件 layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/layout">
<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入"/>
<Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="传递"
android:onClick="send"/>
</LinearLayout>
第一个Fragment的java文件 Fragment_test.java
package com.hala.view01;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
public class Fragment_test extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.layout,container,false);
final EditText et=(EditText) v.findViewById(R.id.et);
Button bt=(Button)v.findViewById(R.id.bt1);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment_test1 ft=new Fragment_test1();
//这里借助bundle传值与activity是一样的
Bundle bd=new Bundle();
bd.putString("key",et.getText().toString());
ft.setArguments(bd);
getFragmentManager().beginTransaction().replace(R.id.fl_fragment,ft,"test1").commit();
}
});
return v;
}
}
第二个Fragment的布局文件 layout1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ff0000">
<TextView
android:id="@+id/tv"
android:layout_width="100dp"
android:layout_height="100dp"
android:text="Fragment" />
</LinearLayout>
第二个Fragment的java文件 Fragment_test1
package com.hala.view01;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
* Created by air on 2018/1/28.
*/
public class Fragment_test1 extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.layout1,container,false);
TextView tv=(TextView)v.findViewById(R.id.tv);
tv.setText(getArguments().getString("key"));
return v;
}
}
显示结果