自定义View(多个组件组成的layout)

虽然include也节省了写xml的时间,但是里面的响应事件还是每次都要写一遍,很多时候,为了节省开发时间,对于重复的布局,我们会直接通过自定义来实现。

1.在valuse文件下创建一个attrs文件():

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="SearchView">//自定义的class
        <attr name="textcolor" format="color"/>
        <attr name="textsize" format="dimension"/>
        <attr name="background" format="color"/>
    </declare-styleable>

    <declare-styleable name="TitleView">
        <attr name="textcolor" format="color"/>
        <attr name="textsize" format="dimension"/>
        <attr name="background" format="color"/>
    </declare-styleable>
</resources>

2.layout下创建一个xml布局(layout_search,这里为方便看直接dp,用merge是为了少一层):

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

    <ImageView
        android:id="@+id/market"
        android:layout_marginTop="8dp"
        android:layout_marginRight="10dp"
        android:padding="5dp"
        android:layout_alignParentRight="true"
        android:src="@drawable/ic_market"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/fast"
        android:padding="5dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="8dp"
        android:layout_toLeftOf="@+id/market"
        android:src="@drawable/ic_fast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />


    <EditText
        android:id="@+id/h_input"
        android:layout_toLeftOf="@+id/fast"
        android:textSize="12sp"
        android:singleLine="true"
        android:textColorHint="@color/text_assistant3"
        android:textColor="@color/text_assistant3"
        android:hint="点击搜索"
        android:layout_alignBottom="@id/market"
        android:layout_alignTop="@id/market"
        android:layout_marginLeft="15dp"
        android:minHeight="32dp"
        android:paddingLeft="35dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:background="@drawable/bg_search"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/h_search"
        android:padding="8dp"
        android:layout_alignLeft="@+id/h_input"
        android:layout_alignTop="@+id/h_input"
        android:layout_alignBottom="@+id/h_input"
        android:src="@drawable/ic_search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</merge>

3.创建一个class并继承View(LinearLayout,ViewGroup,RelativeLayout,TextView等都可以,我这里是继承RelativeLayout):

public class SearchView extends RelativeLayout {

    @BindView(R.id.market)
    ImageView market;
    @BindView(R.id.fast)
    ImageView fast;
    @BindView(R.id.h_input)
    EditText hInput;
    @BindView(R.id.h_search)
    ImageView hSearch;

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

    public SearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        View view = LayoutInflater.from(context).inflate(R.layout.layout_search, this, true);
        ButterKnife.bind(this, view);//这里用的是黄油刀如果不是用小刀,就直接像Activity一样findId
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SearchView);
        int textColor = array.getColor(R.styleable.SearchView_textcolor, 0XFF00FF00);
        if (array != null) {
            hInput.setTextColor(textColor);
        }
    }

    @OnClick({R.id.market, R.id.fast, R.id.h_input, R.id.h_search})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.market:
                TipsUtil.log("market");
                break;
            case R.id.fast:
                TipsUtil.log("fast");
                break;
            case R.id.h_search:
                TipsUtil.log("search");
                break;
            case R.id.h_input:
                TipsUtil.log("input");
                break;
        }
    }
}

/** 工具 **/

public class TipsUtil {

    //log
    public static void log(String text){
        Log.e("TAG","-------"+text);
    }
}

END...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然可以从《Android开发艺术探索》的知识体系中获益。 全书目录 ------------------------------------------------------------------- 第1章 Activity的生命周期和启动模式 / 1   1.1 Activity的生命周期全面分析 / 1   1.1.1 典型情况下的生命周期分析 / 2   1.1.2 异常情况下的生命周期分析 / 8   1.2 Activity的启动模式 / 16   1.2.1 Activity的LaunchMode / 16   1.2.2 Activity的Flags / 27   1.3 IntentFilter的匹配规则 / 28   第2章 IPC机制 / 35   2.1 Android IPC简介 / 35   2.2 Android中的多进程模式 / 36   2.2.1 开启多进程模式 / 36   2.2.2 多进程模式的运行机制 / 39   2.3 IPC基础概念介绍 / 42   2.3.1 Serializable接口 / 42   2.3.2 Parcelable接口 / 45   2.3.3 Binder / 47   2.4 Android中的IPC方式 / 61   2.4.1 使用Bundle / 61   2.4.2 使用文件共享 / 62   2.4.3 使用Messenger / 65   2.4.4 使用AIDL / 71   2.4.5 使用ContentProvider / 91   2.4.6 使用Socket / 103   2.5 Binder连接池 / 112   2.6 选用合适的IPC方式 / 121   第3章 View的事件体系 / 122   3.1 View基础知识 / 122   3.1.1 什么是View / 123   3.1.2 View的位置参数 / 123   3.1.3 MotionEvent和TouchSlop / 125   3.1.4 VelocityTracker、GestureDetector和Scroller / 126   3.2 View的滑动 / 129   3.2.1 使用scrollTo/scrollBy / 129   3.2.2 使用动画 / 131   3.2.3 改变布局参数 / 133   3.2.4 各种滑动方式的对比 / 133   3.3 弹性滑动 / 135   3.3.1 使用Scroller / 136   3.3.2 通过动画 / 138   3.3.3 使用延时策略 / 139   3.4 View的事件分发机制 / 140   3.4.1 点击事件的传递规则 / 140   3.4.2 事件分发的源码解析 / 144   3.5 View的滑动冲突 / 154   3.5.1 常见的滑动冲突场景 / 155   3.5.2 滑动冲突的处理规则 / 156   3.5.3 滑动冲突的解决方式 / 157   第4章 View的工作原理 / 174   4.1 初识ViewRoot和DecorView / 174   4.2 理解MeasureSpec / 177   4.2.1 MeasureSpec / 177   4.2.2 MeasureSpec和LayoutParams的对应关系 / 178   4.3 View的工作流程 / 183   4.3.1 measure过程 / 183   4.3.2 layout过程 / 193   4.3.3 draw过程 / 197   4.4 自定义View / 199   4.4.1 自定义View的分类 / 200   4.4.2 自定义View须知 / 201   4.4.3 自定义View示例 / 202   4.4.4 自定义View的思想 / 217   第5章 理解RemoteViews / 218   5.1 RemoteViews的应用 / 218   5.1.1 RemoteViews在通知栏上的应用 / 219   5.1.2 RemoteViews在桌面小部件上的应用 / 221   5.1.3 PendingIntent概述 / 228   5.2 RemoteViews的内部机制 / 230   5.3 RemoteViews的意义 / 239   第6章 Android的Drawable / 243   6.1 Drawable简介 / 243   6.2 Drawable的分类 / 244   6.2.1 BitmapDrawable / 244   6.2.2 ShapeDrawable / 247   6.2.3 LayerDrawable / 251   6.2.4 StateListDrawable / 253   6.2.5 LevelListDrawable / 255   6.2.6 TransitionDrawable / 256   6.2.7 InsetDrawable / 257   6.2.8 ScaleDrawable / 258   6.2.9 ClipDrawable / 260   6.3 自定义Drawable / 262   第7章 Android动画深入分析 / 265   7.1 View动画 / 265   7.1.1 View动画的种类 / 265   7.1.2 自定义View动画 / 270   7.1.3 帧动画 / 272   7.2 View动画的特殊使用场景 / 273   7.2.1 LayoutAnimation / 273   7.2.2 Activity的切换效果 / 275   7.3 属性动画 / 276   7.3.1 使用属性动画 / 276   7.3.2 理解插值器和估值器 / 280   7.3.3 属性动画的监听器 / 282   7.3.4 对任意属性做动画 / 282   7.3.5 属性动画的工作原理 / 288   7.4 使用动画的注意事项 / 292   第8章 理解Window和WindowManager / 294   8.1 Window和WindowManager / 294   8.2 Window的内部机制 / 297   8.2.1 Window的添加过程 / 298   8.2.2 Window的删除过程 / 301   8.2.3 Window的更新过程 / 303   8.3 Window的创建过程 / 304   8.3.1 Activity的Window创建过程 / 304   8.3.2 Dialog的Window创建过程 / 308   8.3.3 Toast的Window创建过程 / 311   第9章 四大组件的工作过程 / 316   9.1 四大组件的运行状态 / 316   9.2 Activity的工作过程 / 318   9.3 Service的工作过程 / 336   9.3.1 Service的启动过程 / 336   9.3.2 Service的绑定过程 / 344   9.4 BroadcastReceiver的工作过程 / 352   9.4.1 广播的注册过程 / 353   9.4.2 广播的发送和接收过程 / 356   9.5 ContentProvider的工作过程 / 362   第10章 Android的消息机制 / 372   10.1 Android的消息机制概述 / 373   10.2 Android的消息机制分析 / 375   10.2.1 ThreadLocal的工作原理 / 375   10.2.2 消息队列的工作原理 / 380   10.2.3 Looper的工作原理 / 383   10.2.4 Handler的工作原理 / 385   10.3 主线程的消息循环 / 389   第11章 Android的线程和线程池 / 391   11.1 主线程和子线程 / 392   11.2 Android中的线程形态 / 392   11.2.1 AsyncTask / 392   11.2.2 AsyncTask的工作原理 / 395   11.2.3 HandlerThread / 402   11.2.4 IntentService / 403   11.3 Android中的线程池 / 406   11.3.1 ThreadPoolExecutor / 407   11.3.2 线程池的分类 / 410   第12章 Bitmap的加载和Cache / 413   12.1 Bitmap的高效加载 / 414   12.2 Android中的缓存策略 / 417   12.2.1 LruCache / 418   12.2.2 DiskLruCache / 419   12.2.3 ImageLoader的实现 / 424   12.3 ImageLoader的使用 / 441   12.3.1 照片墙效果 / 441   12.3.2 优化列表的卡顿现象 / 446   第13章 综合技术 / 448   13.1 使用CrashHandler来获取应用的crash信息 / 449   13.2 使用multidex来解决方法数越界 / 455   13.3 Android的动态加载技术 / 463   13.4 反编译初步 / 469   13.4.1 使用dex2jar和jd-gui反编译apk / 470   13.4.2 使用apktool对apk进行二次打包 / 470   第14章 JNI和NDK编程 / 473   14.1 JNI的开发流程 / 474   14.2 NDK的开发流程 / 478   14.3 JNI的数据类型和类型签名 / 484   14.4 JNI调用Java方法的流程 / 486   第15章 Android性能优化 / 489   15.1 Android的性能优化方法 / 490   15.1.1 布局优化 / 490   15.1.2 绘制优化 / 493   15.1.3 内存泄露优化 / 493   15.1.4 响应速度优化和ANR日志分析 / 496   15.1.5 ListView和Bitmap优化 / 501   15.1.6 线程优化 / 501   15.1.7 一些性能优化建议 / 501   15.2 内存泄露分析之MAT工具 / 502   15.3 提高程序的可维护性 / 506
在ListView中展示多个图片可以通过以下步骤实现: 1. 首先,在你的布局文件中添加一个ListView组件,如下所示: ``` <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 在代码中获取ListView组件的引用,并创建一个列表项布局文件(list_item.xml),其中包含一个ImageView组件来展示图片和其他所需的视图组件,如下所示: ``` ImageView imageView = findViewById(R.id.imageView); ``` 3. 创建一个用于存储图片资源的数组或集合。可以通过以下方式之一: - 创建一个int数组,其中存储了图片的资源id: ``` int[] imageResources = {R.drawable.image1, R.drawable.image2, R.drawable.image3}; ``` - 创建一个ArrayList,其中存储了图片的资源id: ``` ArrayList<Integer> imageResources = new ArrayList<>(); imageResources.add(R.drawable.image1); imageResources.add(R.drawable.image2); imageResources.add(R.drawable.image3); ``` 4. 创建一个自定义的适配器类(ImageAdapter),继承自BaseAdapter类,并实现必要的方法: - 在适配器的构造函数中接收图片资源数组或集合,并保存起来; - 在getView方法中,根据position获取当前列表项对应的图片资源id,并将其设置给ImageView组件。 5. 在Activity或Fragment中,实例化上述适配器,并将其设置给ListView组件: ``` ImageAdapter imageAdapter = new ImageAdapter(this, imageResources); listView.setAdapter(imageAdapter); ``` 这样,ListView将会展示出多个包含图片的列表项。你可以根据需要进行其他的设置,例如添加点击事件处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值