通用顶部自定义控件 可在XML自定义属性

直接上代码  自定义控件的主体内容

package com.x2l.onlineedu.mid.object;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.x2l.onlineedu.mid.R;

public class TopLayout extends LinearLayout {

	private Context mContext;
	private ImageView v_left;
	private View v_main;
	private ImageView v_right;
	private TextView tv;
	TopLayOutClickListener topLayOutClickListener;

	public TopLayout(Context context) {
		super(context);
		mContext = context;
	}

	public TopLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		init(attrs);

	}

	/**
	 * 功  能:载入在Xml中设置的内容<br>
	 * 时  间:2015年6月17日 下午2:21:07<br>
	 * 注  意:<br>
	 *
	 * @param attrs
	 */
	private void init(AttributeSet attrs) {

		TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.TopLayout);
		int left_Src = a.getResourceId(R.styleable.TopLayout_leftImage_src, R.drawable.ic_app);
		int right_Src = a.getResourceId(R.styleable.TopLayout_rightImage_Visiable, R.drawable.ic_app);
		int left_Visiable = a.getInt(R.styleable.TopLayout_leftImage_Visiable, View.VISIBLE);
		int top_background = a.getResourceId(R.styleable.TopLayout_layout_background, R.drawable.top_main);
		String str = a.getString(R.styleable.TopLayout_text);
		int right_Visiable = a.getInt(R.styleable.TopLayout_rightImage_Visiable, View.VISIBLE);
		int text_Visiable = a.getInt(R.styleable.TopLayout_text_Visiable, View.VISIBLE);

		v_main = LayoutInflater.from(mContext).inflate(R.layout.toplayout, this, true);
		v_left = (ImageView) v_main.findViewById(R.id.top_layout_leftbtn);
		v_right = (ImageView) v_main.findViewById(R.id.top_layout_rightbtn);
		tv = (TextView) v_main.findViewById(R.id.top_layout_text);
		v_left.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (topLayOutClickListener != null) {
					topLayOutClickListener.LeftBtnClick();
				}
			}
		});
		v_right.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (topLayOutClickListener != null) {
					topLayOutClickListener.RightBtnClick();
				}
			}
		});
		v_main.setBackgroundResource(top_background);
		v_left.setImageResource(left_Src);
		v_left.setVisibility(left_Visiable);
		v_right.setImageResource(right_Src);
		v_right.setVisibility(right_Visiable);
		tv.setText(str);
		tv.setVisibility(text_Visiable);

	}

	@SuppressLint("NewApi")
	public TopLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
	}

	public interface TopLayOutClickListener {
		void LeftBtnClick();

		void RightBtnClick();

	}

	public void setTopLayoutClickListener(TopLayOutClickListener clickListener) {
		this.topLayOutClickListener = clickListener;
	}

}

自定义控件相应的View    toplayout.xml

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

    <ImageView
        android:id="@+id/top_layout_leftbtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="@dimen/top_text_margin_leftright" />

    <TextView
        android:id="@+id/top_layout_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:layout_centerInParent="true"
        android:textSize="@dimen/top_text_size" />

    <ImageView
        android:id="@+id/top_layout_rightbtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="@dimen/top_text_margin_leftright" />

</RelativeLayout>

可以在XMl自定义属性中定义的项目 必须在 attr中定义

  <!-- 通用 自定义控件  最顶部的提示栏  -->
    <declare-styleable name="TopLayout">
        <attr name="leftImage_src" format="reference"></attr>
        <attr name="rightImage_src" format="reference"></attr>
        <attr name="layout_background" format="reference"></attr>
        <attr name="text" format="string"></attr>
        <attr name="leftImage_Visiable">
            <enum name="visiable" value="0x00000000"></enum>
            <enum name="gone" value="0x00000008"></enum>
            <enum name="invisiable" value="0x00000004"></enum>
        </attr>
        <attr name="rightImage_Visiable">
            <enum name="visiable" value="0x00000000"></enum>
            <enum name="gone" value="0x00000008"></enum>
            <enum name="invisiable" value="0x00000004"></enum>
        </attr>
        <attr name="text_Visiable">
            <enum name="visiable" value="0x00000000"></enum>
            <enum name="gone" value="0x00000008"></enum>
            <enum name="invisiable" value="0x00000004"></enum>
        </attr>
    </declare-styleable>

使用上自定义控件的地方  testlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:topview="http://schemas.android.com/apk/res/com.x2l.onlineedu.mid"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.x2l.onlineedu.mid.object.TopLayout
        android:id="@+id/tixian_edit_password_topview"
        android:layout_width="match_parent"
        android:layout_height="@dimen/top_height"
        topview:layout_background="@drawable/top_main"
        topview:leftImage_src="@drawable/back"
        topview:rightImage_Visiable="gone"
        topview:text="提现" >
    </com.x2l.onlineedu.mid.object.TopLayout>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/edit_background"
        android:hint="请输入账号登陆密码" />

    <ImageView
        android:id="@+id/tixian_edit_password_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/tixian_edit_password_btn" />

</LinearLayout>

注意:在使用自定义的控件有时候会报  No
resource identifier found for attribute ‘XXX’ in package
等错误

解决方法:命名空间后面的包名应该是AndroidManifest.xml文件中定义的package包名,而不是使用的这个自定义控件所处的包的包名。

时间: 2024-10-18 19:39:44

通用顶部自定义控件 可在XML自定义属性的相关文章

Android Studio 错误: 非法字符: &#39;\ufeff&#39; 及 Gradle不能自动查找xml自定义属性

一.非法字符: '\ufeff' 在将项目导入到Studio时提示 错误:非法字符: '\ufeff',编译器没报错但编译出错,比较头疼,后来发现原因是因为没有采用UTF-8无BOM模式,用 Notepad++ 或其他编辑器将文件打开,更换下格式就可以解决: 注:Eclipse可以智能的把有BOM文件转为无BOM文件,目前Andorid Studio未做处理.下面也简单的说下什么是BOM(Byte-Order Mark),可以理解为字节顺序标记,是位于码点U+FEFF的统一码字符的名称.当以 U

android自定义控件(三) 增加内容 自定义属性 format详解

转自 http://www.gisall.com/html/35/160435-5369.html 1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = "background" format = "reference" /> </declare-styleable> (2)属性使用: <ImageView

attrs.xml自定义属性学习笔记(自定义View2)

1. reference:参考某一资源ID.    (1)属性定义: <declare-styleable name = "名称"> <attr name = "background" format = "reference" /> </declare-styleable> (2)属性使用: <ImageView android:layout_width = "42dip" andro

Android自定义控件系列案例【五】

案例效果: 实例分析: 在开发银行相关客户端的时候或者开发在线支付相关客户端的时候经常要求用户绑定银行卡,其中银行卡号一般需要空格分隔显示,最常见的就是每4位数以空格进行分隔,以方便用户实时比对自己输入的卡号是否正确.当产品经理或UI设计师把这样的需求拿给我们的时候,我们的大脑会马上告诉我们Android中有个EditText控件可以用来输入卡号,但好像没见过可以分隔显示的属性或方法啊.当我们睁大眼睛对着效果图正发呆的时候,突然发现当用户输入内容的时候还出现了清除图标,点击清空图标还可以清空用户

在.net中序列化读写xml方法的总结

在.net中序列化读写xml方法的总结 阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数组的做为数据成员的序列化 类型继承与反序列化 反序列化的实战演练 反序列化的使用总结 排除不需要序列化的成员 强制指定成员的序列化顺序 自定义序列化行为 序列化去掉XML命名空间及声明头 XML的使用建议 XML是一种很常见的数据保存方式,我经常用它来保存一些

mybatis入门基础(三)----SqlMapConfig.xml全局配置文件解析

阅读目录 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 二:properties属性 三:settings全局参数配置 四:typeAiases(别名)--重点掌握 五:typeHandlers(类型处理器) 六:mappers(映射配置) 回到顶部 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器) objectFactor

Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭【学习鸿洋_视频博客笔记总结】

学习鸿洋博客:http://blog.csdn.net/lmj623565791/article/details/39257409 学习鸿洋视频:慕课网视频 看看Android 高仿 QQ5.0 侧滑菜单效果 自定义控件实现效果: 技术上,继承HorizontalScrollView 加上自定义ViewGroup来实现: 1.onMeasure:决定内部View(子View)的宽和高,以及自己的宽和高 2.onLayout:决定子View的放置位置 3.onTouchEvent[监听动作] 自定

Android自定义控件之滑动开关

自定义开关控件 Android自定义控件一般有三种方式 1.继承Android固有的控件,在Android原生控件的基础上,进行添加功能和逻辑. 2.继承ViewGroup,这类自定义控件是可以往自己的布局里面添加其他的子控件的. 3.继承View,这类自定义控件没有跟原生的控件有太多的相似的地方,也不需要在自己的肚子里添加其他的子控件. ToggleView自定义开关控件表征上没有跟Android原生的控件有什么相似的地方,而且在滑动的效果上也没有沿袭Android原生的地方,所以我们的自定义

自定义控件——自定义视图属性

一.新建工程 二.创建类并继承View package com.example.l01myrect; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; /** * Created by 袁磊 on 2017/2/6. */ public class MyRect extends View