目录
Fragment(碎片)
Fragment(碎片)产生的原因:传统的Activity并不能很好的处理大屏问题,就需要一个碎片化的东西能够划区域的展示内容,且这个内容是有属于自己的独立可操作的空间的
Fragment 静态注册
静态注册在布局文件中直接指定Fragment
碎片文件
<?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="wrap_content"
android:orientation="horizontal"
tools:context=".StaticFragment">
<TextView
android:id="@+id/tv_adv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="广告图片"
android:textColor="#000000"
android:textSize="17sp" />
<ImageView
android:id="@+id/iv_adv"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="4"
android:src="@mipmap/img"
android:scaleType="fitCenter"/>
</LinearLayout>
碎片布局文件
<?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:orientation="vertical"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment_static"
android:name="net.lzt.fragmentstatic.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>
碎片主界面
直接使用模板创建即可,再将不需要的删除
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class StaticFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_static, container, false);
}
}
主界面
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
实现效果
Fragment声明周期
Fragment动态注册
动态注册直到在代码中才动态添加Fragment.
标签栏
<?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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".FragmentDynamicActivity">
<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>
显示界面
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerTabStrip;
import androidx.viewpager.widget.ViewPager;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import java.util.ArrayList;
public class FragmentDynamicActivity extends AppCompatActivity {
private ArrayList<GoodsInfo> mGoodsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_dynamic);
initPagerStrip();
initViewPager();
}
//初始化翻页标签栏
private void initPagerStrip() {
PagerTabStrip pts_tab = findViewById(R.id.pts_tab);
//设置翻页标签栏的文本大小和文本颜色
pts_tab.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
pts_tab.setTextColor(Color.BLACK);
}
//初始化翻页视图
private void initViewPager() {
ViewPager vp_content = findViewById(R.id.vp_content);
mGoodsList = GoodsInfo.getDefaultList();
MobilePagerAdapter adapater = new MobilePagerAdapter(getSupportFragmentManager(), mGoodsList);
vp_content.setAdapter(adapater);
}
}
图片和显示的文字
<?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="wrap_content"
android:orientation="vertical"
tools:context=".DynamicFragment">
<ImageView
android:id="@+id/iv_pic"
android:layout_width="match_parent"
android:layout_height="360dp"
android:scaleType="fitCenter" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
动态注册
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
public class DynamicFragment extends Fragment {
public static DynamicFragment newInstance(int position, int image_id, String desc) {
DynamicFragment fragment = new DynamicFragment();
// 把参数打包,传入fragment中
Bundle args = new Bundle();
args.putInt("position", position);
args.putInt("image_id", image_id);
args.putString("desc", desc);
fragment.setArguments(args);
return fragment;
}
//创建碎片视图
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 根据布局文件fragment_dynamic.xml生成视图对象
View view = inflater.inflate(R.layout.fragment_dynamic, container, false);
//第一个参数是要导入的布局文件,第二个人参数是root(根节点)
//获取参数
Bundle arguments = getArguments();
//将参数设置进去
if (arguments != null) {
ImageView iv_pic = view.findViewById(R.id.iv_pic);
TextView tv_desc = view.findViewById(R.id.tv_desc);
iv_pic.setImageResource(arguments.getInt("image_id", R.mipmap.iphone11));
tv_desc.setText(arguments.getString("desc"));
}
return view;
}
}
商品信息类
import java.util.ArrayList;
public class GoodsInfo {
public int id;
public String name;//名称
public String description;//描述
public String picPath;//大图的保存路径
public int pic;//大图的资源编号
//声明一个手机商品的名称数组
private static String[] mNameArray = {
"iPhone11", "Mate30", "小米10", "OPPO Reno3", "vivo X30", "荣耀30S"
};
//声明一个手机商品的描述数组
private static String[] mDescArray = {
"iPhone 11采用A13仿生芯片;内置GPS/GNSS;搭载两个1200万像素超广角及广角摄像头;有128G、256G可选。",
"Mate30搭载高能效处理器,内置 4200mAh4(典型值)大电池,配合 AI 智能节电技术,软硬件深度合作,共同造就 HUAWEI Mate 30 强悍长续航。",
"小米10搭载高通骁龙865处理器,后置1亿像素AI四摄,配备4780毫安时电池,支持30瓦有线快充,采用MIUI 11系统",
"OPPO Reno3屏幕采用6.4英寸AMOLED屏幕;OPPO Reno3高度160.3毫米,宽度74.3毫米,厚度7.96毫米,重量181克。OPPO Reno3有日出印象、蓝色星夜、月夜黑、月光白四种颜色。",
"vivo X30虹影,配色灵感源于雨后彩虹,或粉或橙,或蓝或绿。后盖采用AG磨砂工艺,让颜色随角度变换产生变化,同时更添轻烟柔雾的视觉感受,并带来柔和细腻的触觉感受。雨过天晴,虹影似近似远。",
"荣耀30系列引入了新一代潜望棱镜光学超长焦,全系搭载50倍潜望式手持超稳远摄。"
};
//图片
private static int[] mPicArray = {
R.mipmap.iphone11, R.mipmap.mate30, R.mipmap.xiaomi10,
R.mipmap.opporeno3, R.mipmap.vivox30, R.mipmap.rongyao30
};
public static ArrayList<GoodsInfo> getDefaultList() {
ArrayList<GoodsInfo> goodsList = new ArrayList<>();
for (int i = 0; i < mNameArray.length; i++) {
GoodsInfo info = new GoodsInfo();
info.id = i;
info.name = mNameArray[i];
info.description = mDescArray[i];
info.pic = mPicArray[i];
goodsList.add(info);
}
return goodsList;
}
}
适合pager和Fragment一起使用的adapter
//pager和fragment一起使用的adapter
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class MobilePagerAdapter extends FragmentPagerAdapter {
private final List<GoodsInfo> mGoodsList;
public MobilePagerAdapter(@NonNull FragmentManager fm, List<GoodsInfo> goodsList) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
this.mGoodsList = goodsList;
}
@NonNull
@Override
public Fragment getItem(int position) {
GoodsInfo info = mGoodsList.get(position);//商品信息
return DynamicFragment.newInstance(position,info.pic,info.description);
}
@Override
public int getCount() {
return mGoodsList.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
//显示标题
return mGoodsList.get(position).name;
}
}