Android高级控件

news2025/2/4 17:53:59

文章目录

    • 1.下拉列表Spinner
      • 1.数组适配器ArrayAdapter
      • 2.简单适配器SimpleAdapter
      • 3.基本适配器BaseAdapter
    • 2.列表视图ListView
    • 3.网格视图GridView
    • 4.翻页视图ViewPager
    • 5.翻页标签栏pagerTabStrip
    • 6.ViewPager实现引导页
    • 7.碎片Fragment
      • 1.Fragment静态注册
      • 2.Fragment生命周期
      • 3.Fragment动态注册

1.下拉列表Spinner

1.数组适配器ArrayAdapter

最简单的适配器,只展示一行文字。

  1. 编写列表项的XML文件,内部布局只有一个TextView标签。
  2. 调用ArrayAdapter的构造方法,填入待展现的字符串数组,以及列表项的XML文件。
  3. 调用下拉框控件的setAdapter方法,传入第二部得到的适配器实例。
public class SpinnerDropdownActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private final static String[] startArray = {"水星","金星","地球","火星","木星"};


    private Spinner sp_dropdown;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spinner_dropdown);
        sp_dropdown = findViewById(R.id.sp_dropdown);

        // 声明一个下拉列表的数组适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.item_select, startArray);
        sp_dropdown.setAdapter(adapter);
        // 默认选择第一个
        sp_dropdown.setSelection(0);
        sp_dropdown.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        ToastUtil.show(this, "选中了:" + startArray[position]);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

在这里插入图片描述

2.简单适配器SimpleAdapter

SimpleAdapter允许在列表项中同时展示文本和图片。

public class SpinnerIconActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private static final int[] iconArray = {
            R.drawable.ikun,R.drawable.ikun,R.drawable.ikun,R.drawable.ikun,R.drawable.ikun
    };

    private static final String[] iconTextArray = {
            "IKUN1","IKUN2","IKUN3","IKUN4","IKUN5"
    };


    private Spinner sp_icon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_spinner_icon);
        sp_icon = findViewById(R.id.sp_icon);
        List<Map<String,Object>> list = new ArrayList<>();
        for(int i=0;i< iconArray.length;i++){
            Map<String,Object> item = new HashMap<>();
            item.put("icon", iconArray[i]);
            item.put("name", iconTextArray[i]);
            list.add(item);
        }
        SimpleAdapter adapter = new SimpleAdapter(this, list,R.layout.item_simple,new String[]{"icon","name"},new int[]{R.id.iv_icon,R.id.tv_name});
        sp_icon.setAdapter(adapter);
        sp_icon.setSelection(0);
        sp_icon.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        ToastUtil.show(this,"选中了:" + iconTextArray[position]);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

在这里插入图片描述

3.基本适配器BaseAdapter

BaseAdapter是一种适应性更强的基本适配器。

public class CustomBaseAdapter extends BaseAdapter {

    private Context mContext;

    private List<Planet> mPlanets;

    public CustomBaseAdapter(Context context, List<Planet> planets) {
        mContext = context;
        mPlanets = planets;
    }

    @Override
    public int getCount() {
        return mPlanets.size();
    }

    @Override
    public Object getItem(int position) {
        return mPlanets.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
        ImageView iv_icon = view.findViewById(R.id.iv_icon);
        TextView tv_name = view.findViewById(R.id.tv_name);
        TextView tv_desc = view.findViewById(R.id.tv_desc);

        // 给控件设置好数据
        iv_icon.setImageResource(mPlanets.get(position).image);
        tv_name.setText(mPlanets.get(position).name);
        tv_desc.setText(mPlanets.get(position).desc);
        return view;
    }


}

public class BaseAdapterActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private Spinner sp_base;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_adapter);
        sp_base = findViewById(R.id.sp_base);

        CustomBaseAdapter adapter = new CustomBaseAdapter(this, Planet.getPlanets());
        sp_base.setAdapter(adapter);
        sp_base.setSelection(0);
        sp_base.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        ToastUtil.show(this, "选中了" + parent.getItemAtPosition(position));
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

在这里插入图片描述
当列表的Item从上方滚出屏幕视角之外:
复用convertView

public class CustomBaseAdapter extends BaseAdapter {

    private Context mContext;

    private List<Planet> mPlanets;

    public CustomBaseAdapter(Context context, List<Planet> planets) {
        mContext = context;
        mPlanets = planets;
    }

    @Override
    public int getCount() {
        return mPlanets.size();
    }

    @Override
    public Object getItem(int position) {
        return mPlanets.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView == null){
            convertView= LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
            viewHolder = new ViewHolder();
            viewHolder.iv_icon = convertView.findViewById(R.id.iv_icon);
            viewHolder.tv_name = convertView.findViewById(R.id.tv_name);
            viewHolder.tv_desc = convertView.findViewById(R.id.tv_desc);
            // 将视图持有者保存到转换视图中
            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        // 给控件设置好数据
        viewHolder.iv_icon.setImageResource(mPlanets.get(position).image);
        viewHolder.tv_name.setText(mPlanets.get(position).name);
        viewHolder.tv_desc.setText(mPlanets.get(position).desc);
        return convertView;
    }


    public final class ViewHolder{
        public ImageView iv_icon;
        public TextView tv_name;
        public TextView tv_desc;

    }


}

2.列表视图ListView

ListView允许在页面上分行展示数据列表,例如新闻列表、商品列表等,方便用户浏览与操作。

    <ListView
        android:id="@+id/lv_planet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:listSelector="@color/transparent"/>
public class ListViewActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, CompoundButton.OnCheckedChangeListener {

    private ListView lv_planet;
    private List<Planet> planetList;

    private CheckBox ck_divider;

    private CheckBox ck_selector;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
        lv_planet = findViewById(R.id.lv_planet);
        ck_divider = findViewById(R.id.ck_divider);
        ck_selector = findViewById(R.id.ck_selector);
        ck_divider.setOnCheckedChangeListener(this);
        ck_selector.setOnCheckedChangeListener(this);
        planetList = Planet.getPlanets();
        CustomBaseAdapter adapter = new CustomBaseAdapter(this, planetList);
        lv_planet.setAdapter(adapter);

        lv_planet.setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ToastUtil.show(this, "点击了:" + planetList.get(position).name);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        switch (buttonView.getId()){
            case R.id.ck_divider:
                if(ck_divider.isChecked()){
                    // 从资源文件获取图形对象
                    Drawable drawable = getResources().getDrawable(R.color.black,getTheme());
                    lv_planet.setDivider(drawable);
                    lv_planet.setDividerHeight(Utils.dip2px(this,1));
                }else{
                    // 隐藏分割线
                    lv_planet.setDivider(null);
                    lv_planet.setDividerHeight(0);
                }
                break;
            case R.id.ck_selector:
                // 显示按压背景
                if (ck_selector.isChecked()){
                    lv_planet.setSelector(R.drawable.list_selector);
                }else{
                    Drawable drawable = getResources().getDrawable(R.color.transparent, getTheme());
                    lv_planet.setSelector(drawable);
                }
                break;
        }
    }
}

ListView会出现条目事件冲突,比如每个条目具有点击事件,每个条目中的按钮同样具有点击事件,那么这样我们点击条目是不会出现任何响应。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants">

<!--    blocksDescendants 可阻止下级控件获取焦点,避免阻塞列表视图的点击事件-->

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="80dp"
        android:scaleType="fitCenter" />


    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_marginLeft="5dp">

        <TextView
            android:id="@+id/tv_name"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="start|center"
            android:textColor="@color/black"
            android:textSize="20sp"/>

        <TextView
            android:id="@+id/tv_desc"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:gravity="start|center"
            android:textColor="@color/black"
            android:layout_marginTop="5dp"
            android:textSize="13sp"/>

    </LinearLayout>


    <Button
        android:id="@+id/btn_oper"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="点我"
        android:gravity="center"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        />
</LinearLayout>

3.网格视图GridView

网格视图用于分行分列显示表格信息。

XML中的属性GridView类的设置方法说明
horizontalSpacingsetHorizontalSpacing指定网格项在水平方向的间距
verticalSpacingsetVerticalSpacing指定网格项在垂直方向的间距
numColumnssetNumColumns指定列的数目
stretchModesetStretchMode指定剩余控件的拉伸模式
columnWidthsetColumnWidth指定每列的宽度
XML中的拉伸模式GridView类的拉伸模式说明
noneNO_STRETCH不拉伸
columnWidthSTRETCH_COLUMN_WIDTH若有剩余空间,则拉伸列宽挤掉空隙
spacingWidthSTRETCH_SPACING若有剩余空间,则列宽不变,把空间分配到每列间的空隙
spacingWidthUniformSTRETCH_SPACING_UNIFORM若有剩余空间,则列宽不变,把空间分配到每列左右的空隙

在这里插入图片描述

4.翻页视图ViewPager

ViewPager翻页时图允许页面在水平方向左右滑动。

public class ViewPagerActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {

    private ViewPager vp_content;
    private List<GoodsInfo> goodsInfoList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager);
        vp_content = findViewById(R.id.vp_content);
        goodsInfoList = GoodsInfo.getDefaultList();
        ImagePagerAdapter adapter = new ImagePagerAdapter(this, goodsInfoList);
        vp_content.setAdapter(adapter);
        vp_content.addOnPageChangeListener(this);
    }

    /**
     * 当页面正在滑动时调用,参数包括当前项位置、偏移量及偏移像素值。
     * position:当前页面,及你点击滑动的页面。
     * positionOffset:当前页面偏移的百分比,百分比范围:0~1。
     * positionOffsetPixels:当前页面偏移的像素位置。
     */
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    /**
     * 当新的页面被选中时调用,参数为新选中页面的位置。
     */
    @Override
    public void onPageSelected(int position) {
        ToastUtil.show(this, "当前页面位置:" + position);
    }

    /**
     * 页面滚动状态改变时调用,参数表示新的状态。
     * state:0表示当前页面被完全显示出来;1表示正在滑动,2表示滑动结束,但是没有被完全显示出来。
     */
    @Override
    public void onPageScrollStateChanged(int state) {

    }
}
public class ImagePagerAdapter extends PagerAdapter {


    private Context mContext;

    private List<GoodsInfo> mList;

    private List<ImageView> mViewList = new ArrayList<>();

    public ImagePagerAdapter(Context mContext, List<GoodsInfo> mList) {
        this.mContext = mContext;
        this.mList = mList;
        // 每个商品分配一个专用的图像视图
        this.mViewList = mList.stream().map(item -> {
            ImageView imageView = new ImageView(mContext);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
            imageView.setImageResource(item.pic);
            return imageView;
        }).collect(Collectors.toList());
    }

    @Override
    public int getCount() {
        return mViewList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }


    // 实例化到指定位置的页面,并将其添加到容器中
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        // 添加一个view到container中,而后返回一个跟这个view可以关联起来的对象
        ImageView item = mViewList.get(position);
        container.addView(item);
        return item;
    }


    // 从容器中销毁指定位置的页面
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mViewList.get(position));
    }
}

5.翻页标签栏pagerTabStrip

public class PagerTabActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {

    private List<GoodsInfo> mGoodsInfoList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_pager_tab);
        initPagerStrip();
        initViewPager();
    }

    // 初始化翻页视图
    private void initViewPager() {
        ViewPager vp_content = findViewById(R.id.vp_content);
        mGoodsInfoList = GoodsInfo.getDefaultList();
        vp_content.setAdapter(new ImagePagerAdapter(this, mGoodsInfoList));
        vp_content.addOnPageChangeListener(this);
        vp_content.setCurrentItem(3);
    }

    // 初始化翻页标签栏
    private void initPagerStrip() {
        PagerTabStrip pts_tab = findViewById(R.id.pts_tab);
        // 设置标签栏文本大小
        pts_tab.setTextSize(TypedValue.COMPLEX_UNIT_SP,20);
        pts_tab.setTextColor(Color.BLACK);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        ToastUtil.show(this,"您翻到的手机品牌是" + mGoodsInfoList.get(position).name );
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
}
public class ImagePagerAdapter extends PagerAdapter {


    private Context mContext;

    private List<GoodsInfo> mList;

    private List<ImageView> mViewList = new ArrayList<>();

    public ImagePagerAdapter(Context mContext, List<GoodsInfo> mList) {
        this.mContext = mContext;
        this.mList = mList;
        // 每个商品分配一个专用的图像视图
        this.mViewList = mList.stream().map(item -> {
            ImageView imageView = new ImageView(mContext);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));
            imageView.setImageResource(item.pic);
            return imageView;
        }).collect(Collectors.toList());
    }

    @Override
    public int getCount() {
        return mViewList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }


    // 实例化到指定位置的页面,并将其添加到容器中
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        // 添加一个view到container中,而后返回一个跟这个view可以关联起来的对象
        ImageView item = mViewList.get(position);
        container.addView(item);
        return item;
    }


    // 从容器中销毁指定位置的页面
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mViewList.get(position));
    }


    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mList.get(position).name;
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".PagerTabActivity">


    <androidx.viewpager.widget.ViewPager
        android:id="@+id/vp_content"
        android:layout_marginTop="50dp"
        android:layout_width="match_parent"
        android:layout_height="400dp">

        <androidx.viewpager.widget.PagerTabStrip
            android:id="@+id/pts_tab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </androidx.viewpager.widget.ViewPager>


</LinearLayout>

在这里插入图片描述

6.ViewPager实现引导页

当用户安装一个新的应用时,首次启动大多出现欢迎页面,这个引导页要往右翻翻好几页,才会进入应用主页,这种启动引导页就是通过翻页视图实现的。

public class LaunchSimpleAdapter extends PagerAdapter {

    private List<View> mViewList = new ArrayList<>();

    /**
     * 构造函数,用于初始化适配器并填充页面数据。
     *
     * @param context 上下文对象
     * @param imageArray 图片资源数组
     */
    public LaunchSimpleAdapter(Context context, int[] imageArray) {
        for (int i = 0; i < imageArray.length; i++) {
            // 从布局文件中加载页面视图
            View view = LayoutInflater.from(context).inflate(R.layout.item_launch, null);

            // 获取 ImageView 并设置图片资源
            ImageView iv_launch = view.findViewById(R.id.iv_launch);
            iv_launch.setImageResource(imageArray[i]);

            // 获取 RadioGroup
            RadioGroup rg_indicate = view.findViewById(R.id.rg_indicate);

            // 获取 Button
            Button btn_start = view.findViewById(R.id.btn_start);

            // 为每个页面添加一组 RadioButton
            for (int j = 0; j < imageArray.length; j++) {
                RadioButton radioButton = new RadioButton(context);
                radioButton.setLayoutParams(new RadioGroup.LayoutParams(
                        ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT
                ));
                radioButton.setPadding(10, 10, 10, 10);
                rg_indicate.addView(radioButton);
            }

            // 设置当前页面对应的 RadioButton 为选中状态
            ((RadioButton) rg_indicate.getChildAt(i)).setChecked(true);

            // 如果是最后一个页面,则显示按钮并设置点击事件
            if (i == imageArray.length - 1) {
                btn_start.setVisibility(View.VISIBLE);
                btn_start.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ToastUtil.show(context, "点击了开始体验");
                    }
                });
            } else {
                // 如果不是最后一个页面,则隐藏按钮
                btn_start.setVisibility(View.GONE);
            }

            // 将整个页面视图添加到 mViewList 中
            mViewList.add(view);
        }
    }

    @Override
    public int getCount() {
        // 返回页面数量
        return mViewList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        // 判断给定的视图是否来自指定的对象
        return view == object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        // 创建并返回指定位置的页面视图
        View view = mViewList.get(position);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        // 移除指定位置的页面视图
        container.removeView(mViewList.get(position));
    }
}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_launch"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"/>

    <RadioGroup
        android:id="@+id/rg_indicate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:paddingBottom="20dp"
        android:orientation="horizontal"/>

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="立即开始美好生活"
        android:textColor="@color/black"
        android:textSize="22sp"
        android:visibility="gone"/>

</RelativeLayout>

7.碎片Fragment

传统的Activity并不能很好的处理大屏问题,所以急需一个碎片化的东西能够划区域展示内容,且有自己的独立可操作空间,所以就出现了Fragment。
静态注册在布局文件中直接指定Fragment,而动态注册直到代码中才动态添加Fragment。

1.Fragment静态注册

public class FragmentStaticActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_static);
    }
}
public class StaticFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_static, container, false);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".FragmentStaticActivity">

    <fragment
        android:id="@+id/fragment_static"
        android:name="com.zzzjian.demo6.fragment.StaticFragment"
        android:layout_width="match_parent"
        android:layout_height="60dp"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="每个页面具体的内容"
        android:textColor="@color/black"
        android:gravity="center"
        android:textSize="17sp"/>

</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="wrap_content"
    android:orientation="horizontal"
    android:background="#bbffbb"
    tools:context=".fragment.StaticFragment">

    <TextView
        android:id="@+id/tv_adv"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:text="广告图片"
        android:textColor="@color/black"
        android:gravity="center"
        android:textSize="17sp"/>

    <ImageView
        android:id="@+id/iv_adv"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="4"
        android:src="@drawable/ikun"
        android:scaleType="fitCenter"/>


</LinearLayout>

在这里插入图片描述

2.Fragment生命周期

在这里插入图片描述


public class StaticFragment extends Fragment {


    private static final String TAG = "StaticFragment";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_static, container, false);
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        Log.d(TAG, "onAttach ");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate ");
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.d(TAG, "onViewCreated ");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart ");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume ");
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG, "onActivityCreated ");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "onPause ");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop ");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d(TAG, "onDestroyView ");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy ");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d(TAG, "onDetach ");
    }
}

3.Fragment动态注册

ublic class FragmentDynamicActivity extends AppCompatActivity {

    private ViewPager vp_content;

    private PagerTabStrip pts_tab;

    private List<GoodsInfo> mGoodsList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_dynamic);



        initPagerStrip();
        initViewPager();
    }

    private void initViewPager() {
        vp_content = findViewById(R.id.vp_content);
        mGoodsList = GoodsInfo.getDefaultList();
        MobilePagerAdapter adapter = new MobilePagerAdapter(getSupportFragmentManager(), mGoodsList);
        vp_content.setAdapter(adapter);
        vp_content.setCurrentItem(0);
    }

    private void initPagerStrip() {
        pts_tab = findViewById(R.id.pts_tab);
        pts_tab.setTextSize(TypedValue.COMPLEX_UNIT_SP,20);
        pts_tab.setTextColor(Color.BLACK);
    }
}
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) {
        View view = inflater.inflate(R.layout.fragment_dynamic, container, false);
        ImageView iv_pic = (ImageView) view.findViewById(R.id.iv_pic);
        TextView tv_desc = (TextView) view.findViewById(R.id.tv_desc);
        if(getArguments() != null){
            iv_pic.setImageResource(getArguments().getInt("image_id"));
            tv_desc.setText(getArguments().getString("desc"));
        }
        return view;
    }
}
public class MobilePagerAdapter extends FragmentPagerAdapter {

    private List<GoodsInfo> mGoodsList;

    public MobilePagerAdapter(@NonNull FragmentManager fm, List<GoodsInfo> goodsInfoList) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        this.mGoodsList = goodsInfoList;
    }

    @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;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国内的无人机行业的现状和前景分析

近年来&#xff0c;随着科技的飞速发展&#xff0c;无人机&#xff08;Unmanned Aerial Vehicle, UAV&#xff09;作为战略性新兴产业的重要组成部分&#xff0c;在全球范围内迅速崛起。无人机利用无线电遥控设备和自备的程序控制装置操纵&#xff0c;实现不载人飞行&#xff0…

COMP 9517 Computer Vision week3

目录 特征表示图像特征概念(image feature)图像特征应该具备的属性 图像特征种类颜色特征颜色直方图(Color Histogram)颜色矩(Colour moments) 纹理特征(texture features)Haralick特征局部二值模式(Local Binary Patterns, LBP)尺度不变特征变换SIFT(Scale-invariant feature …

Python酷库之旅-第三方库Pandas(133)

目录 一、用法精讲 596、pandas.DataFrame.plot.density方法 596-1、语法 596-2、参数 596-3、功能 596-4、返回值 596-5、说明 596-6、用法 596-6-1、数据准备 596-6-2、代码示例 596-6-3、结果输出 597、pandas.DataFrame.plot.hexbin方法 597-1、语法 597-2、…

如何向文科生解释什么是计算机的缓存

缓存&#xff08;Cache&#xff09;是计算机系统中的一个至关重要的技术概念&#xff0c;用于提高数据访问的速度。我们可以把缓存想象成一个临时的存储区域&#xff0c;它存放着系统中常用或最近使用的数据&#xff0c;以便快速访问&#xff0c;而不必每次都从速度较慢的原始数…

HTB:Synced[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What is the default port for rsync? 2.How many TCP ports are open on the remote host? 3.What is the protocol version used by rsync on the remote machine? 4.What is the most common command name on Linux to interact w…

showdoc二次开发

showdoc用的vue版本老&#xff0c;需要安装老版本nodejs&#xff0c;比如node 14.21.3 win32-x64-93_binding.node问题 https://github.com/sass/node-sass/releases 下载 web_src\node_modules\node-sass\vendor\win32-x64-93 下面重命名为binding.node

HTML+CSS之过度,变形,动画(14个案例+代码+效果图)

目录 过渡 (Transitions) transition-property&#xff1a; 案例:鼠标悬浮方逐渐放大 1.代码 2.效果 transition-duration&#xff1a; 案例:鼠标悬停逐渐慢慢放大 1.代码 2.效果 transition-timing-function&#xff1a; 案例:放大速度为ease-out 1.代码 2.效果 transition-de…

【无人机设计与技术】基于EKF的四旋翼无人机姿态估计matlab仿真

摘要&#xff1a; 本文设计了一种基于扩展卡尔曼滤波&#xff08;EKF&#xff09;的四旋翼无人机姿态估计方法。利用EKF算法处理四旋翼无人机姿态的动态模型&#xff0c;通过该滤波算法实现对姿态的实时估计和校正。该方法通过对无人机的运动学和动力学模型的分析&#xff0c;…

新编英语语法教程

新编英语语法教程 1. 新编英语语法教程 (第 6 版) 学生用书1.1. 目录1.2. 电子课件 References A New English Grammar Coursebook 新编英语语法教程 (第 6 版) 学生用书新编英语语法教程 (第 6 版) 教师用书 1. 新编英语语法教程 (第 6 版) 学生用书 https://erp.sflep.cn/…

Python从入门到高手5.1节-Python简单数据类型

目录 5.1.1 理解数据类型 5.1.2 Python中的数据类型 5.1.3 Python简单数据类型 5.1.4 特殊的空类型 5.1.5 Python变量的类型 5.1.6 广州又开始变热 5.1.1 理解数据类型 数据类型是根据数据本身的性质和特征来对数据进行分类&#xff0c;例如奇数与偶数就是一种数据类型。…

软件测试:postman详解

一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的&#xff0c;用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网…

自动驾驶系列—全面解析自动驾驶线控制动技术:智能驾驶的关键执行器

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

小阿轩yx-案例:jenkins部署Maven和NodeJS项目

小阿轩yx-案例&#xff1a;jenkins部署Maven和NodeJS项目 前言 在 Java 项目开发中&#xff0c;项目的编译、测试、打包等是比较繁琐的&#xff0c;属于重复劳动的工作&#xff0c;浪费人力和时间成本。以往开发项目时&#xff0c;程序员往往需要花较多的精力在引用 jar 包搭…

8月AI绘画方向APP用户量及人均时长排行榜

全球用户量Top10&#xff08;APP&#xff09; 排名 产品名 分类 8月MAU 上月对比 1 Remini 人工智能修图 29.14M -0.88% 2 FaceApp AI 人脸编辑器 26.46M 0.14% 3 Hypic Photo Editor & AI Art 17.37M 5.74% 4 AI Mirror AI Art Photo Editor 16.81…

【第三版 系统集成项目管理工程师】第16章 监理基础知识

持续更新。。。。。。。。。。。。。。。 【第三版】第十六章 监理基础知识 16.1 监理的意义和作用1.监理的地位和作用(非重点)-P5692.监理的重要性与迫切性-P5703.监理技术参考模型-P570 16.2 监理相关概念1.信息系统工程监理-P5722.信息系统工程监理单位-P5723.业主单位-P57…

LeNet学习

Lenet是一个 7 层的神经网络&#xff0c;包含 3 个卷积层&#xff0c;2 个池化层&#xff0c;1 个全连接层。其中所有卷积层的所有卷积核都为 5x5&#xff0c;步长 strid1&#xff0c;池化方法都为全局 pooling&#xff0c;激活函数为 Sigmoid&#xff0c;网络结构如下&#xf…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

ffmpeg面向对象——拉流协议匹配机制探索

目录 1.URLProtocol类2.协议匹配的基础接口3. URLContext类4. 综合调用流程图5.rtsp拉流协议匹配流程图及对象图5.1 rtsp拉流协议调用流程图5.2 rtsp拉流协议对象图 6.本地文件调用流程图及对象图6.1 本地文件调用流程图6.2 本地文件对象图 7.内存数据调用流程图及对象图7.1 内…

李宏毅深度学习-梯度下降和Batch Normalization批量归一化

Gradient Descent梯度下降 ▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头&#xff08;loss等高线的法线方向&#xff09; Tip1: Tuning your learning rates Adaptive Learning Rates自适应lr 通常lr会越来越小 Adaptive Learning Rates中每个参数都给它不…

基于依赖注入技术的.net core WebApi框架创建实例

依赖注入&#xff08;Dependency Injection, DI&#xff09;是一种软件设计模式&#xff0c;用于实现控制反转&#xff08;Inversion of Control, IoC&#xff09;。在ASP.NET Core中&#xff0c;依赖注入是内置的核心功能之一。它允许你将应用程序的组件解耦和配置&#xff0c…