运行有问题或需要全部代码请点赞关注收藏后评论区留言~~~
一、碎片的静态注册
碎片Fragment是个特别的存在,它有点像报纸上的专栏,看起来只占据页面的一小块区域,但是这一区域有自己的生命周期,可以自行其是,彷佛一个独立的存在,并且该区域只占据空间步扰乱业务,添加之后不影响宿主页面的其他区域,去除之后也不影响宿主页面的其他区域。
每个碎片都有对应的XML布局文件,依据其使用方式可分为静态注册于动态注册两类,静态注册指的是在XML文件中直接防止fragment节点,类似于一个普通控件,可被多个布局文件同时引用,静态注册一般用于某个通用的页面部件,每个活动页面均可直接引用该部件 效果如下
若想在活动的xml文件引用定义的fragment,可直接添加一个fragment节点 但要注意以下两点
1:fragment节点必须指定id属性,否则App运行会报错
2:fragment节点必须通过name属性指定碎片类的完整路径
代码如下
Java类代码
package com.example.chapter08; import android.os.Bundle; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; public class FragmentStaticActivity extends AppCompatActivity { private static final String TAG = "FragmentStaticActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_static); Log.d(TAG, "onCreate"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); } }
碎片类代码
package com.example.chapter08.fragment; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.fragment.app.Fragment; import com.example.chapter08.R; public class StaticFragment extends Fragment implements View.OnClickListener { private static final String TAG = "StaticFragment"; protected View mView; // 声明一个视图对象 protected Context mContext; // 声明一个上下文对象 // 创建碎片视图 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContext = getActivity(); // 获取活动页面的上下文 // 根据布局文件fragment_static.xml生成视图对象 mView = inflater.inflate(R.layout.fragment_static, container, false); TextView tv_adv = mView.findViewById(R.id.tv_adv); ImageView iv_adv = mView.findViewById(R.id.iv_adv); tv_adv.setOnClickListener(this); // 设置点击监听器 iv_adv.setOnClickListener(this); // 设置点击监听器 Log.d(TAG, "onCreateView"); return mView; // 返回该碎片的视图对象 } @Override public void onClick(View v) { if (v.getId() == R.id.tv_adv) { Toast.makeText(mContext, "您点击了广告文本", Toast.LENGTH_LONG).show(); } else if (v.getId() == R.id.iv_adv) { Toast.makeText(mContext, "您点击了广告图片", Toast.LENGTH_LONG).show(); } } @Override public void onAttach(Activity activity) { // 把碎片贴到页面上 super.onAttach(activity); Log.d(TAG, "onAttach"); } @Override public void onCreate(Bundle savedInstanceState) { // 页面创建 super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); } @Override public void onDestroy() { // 页面销毁 super.onDestroy(); Log.d(TAG, "onDestroy"); } @Override public void onDestroyView() { // 销毁碎片视图 super.onDestroyView(); Log.d(TAG, "onDestroyView"); } @Override public void onDetach() { // 把碎片从页面撕下来 super.onDetach(); Log.d(TAG, "onDetach"); } @Override public void onPause() { // 页面暂停 super.onPause(); Log.d(TAG, "onPause"); } @Override public void onResume() { // 页面恢复 super.onResume(); Log.d(TAG, "onResume"); } @Override public void onStart() { // 页面启动 super.onStart(); Log.d(TAG, "onStart"); } @Override public void onStop() { // 页面停止 super.onStop(); Log.d(TAG, "onStop"); } @Override public void onActivityCreated(Bundle savedInstanceState) { //在活动页面创建之后 super.onActivityCreated(savedInstanceState); Log.d(TAG, "onActivityCreated"); } }
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <!-- 把碎片当作一个控件使用,其中android:name指明了碎片来源 --> <fragment android:id="@+id/fragment_static" android:name="com.example.chapter08.fragment.StaticFragment" android:layout_width="match_parent" android:layout_height="60dp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="这里是每个页面的具体内容" android:textColor="#000000" android:textSize="17sp" /> </LinearLayout>
二、碎片的动态注册
相比静态注册,在实际开发中动态注册使用的更多,动态注册是延迟至代码执行时菜动态添加碎片,动态生成的碎片基本给翻页视图使用
要想在翻页视图中使用动态碎片,关键在于适配器,如果结合使用碎片则翻页视图的适配器要使用碎片适配器FragmentAdapter。与翻页适配器相比,碎片适配器增加了getItem方法用于获取指定位置的碎片,同时去掉了三个方法,用起来更加容易
代码如下
Java类代码
package com.example.chapter08; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.util.TypedValue; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager.widget.PagerTabStrip; import androidx.viewpager.widget.ViewPager; import com.example.chapter08.adapter.MobilePagerAdapter; import com.example.chapter08.bean.GoodsInfo; import java.util.ArrayList; import java.util.List; public class FragmentDynamicActivity extends AppCompatActivity { private static final String TAG = "FragmentDynamicActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_dynamic); Log.d(TAG, "onCreate"); initPagerStrip(); // 初始化翻页标签栏 initViewPager(); // 初始化翻页视图 } // 初始化翻页标签栏 private void initPagerStrip() { // 从布局视图中获取名叫pts_tab的翻页标签栏 PagerTabStrip pts_tab = findViewById(R.id.pts_tab); // 设置翻页标签栏的文本大小 pts_tab.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); // 设置翻页标签栏的文本颜色 pts_tab.setTextColor(Color.BLACK); } // 初始化翻页视图 private void initViewPager() { List<GoodsInfo> goodsList = GoodsInfo.getDefaultList(); // 构建一个手机商品的碎片翻页适配器 MobilePagerAdapter adapter = new MobilePagerAdapter( getSupportFragmentManager(), goodsList); // 从布局视图中获取名叫vp_content的翻页视图 ViewPager vp_content = findViewById(R.id.vp_content); vp_content.setAdapter(adapter); // 设置翻页视图的适配器 vp_content.setCurrentItem(0); // 设置翻页视图显示第一页 } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart"); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); } }
碎片类
package com.example.chapter08.fragment; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.fragment.app.Fragment; import com.example.chapter08.R; public class DynamicFragment extends Fragment { private static final String TAG = "DynamicFragment"; protected View mView; // 声明一个视图对象 protected Context mContext; // 声明一个上下文对象 private int mPosition; // 位置序号 private int mImageId; // 图片的资源编号 private String mDesc; // 商品的文字描述 // 获取该碎片的一个实例 public static DynamicFragment newInstance(int position, int image_id, String desc) { DynamicFragment fragment = new DynamicFragment(); // 创建该碎片的一个实例 Bundle bundle = new Bundle(); // 创建一个新包裹 bundle.putInt("position", position); // 往包裹存入位置序号 bundle.putInt("image_id", image_id); // 往包裹存入图片的资源编号 bundle.putString("desc", desc); // 往包裹存入商品的文字描述 fragment.setArguments(bundle); // 把包裹塞给碎片 return fragment; // 返回碎片实例 } // 创建碎片视图 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContext = getActivity(); // 获取活动页面的上下文 if (getArguments() != null) { // 如果碎片携带有包裹,就打开包裹获取参数信息 mPosition = getArguments().getInt("position", 0); // 从包裹取出位置序号 mImageId = getArguments().getInt("image_id", 0); // 从包裹取出图片的资源编号 mDesc = getArguments().getString("desc"); // 从包裹取出商品的文字描述 } // 根据布局文件fragment_dynamic.xml生成视图对象 mView = inflater.inflate(R.layout.fragment_dynamic, container, false); ImageView iv_pic = mView.findViewById(R.id.iv_pic); TextView tv_desc = mView.findViewById(R.id.tv_desc); iv_pic.setImageResource(mImageId); tv_desc.setText(mDesc); Log.d(TAG, "onCreateView position=" + mPosition); return mView; // 返回该碎片的视图对象 } @Override public void onAttach(Activity activity) { // 把碎片贴到页面上 super.onAttach(activity); Log.d(TAG, "onAttach position=" + mPosition); } @Override public void onCreate(Bundle savedInstanceState) { // 页面创建 super.onCreate(savedInstanceState); Log.d(TAG, "onCreate position=" + mPosition); } @Override public void onDestroy() { // 页面销毁 super.onDestroy(); Log.d(TAG, "onDestroy position=" + mPosition); } @Override public void onDestroyView() { // 销毁碎片视图 super.onDestroyView(); Log.d(TAG, "onDestroyView position=" + mPosition); } @Override public void onDetach() { // 把碎片从页面撕下来 super.onDetach(); Log.d(TAG, "onDetach position=" + mPosition); } @Override public void onPause() { // 页面暂停 super.onPause(); Log.d(TAG, "onPause position=" + mPosition); } @Override public void onResume() { // 页面恢复 super.onResume(); Log.d(TAG, "onResume position=" + mPosition); } @Override public void onStart() { // 页面启动 super.onStart(); Log.d(TAG, "onStart position=" + mPosition); } @Override public void onStop() { // 页面停止 super.onStop(); Log.d(TAG, "onStop position=" + mPosition); } @Override public void onActivityCreated(Bundle savedInstanceState) { //在活动页面创建之后 super.onActivityCreated(savedInstanceState); Log.d(TAG, "onActivityCreated position=" + mPosition); } }
XML文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp"> <androidx.viewpager.widget.ViewPager android:id="@+id/vp_content" android:layout_width="match_parent" android:layout_height="wrap_content"> <androidx.viewpager.widget.PagerTabStrip android:id="@+id/pts_tab" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </androidx.viewpager.widget.ViewPager> </LinearLayout>
创作不易 觉得有帮助请点赞关注收藏~~~