Android高级控件

文章目录

    • 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;@Overrideprotected 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);}@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {ToastUtil.show(this, "选中了:" + startArray[position]);}@Overridepublic 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;@Overrideprotected 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);}@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {ToastUtil.show(this,"选中了:" + iconTextArray[position]);}@Overridepublic 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;}@Overridepublic int getCount() {return mPlanets.size();}@Overridepublic Object getItem(int position) {return mPlanets.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;@Overrideprotected 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);}@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {ToastUtil.show(this, "选中了" + parent.getItemAtPosition(position));}@Overridepublic 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;}@Overridepublic int getCount() {return mPlanets.size();}@Overridepublic Object getItem(int position) {return mPlanets.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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允许在页面上分行展示数据列表,例如新闻列表、商品列表等,方便用户浏览与操作。

    <ListViewandroid: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;@Overrideprotected 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);}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {ToastUtil.show(this, "点击了:" + planetList.get(position).name);}@Overridepublic 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 可阻止下级控件获取焦点,避免阻塞列表视图的点击事件--><ImageViewandroid:id="@+id/iv_icon"android:layout_width="0dp"android:layout_weight="1"android:layout_height="80dp"android:scaleType="fitCenter" /><LinearLayoutandroid:layout_width="0dp"android:layout_weight="3"android:layout_height="match_parent"android:orientation="vertical"android:layout_marginLeft="5dp"><TextViewandroid: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"/><TextViewandroid: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><Buttonandroid: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;@Overrideprotected 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:当前页面偏移的像素位置。*/@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}/*** 当新的页面被选中时调用,参数为新选中页面的位置。*/@Overridepublic void onPageSelected(int position) {ToastUtil.show(this, "当前页面位置:" + position);}/*** 页面滚动状态改变时调用,参数表示新的状态。* state:0表示当前页面被完全显示出来;1表示正在滑动,2表示滑动结束,但是没有被完全显示出来。*/@Overridepublic 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());}@Overridepublic int getCount() {return mViewList.size();}@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object object) {return view == object;}// 实例化到指定位置的页面,并将其添加到容器中@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {// 添加一个view到container中,而后返回一个跟这个view可以关联起来的对象ImageView item = mViewList.get(position);container.addView(item);return item;}// 从容器中销毁指定位置的页面@Overridepublic 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;@Overrideprotected 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);}@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {ToastUtil.show(this,"您翻到的手机品牌是" + mGoodsInfoList.get(position).name );}@Overridepublic 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());}@Overridepublic int getCount() {return mViewList.size();}@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object object) {return view == object;}// 实例化到指定位置的页面,并将其添加到容器中@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {// 添加一个view到container中,而后返回一个跟这个view可以关联起来的对象ImageView item = mViewList.get(position);container.addView(item);return item;}// 从容器中销毁指定位置的页面@Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {container.removeView(mViewList.get(position));}@Nullable@Overridepublic 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.ViewPagerandroid:id="@+id/vp_content"android:layout_marginTop="50dp"android:layout_width="match_parent"android:layout_height="400dp"><androidx.viewpager.widget.PagerTabStripandroid: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]);// 获取 RadioGroupRadioGroup rg_indicate = view.findViewById(R.id.rg_indicate);// 获取 ButtonButton btn_start = view.findViewById(R.id.btn_start);// 为每个页面添加一组 RadioButtonfor (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() {@Overridepublic void onClick(View v) {ToastUtil.show(context, "点击了开始体验");}});} else {// 如果不是最后一个页面,则隐藏按钮btn_start.setVisibility(View.GONE);}// 将整个页面视图添加到 mViewList 中mViewList.add(view);}}@Overridepublic int getCount() {// 返回页面数量return mViewList.size();}@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object object) {// 判断给定的视图是否来自指定的对象return view == object;}@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {// 创建并返回指定位置的页面视图View view = mViewList.get(position);container.addView(view);return view;}@Overridepublic 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"><ImageViewandroid:id="@+id/iv_launch"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="fitXY"/><RadioGroupandroid: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"/><Buttonandroid: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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fragment_static);}
}
public class StaticFragment extends Fragment {@Overridepublic 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"><fragmentandroid:id="@+id/fragment_static"android:name="com.zzzjian.demo6.fragment.StaticFragment"android:layout_width="match_parent"android:layout_height="60dp"/><TextViewandroid: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"><TextViewandroid: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"/><ImageViewandroid: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";@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_static, container, false);}@Overridepublic void onAttach(@NonNull Context context) {super.onAttach(context);Log.d(TAG, "onAttach ");}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "onCreate ");}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);Log.d(TAG, "onViewCreated ");}@Overridepublic void onStart() {super.onStart();Log.d(TAG, "onStart ");}@Overridepublic void onResume() {super.onResume();Log.d(TAG, "onResume ");}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);Log.d(TAG, "onActivityCreated ");}@Overridepublic void onPause() {super.onPause();Log.d(TAG, "onPause ");}@Overridepublic void onStop() {super.onStop();Log.d(TAG, "onStop ");}@Overridepublic void onDestroyView() {super.onDestroyView();Log.d(TAG, "onDestroyView ");}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy ");}@Overridepublic 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;@Overrideprotected 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;}/*** 创建碎片视图*/@Overridepublic 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@Overridepublic Fragment getItem(int position) {GoodsInfo info = mGoodsList.get(position);return DynamicFragment.newInstance(position, info.pic ,info.description);}@Overridepublic int getCount() {return mGoodsList.size();}@Nullable@Overridepublic CharSequence getPageTitle(int position) {return mGoodsList.get(position).name;}
}

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

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

相关文章

Hack Uboot

在硬件评估过程中&#xff0c;经常会遇到采用U-Boot的设备。本文旨在阐述U-Boot是什么&#xff0c;从攻击角度来看它为何如此吸引人&#xff0c;以及这种流行的引导程序所关联的攻击面。 U-Boot 特性 U-Boot&#xff0c;即通用引导加载程序&#xff08;Universal Boot Loader…

java中创建不可变集合

一.应用场景 二.创建不可变集合的书写格式&#xff08;List&#xff0c;Set&#xff0c;Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…

问题解决实录 | bash 中 tmux 颜色显示不全

点我进入博客 如下图&#xff0c;tmux 中颜色显示不全: echo $TERM输出的是 screen 但在 bash 里面输出的是 xterm-256 color 在 bash 里面输入&#xff1a; touch ~/.tmux.conf vim ~/.tmux.conf set -g default-terminal "xterm-256color"使之生效 source …

【设计模式-中介者模式】

定义 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为设计模式&#xff0c;通过引入一个中介者对象&#xff0c;来降低多个对象之间的直接交互&#xff0c;从而减少它们之间的耦合度。中介者充当不同对象之间的协调者&#xff0c;使得对象之间的通信变得简单且…

基于ucontext库实现协程类

文章目录 前言协程基础知识协程上下文对称协程与⾮对称协程有栈协程与⽆栈协程 ucontext库接口熟悉一个简单的函数切换自动调用 协程类的实现接口全局变量线程局部变量malloc封装协程切换构造函数协程执行的方法 测试协程切换手动切换复用 前言 协程&#xff08;Coroutine&…

【从0开始搭建微服务并进行部署】SpringBoot+dubbo+zookeeper

文章目录 说明环境搭建创建项目父模块设置子模块 dubbo-api子模块 dubbo-provider子模块 dubbo-consumer测试项目 docker部署项目完整项目地址 说明 jdk1.8SpringBoot2.x低版本dubbo&#xff1a;请查看之前教程【微服务】SpringBootDubboZooKeeper 实战 关于本教程将采用jdk1…

HTML流光爱心

文章目录 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心&#xff08;双心版&#xff09;1…

如何用AI绘画工具生成中国风插画?Midjourney保持风格一致出图

​ 如何运用AI绘画工具如Midjourney&#xff0c;生成符合我们特定要求的艺术作品是一门精进的技巧&#xff0c;尤其当你想生成具有鲜明特色的国风插画时&#xff0c;纯文本提示词的局限性常常使我们难以达到预期效果。然而&#xff0c;借助Midjourney的高级参数功能——特别是s…

【课程学习】随机过程之泊松过程

随机过程之泊松过程 泊松分布泊松过程 泊松分布 二项分布是离散性的分布&#xff0c;泊松分布是把二项分布取n趋于无穷得到的连续分布。也就是在一段时间内不停的观察某件事情发生的次数。 如&#xff1a;一个小时内观察一段路上经过行人的数目&#xff0c;如果每个半个小时观…

Prompt 模版解析:诗人角色的创意引导与实践

Prompt 模版解析&#xff1a;诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具&#xff0c;旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则&#xff0c;使其能在自动化系统中更加精确地执…

【Unity】双摄像机叠加渲染

一、前言 之前我在做我的一个Unity项目的时候&#xff0c;需要绘制场景网格的功能&#xff0c;于是就用到了UnityEngine.GL这个图形库来绘制&#xff0c;然后我发现绘制的网格线是渲染在UI之后的&#xff0c;也就是说绘制出来的图形会遮盖在UI上面&#xff0c;也就导致一旦这些…

计算机网络:物理层 —— 物理层下的传输媒体

文章目录 传输媒体导向性媒体同轴电缆双绞线光纤光纤分类中心波长光纤规格光纤的优缺点 非导向性媒体ISM 频段无线电波微波激光红外线可见光 传输媒体 传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中…

什么是 ARP 欺骗和缓存中毒攻击?

如果您熟悉蒙面歌王&#xff0c;您就会明白蒙面歌王的概念&#xff1a;有人伪装成别人。然后&#xff0c;当面具掉下来时&#xff0c;您会大吃一惊&#xff0c;知道了这位名人是谁。类似的事情也发生在 ARP 欺骗攻击中&#xff0c;只是令人惊讶的是&#xff0c;威胁行为者利用他…

ModuleNotFoundError: No module named ‘package‘

报错&#xff1a; Traceback (most recent call last): File “”, line 198, in run_module_as_main File “”, line 88, in run_code File "D:\python\helloworld.venv\Scripts\pip.exe_main.py", line 4, in File "D:\python\helloworld.venv\Lib\site-pac…

android 全面屏最底部栏沉浸式

Activity的onCreate方法中添加 this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); Android 系统 Bar 沉浸式完美兼容方案自 Android 5.0 版本&#xff0c;Android 带来了沉浸式系统 ba - 掘金 (juejin.cn)https://juejin.cn/post/7075578…

AI类课程的笔记

信息论、导论、模式识别&#xff08;数据挖掘&#xff09;、语义网络与知识图谱、深度学习、强化学习 &#xff08;零&#xff09;信息论 详见另一篇博文 信息论自总结笔记(仍然在更新)_信息论也更新了-CSDN博客https://blog.csdn.net/sinat_27382047/article/details/12690…

Python+Django微信小程序前后端人脸识别登录注册

程序示例精选 PythonDjango微信小程序前后端人脸识别登录注册 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango微信小程序前后端人脸识别登录注册》编写代码&#xff0c;代码整…

并查集——从LeetCode题海中总结常见套路

目录 并查集定义 LeetCode128.最长连续序列 先去重再sort&#xff1a; 改进去重的方法&#xff1a; 参考&#xff1a; 并查集定义 在计算机科学中&#xff0c;并查集是一种树型的数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint Sets&#xff09;的合并及查…

重学SpringBoot3-集成Redis(四)之Redisson

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;四&#xff09;之Redisson 1. 添加 Redisson 依赖2. 配置 Redisson 客户端3. 使用 Redisson 实现分布式锁4. 调用分布式锁5. 为什…

会声会影导出视频mp4格式哪个最高清,会声会影输出格式哪个清晰

调高分辨率后&#xff0c;mp4视频还是不清晰。哪怕全部使用4K级素材&#xff0c;仍然剪不出理想中的高画质作品。不是你的操作有问题&#xff0c;而是剪辑软件没选对。Corel公司拥有全球顶尖的图像处理技术&#xff0c;该公司研发的会声会影视频剪辑软件&#xff0c;在过去的20…