zoukankan      html  css  js  c++  java
  • 自定义组合控件

    先看效果

     

    如何实现这一自定义控件

    一:写出每个item的view,这里很明显是两个textview加一个checkbox

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="85dp"
        android:padding="10dp"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.test.MainActivity" >
    
        <TextView
            android:id="@+id/title1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="标题"
            />
    
        <TextView
            android:id="@+id/content1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/title1"
            android:layout_below="@+id/title1"
            android:layout_marginTop="16dp"
            android:text="内容" />
    
        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignTop="@+id/title1" 
             android:clickable="false"
             android:focusable="false"
             android:focusableInTouchMode="false"/>
        <View 
            android:layout_alignParentBottom="true"
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="#000"/>
    
    </RelativeLayout>

    第二步,创建一个MyView类继承Relativelayout类,并复写构造函数,其他先不写,后面再上代码

    第三步,我们考虑到,每个控件的两个textview内容都不一样,所以我们要给他们设置自定义属性,在value下创建attrs.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="MyView">
            <attr name="title" format="string" />
            <attr name="desc_on" format="string" />
            <attr name="desc_off" format="string" />
        </declare-styleable>
    </resources>

    第四步,写mainActivity对应的的xml,注意自定义属性的使用方法

    <LinearLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
         xmlns:xurui="http://schemas.android.com/apk/res/com.example.test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.test.MainActivity" >
    
       <com.example.test.MyView
           android:id="@+id/setting1"
           android:layout_width="match_parent"
           android:layout_height="85dp"
           xurui:title="自动更新设置"
           xurui:desc_off="自动更新已关闭"
           xurui:desc_on="自动更新已开启"/>
       
        <com.example.test.MyView
           android:id="@+id/setting2"
           android:layout_width="match_parent"
           android:layout_height="85dp"
           xurui:title="归属地查询设置"
           xurui:desc_off="查询已关闭"
           xurui:desc_on="查询已开启"/>
    
    </LinearLayout>

    第四步,回头再来写Myview类

    package com.example.test;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.CheckBox;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    public class MyView extends RelativeLayout {
        private static final String NAMESPACE = "http://schemas.android.com/apk/res/com.example.test";
        private TextView mtitle;
        private TextView mcontent;
        private CheckBox mcb ;
        String desc_off;
        String desc_on;
        public MyView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            Initview();
        }
    
        public MyView(Context context, AttributeSet attrs) {
            super(context, attrs);
            Initview();
            mtitle.setText(attrs.getAttributeValue(NAMESPACE,"title"));
             desc_off=attrs.getAttributeValue(NAMESPACE,"desc_off");
             mcontent.setText(desc_off);
             desc_on=attrs.getAttributeValue(NAMESPACE,"desc_on");        
        }
    
        public MyView(Context context) {
            super(context);
            Initview();
        }
        //初始化
        public void Initview() {
            View view=View.inflate(getContext(), R.layout.myview, null);
            mtitle=(TextView) view.findViewById(R.id.title1);
            mcontent=(TextView) view.findViewById(R.id.content1);
            mcb=(CheckBox) view.findViewById(R.id.checkBox1);
            this.addView(view);
        }
        //因为点击事件而状态改变
        public void Change(){
            //checkbox取反
            mcb.setChecked(!mcb.isChecked());
            //content改变
            if(mcontent.getText().equals(desc_off))
            mcontent.setText(desc_on);
            else{
                mcontent.setText(desc_off);
            }
        }
    
    }

    第五步,MainActivity中设置点击事件

    package com.example.test;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    
    public class MainActivity extends Activity {
        MyView setting1;
        MyView setting2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setting1 = (MyView) findViewById(R.id.setting1);
            setting2 = (MyView) findViewById(R.id.setting2);
            setting1.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    setting1.Change();
                }
            });
            setting2.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    setting2.Change();
                }
            });
        }
    
    }

    如果想要下次打开app记住上次的选择,可以添加使用SharedPreferences.

  • 相关阅读:
    两个layout之间怎么切换好
    测试- 就从这儿起步
    Fiddler 学习
    我的周记4——“要繁荣富强,不要再让人欺负了”
    谈谈游戏
    我的周记3——“雨打梨花深闭门,忘了青春,误了青春”
    我的周记2——“天道酬勤"
    说说Charles
    Book list
    STL学习笔记(仿函数)
  • 原文地址:https://www.cnblogs.com/xurui1995/p/5723021.html
Copyright © 2011-2022 走看看