目录
Fragment理论:
Fragment是Android3.0引入的新API,它代表Activity的子模板,所以可以把fragment理解为Activity片段。Fragment必须被“嵌入”Avtivity中使用,因此Fragment也拥有自己的生命周期,不过Fragment的生命周期受Activity所控制,也就是说Activity停止的时候,Activity中所有的Fragment都会被停止,其它状态也是一样。
Fragment生命周期
附加与分离:onAttach() + onDetach()
创建和销毁:onCreate() + onDestroy()
创建视图和销毁视图:onCreateView() + onDestroyView()
可见和不可见:onStart() + onStop()
可交互和不可交互:onResume() + onPause()
原文链接:https://blog.csdn.net/howard2005/article/details/127853054
具体例子:切换碎片
创建安卓应用SwitchFragment
创建成功:
插入图片素材
将三张背景图片拷贝到drawable
目录
在字符资源字符串资源文件strings.xml里面输入代码:
具体代码:
<resources> <string name="app_name">切换碎片</string> <string name="first_fragment">第一个碎片</string> <string name="second_fragment">第二个碎片</string> <string name="third_fragment">第三个碎片</string> <string name="next_fragment">下一个碎片</string> </resources>
打开主布局资源文件activity_main.xml输入 代码:
具体代码:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> </FrameLayout>
创建碎片
设置碎片名称 - FirstFragment
创建成功:
修改第一个碎片的布局资源文件 fragment_first.xml
具体代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/img1" android:gravity="center" android:orientation="vertical" tools:context=".FirstFragment"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="30dp" android:text="@string/first_fragment" android:textSize="50sp" android:textColor="#ff0000"/> <Button android:id="@+id/btn_next_fragment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="doNextFragment" android:text="@string/next_fragment" android:textSize="30sp"/> </LinearLayout>
创建第二个碎片SecondFragment
创建成功:
修改第二个碎片的布局资源文件 fragment_second.xml
具体代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/img2" android:gravity="center" android:orientation="vertical" tools:context=".SecondFragment"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="30dp" android:text="@string/second_fragment" android:textSize="50sp" android:textColor="#00ff00"/> <Button android:id="@+id/btn_next_fragment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="doNextFragment" android:text="@string/second_fragment" android:textSize="30sp"/> </LinearLayout>
创建第三个碎片ThirdFragment
创建成功:
修改第三个碎片的布局资源文件 fragment_third.xml
具体代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/img3" android:gravity="center" android:orientation="vertical" tools:context=".ThirdFragment"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="30dp" android:text="@string/third_fragment" android:textSize="50sp" android:textColor="#0000ff"/> <Button android:id="@+id/btn_next_fragment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="doNextFragment" android:text="@string/third_fragment" android:textSize="30sp"/> </LinearLayout>
打开主界面:
具体代码:
package net.zyt.switch_fragment; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //利用布局资源文件设置用户界面 setContentView(R.layout.activity_main); //获取碎片管理器 FragmentManager fm=getSupportFragmentManager(); //在主容器里面添加第一个碎片 fm.beginTransaction().add(R.id.container,new FirstFragment()).commit(); } }
碎片界面类实现功能
(1)第一个碎片界面类实现功能,打开FirstFragment
具体代码:
package net.zyt.switch_fragment; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; public class FirstFragment extends Fragment { private Button btnNextFragment; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //获取碎片视图 View view=inflater.inflate(R.layout.fragment_first,container,false); //通过资源标识符获取控件实例 btnNextFragment=view.findViewById(R.id.btn_next_fragment); //给按钮注册单击事件监听器 btnNextFragment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //切换到第二个碎片 getFragmentManager(). beginTransaction().addToBackStack("next") .replace(R.id.container,new SecondFragment()) .commit(); } }); //返回碎片视图 return view; } }
第二个碎片界面类实现功能,打开第二个碎片界面类 SecondFragment
具体代码:
package net.zyt.switch_fragment; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; public class SecondFragment extends Fragment { private Button btnNextFragment; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //获取碎片视图 View view = inflater.inflate(R.layout.fragment_second, container, false); //通过资源标识符获取控件实例 btnNextFragment = view.findViewById(R.id.btn_next_fragment); //给按钮注册单击事件监听器 btnNextFragment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //切换到第二个碎片 getFragmentManager(). beginTransaction().addToBackStack("next") .replace(R.id.container, new ThirdFragment()) .commit(); } }); //返回碎片视图 return view; }}
第三个碎片界面类实现功能,打开三个碎片界面类ThirdFragment
具体代码:
package net.zyt.switch_fragment; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; public class ThirdFragment extends Fragment { private Button btnNextFragment; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //获取碎片视图 View view = inflater.inflate(R.layout.fragment_third, container, false); //通过资源标识符获取控件实例 btnNextFragment = view.findViewById(R.id.btn_next_fragment); //给按钮注册单击事件监听器 btnNextFragment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //切换到第二个碎片 getFragmentManager(). beginTransaction().addToBackStack("next") .replace(R.id.container, new FirstFragment()) .commit(); } }); //返回碎片视图 return view; }}
启动应用查看效果:
优化:
每次切换碎片时,都是利用new来创建新的碎片,这样在不断切换碎片的过程中,就导致资源的浪费
创建碎片列表类
碎片列表类 FragmentList
用于保存程序要用到的碎片对象
具体代码:
package net.zyt.switch_fragment; import androidx.fragment.app.Fragment; import java.util.ArrayList; import java.util.List; public class FragmentList{ public static List<Fragment> fragments = new ArrayList<>(); }
修改主界面类
在碎片列表类里保存程序所需要的碎片对象
具体代码:
package net.zyt.switch_fragment; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //利用布局资源文件设置用户界面 setContentView(R.layout.activity_main); //获取碎片管理器 FragmentManager fm=getSupportFragmentManager(); //创建三个碎片,添加到碎片列表 FragmentList.fragments.add(new FirstFragment()); FragmentList.fragments.add(new SecondFragment()); FragmentList.fragments.add(new ThirdFragment()); //在主容器里面添加第一个碎片 fm.beginTransaction().add(R.id.container,FragmentList.fragments.get(0)).commit(); } }
修改第一个碎片界面类
将new SecondFragment()
改成FragmentList.fragments.get(1)
修改第二个碎片界面类
将new ThirdFragment()
改成FragmentList.fragments.get(2)
修改第三个碎片界面类
将new FirstFragment()
改成FragmentList.fragments.get(0)
运行程序查看效果: