Android自定义View之组合控件实现类似电商app顶部栏

yizhihongxing

为了讲解这个主题,我将会按照以下步骤来进行:

  1. 什么是组合控件
  2. 组合控件的优势
  3. 实现步骤
  4. 示例1:组合自定义View实现顶部栏
  5. 示例2:组合自定义View实现搜索栏

什么是组合控件

组合控件是将多个View组合在一起形成一个新的View的过程,新的View可以保留多个子View的特点,同时还能自己定义一些新的属性和方法。

组合控件的优势

使用组合控件来实现自定义View的时候,可以将View的逻辑和布局分开处理,提高代码的可维护性、可复用性。

实现步骤

  1. 创建新的类继承自ViewGroup或者其子类
  2. 在构造方法中获取子View的引用,设置子View的属性和添加到布局中
  3. 自定义一些新的属性和方法

示例1:组合自定义View实现顶部栏

下面,我们将要用到的是LinearLayout和TextView这两个组件来组成顶部栏,它具有以下属性:
1. 背景颜色
2. 标题文字
3. 返回按钮

先看一下XML布局代码:

<com.example.myview.TopBar
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="#f8f8f8">

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:text="标题"
            android:textSize="18sp"/>

        <ImageView
            android:id="@+id/iv_back"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:src="@drawable/ic_back"/>

</com.example.myview.TopBar>

接着看TopBar.java代码:

public class TopBar extends LinearLayout {

    private TextView mTvTitle;
    private ImageView mIvBack;

    public TopBar(Context context) {
        super(context);
        init();
    }

    public TopBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        View.inflate(getContext(), R.layout.layout_top_bar, this);

        mTvTitle = findViewById(R.id.tv_title);
        mIvBack = findViewById(R.id.iv_back);

        mIvBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (getContext() instanceof Activity) {
                    ((Activity) getContext()).finish();
                }
            }
        });
    }

    public void setTitle(String title) {
        mTvTitle.setText(title);
    }
}

这里的TopBar就是我们自定义的组合控件了。其中,init()方法中调用View.inflate()方法会将XML布局文件中的子View实例化并添加到当前布局中。

我们可以在使用TopBar时调用setTitle()方法来设置顶部栏的标题。当返回键点击时,TopBar通过findViewById()方法获取到ImageView的引用,并设置了点击事件,执行Activity的finish()方法来关闭当前Activity。

示例2:组合自定义View实现搜索栏

接下来,我们再来看一下如何用EditText和Button来组合实现一个支持搜索的输入框。

XML布局代码:

<com.example.myview.SearchView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        app:hint="搜索美食"
        app:button_text="搜索"/>

SearchView.java代码:

public class SearchView extends RelativeLayout {

    private EditText mEtSearch;
    private Button mBtnSearch;

    public SearchView(Context context) {
        super(context);
        init();
    }

    public SearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SearchView);
        String hint = typedArray.getString(R.styleable.SearchView_hint);
        String buttonText = typedArray.getString(R.styleable.SearchView_button_text);
        typedArray.recycle();
        mEtSearch.setHint(hint);
        mBtnSearch.setText(buttonText);
    }

    private void init() {
        View.inflate(getContext(), R.layout.layout_search_view, this);
        mEtSearch = findViewById(R.id.et_search);
        mBtnSearch = findViewById(R.id.btn_search);
        mBtnSearch.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO: search
            }
        });
    }

    public String getSearchText() {
        return mEtSearch.getText().toString();
    }
}

通过XML的app:hint和app:button_text属性来进一步定制当前控件的样式。

创建自定义View的关键是,我们继承了现有的组件(RelativeLayout),并将需要的组件(EditText和Button)组合在一起。

以上就是实现组合控件的两个示例,希望能够帮助到大家的自定义View开发,如果有任何问题,可以在评论区留言向我提问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android自定义View之组合控件实现类似电商app顶部栏 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • OpenCV-Python 理解特征 | 三十六

    OpenCV-Python 理解特征 | 三十六 引言 在计算机视觉中,特征是一种独特的、具有描述性的信息。一个特征通常是一些点、直线、边缘等图像中的部分,并且它们可以用于目标检测、跟踪、匹配、识别等多种应用。 OpenCV-Python 提供了很多计算特征的函数和算法,其中经常使用的有 SIFT、SURF、ORB、FAST 等。本篇文章将讲解这些算法的一些…

    其他 2023年3月28日
    00
  • 在SQL中对同一个字段不同值,进行数据统计操作

    在SQL中对同一个字段不同值进行数据统计操作,可以使用GROUP BY子句,其语法如下: SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name; 其中,column_name是需要进行分组统计的字段名,table_name为需要进行统计操作的表名。COUNT(*)表示对分组后的结果…

    other 2023年6月25日
    00
  • golang升级

    golang升级 Go是一款近年来非常流行的编程语言,相信很多开发者都在使用它。由于它的简单易学、高效安全等特点,已经被广泛应用于各种领域。但是,随着Go版本更新的迭代,可能会造成现有Go应用程序的问题,因此升级Go版本也变得非常重要。本文将介绍如何对Go进行升级,并解决升级过程中所遇到的问题。 为什么需要升级Go版本? 随着Go不断地发布新版本,它提供了更…

    其他 2023年3月28日
    00
  • Laravel 4 初级教程之视图、命名空间、路由

    Laravel 4 初级教程之视图、命名空间、路由攻略 本攻略将详细讲解 Laravel 4 中的视图、命名空间和路由的使用方法。以下是完整的攻略内容: 视图 在 Laravel 4 中,视图用于将数据呈现给用户。视图文件通常存储在 app/views 目录下。以下是使用视图的步骤: 创建视图文件:在 app/views 目录下创建一个新的视图文件,例如 w…

    other 2023年7月28日
    00
  • Android自定义控件样式实例详解

    Android自定义控件样式实例详解 概述 本文主要讲解如何在Android应用中使用自定义控件样式,并提供示例说明。通过阅读本文,你将学到: 什么是Android自定义控件样式 如何在Android项目中创建自定义控件 如何使用XML样式文件 如何使用代码设置控件样式 示例说明 什么是Android自定义控件样式 Android自定义控件样式即是指在And…

    other 2023年6月25日
    00
  • iOS14/iPadOS14 开发者预览 Beta 2 附描述文件下载

    关于“iOS14/iPadOS14 开发者预览 Beta 2 附描述文件下载”的完整攻略,以下是步骤和示例说明: 1. 申请成为开发者 首先,你需要拥有一个苹果开发者账号才能下载开发者预览版的固件和描述文件。如果你还没有成为苹果开发者,需要前往苹果开发者官网进行申请。申请过程很简单,只需要填写一些个人信息并支付一笔费用即可。 2. 下载描述文件 在成为苹果开…

    other 2023年6月26日
    00
  • vivo X Fold2开发者模式在哪 vivo X Fold2进入开发者模式的方法

    以下是“vivo X Fold2开发者模式在哪 vivo X Fold2进入开发者模式的方法”的完整攻略: 一、vivo X Fold2开发者模式在哪 要在vivo X Fold2中找到开发者模式,可以按照以下步骤进行操作: 打开设置应用。可以通过点击主屏幕上的“设置”图标或从通知栏中下拉通知栏,然后点击“设置”来打开设置应用。 向下滑动屏幕,找到“关于手机…

    other 2023年6月26日
    00
  • 详解Python开发语言中的基本数据类型

    详解Python开发语言中的基本数据类型 Python是一种动态类型语言,具有自动类型检测的能力,但是仍然会区分不同类型的数据。在Python中,我们可以直接使用多种基本数据类型来存储不同的数据。下面就让我们来详细讲解一下Python中的基本数据类型。 数值类型 Python中的数值类型包括整数(int)、浮点数(float)、复数(complex)。其中,…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部