博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 自定义组合控件
阅读量:6914 次
发布时间:2019-06-27

本文共 5985 字,大约阅读时间需要 19 分钟。

一:需要的效果如下图所示:可以动态设置提醒数,如果提醒数小于1则不显示红色提醒图标。

在点击每一个Button时,同时改变字体颜色与背景颜色以及将红色提醒去掉,如下图所示:

二:实现原理:通过继承LinearLayout进行扩展,自定义复合控件。

在创建复合控件时,必须对他包含的视图布局、外观以及交互进行定义。一般来说,复合控件是通过扩展一个ViewGroup来创建。

(1)定义一个类如WzhAlertLlBtn.java使其继承LinearLayout,代码如下:

public class WzhAlertLlBtn extends LinearLayout{    TextView alertTitle;    //设置标题    TextView alertCount;    //设置是否有提醒消息        /**     * 重写父类的构造函数,使自定义控件可以在xml布局文件中直接使用     * @param context     * @param attrs     */    public WzhAlertLlBtn(Context context, AttributeSet attrs){        super(context,attrs);                //使用自定义布局资源填充视图        LayoutInflater li = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);        li.inflate(R.layout.view_wzh_alert_ll_btn, this, true);                //获取对自控件的引用        alertTitle = (TextView)findViewById(R.id.alertTitle);        alertCount = (TextView)findViewById(R.id.alertCount);    }        /**     * @MethodName setAlertTitle      * @Description 设置标题     * @Param @param title     * @Return void     * @Throws     */    public void setAlertTitle(String title){        alertTitle.setText(title);    }        /**     * @MethodName setAlertCount      * @Description 设置是否存在提醒     * @Param @param count     * @Return void     * @Throws     */    public void setAlertCount(int count){        alertCount.setText(String.valueOf(count));        if(count>0){            alertCount.setVisibility(View.VISIBLE);        }else{            alertCount.setVisibility(View.GONE);        }    }}

(2)填充布局文件view_wzh_alert_ll_btn.xml 每一项的布局。

三:样式布局文件:

(1)android:textColor="@drawable/btn_text_color"  当点击控件时改变标题颜色,代码如下:

其中android:color的值在colors.xml文件中,内容如下:

#000000
#FFFFFF
#ccc

(2)android:background="@drawable/ic_alert_info"  是一个九妹格式的红色图片。

(3)android:background="@drawable/btn_go_right_bg"  控件右侧的箭头,默认是灰色点击后变成白色,内容如下:

 

四:使用自定义复合控件。

(1)fragment_alert_and_emails.xml

    在使用自定义复合控件时,一定要对控件设置layout_width与layout_height属性。每一种组合都是包含在LinearLayout中,

并设置其 android:background="@drawable/set_ll_bg",set_ll_bg.xml内容如下:背景色设置为白色,边框为灰色,圆角为8dp。

 

对于 com.wzh.view.WzhAlertLlBtn 的 android:background 样式一共四种:

alter_ll_top_bg:表示头部第一个,当一组大于一个时才使用到;
alter_ll_middle_bg:标示介于top与bottom之间的内容样式,当一组大于两个时才使用到;
alter_ll_bottom_bg:表示底部最后一个,当一组大于一个时才使用到;
alter_ll_one_bg:表示只一组有且只有一个时使用; (2)alter_ll_top_bg.xml
alter_ll_top_bg_click.xml(点击时的样式)
alter_ll_top_bg_normal.xml (默认样式)

其他三种布局文件依次类推,不再一一赘述。

(3)在AlertAndEmailsActivity.java中操作。

public class AlertAndEmailsActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_alert_and_emails);        if (savedInstanceState == null) {            getFragmentManager().beginTransaction()                    .add(R.id.container, new PlaceholderFragment()).commit();        }            }        /**     * A placeholder fragment containing a simple view.     */    public static class PlaceholderFragment extends Fragment {        WzhAlertLlBtn wzhTest1;        WzhAlertLlBtn wzhTest2,wzhTest3;        WzhAlertLlBtn wzhTest4,wzhTest5,wzhTest6;                public PlaceholderFragment() {}                @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container,                Bundle savedInstanceState) {            View rootView = inflater.inflate(R.layout.fragment_alert_and_emails, container, false);                                                //wzhTest1            wzhTest1 = (WzhAlertLlBtn)rootView.findViewById(R.id.wzhTest1);            wzhTest1.setAlertTitle("自定义测试1");            wzhTest1.setAlertCount(1);            wzhTest1.setOnClickListener(btnOnClickListener);                        //wzhTest2            wzhTest2 = (WzhAlertLlBtn)rootView.findViewById(R.id.wzhTest2);            wzhTest2.setAlertTitle("自定义测试2");            wzhTest2.setAlertCount(2);            wzhTest2.setOnClickListener(btnOnClickListener);            //wzhTest3            wzhTest3 = (WzhAlertLlBtn)rootView.findViewById(R.id.wzhTest3);            wzhTest3.setAlertTitle("自定义测试3");            wzhTest3.setAlertCount(3);            wzhTest3.setOnClickListener(btnOnClickListener);                        //wzhTest4            wzhTest4 = (WzhAlertLlBtn)rootView.findViewById(R.id.wzhTest4);            wzhTest4.setAlertTitle("自定义测试4");            wzhTest4.setAlertCount(4);            wzhTest4.setOnClickListener(btnOnClickListener);            //wzhTest5            wzhTest5 = (WzhAlertLlBtn)rootView.findViewById(R.id.wzhTest5);            wzhTest5.setAlertTitle("自定义测试5");            wzhTest5.setAlertCount(5);            wzhTest5.setOnClickListener(btnOnClickListener);            //wzhTest6            wzhTest6 = (WzhAlertLlBtn)rootView.findViewById(R.id.wzhTest6);            wzhTest6.setAlertTitle("自定义测试6");            wzhTest6.setAlertCount(6);            wzhTest6.setOnClickListener(btnOnClickListener);                                                            return rootView;        }                OnClickListener btnOnClickListener = new OnClickListener(){            @Override            public void onClick(View arg0) {                wzhTest1.setAlertCount(0);            }        };    }}

 

转载地址:http://voncl.baihongyu.com/

你可能感兴趣的文章
嵌套查询
查看>>
python-Levenshtein几个计算字串相似度的函数解析
查看>>
shipyard, swarm看到你,我才睡觉:)
查看>>
hdu 4409 Family Name List(LCA&有坑点)
查看>>
Linux内核之于红黑树and AVL树
查看>>
JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理...
查看>>
Python 面向对象
查看>>
JAXB xml与javaBean的转换
查看>>
ResultSet 的Type属性 TYPE_FORWARD_ONLY, TYPE_SCROLL_I
查看>>
C#多线程--线程池(ThreadPool)
查看>>
Android FileProvider相关 Failed to find configured root that contains
查看>>
【Win 10 应用开发】UI Composition 札记(七):基于表达式的动画
查看>>
Log4j中为什么设计isDebugEnabled()方法
查看>>
工作文件夹分类
查看>>
ReactNative WebView组件详解
查看>>
iOS -- 拨打电话
查看>>
模仿CyclicBarrier,自定义自己屏障类
查看>>
Vue+Vue-router微信分享功能
查看>>
1.数码相框-相框框架分析(1)
查看>>
Javascript中的原型继承具体解释
查看>>