精华内容
下载资源
问答
  • 自定义控件组合控件

    2016-08-22 14:58:50
    自定义控件 组合控件的demo
  • 开发了 TreeList组合控件与TreeComboBOX组合控件 两种组合控件的应用,如需要源码 可以与本人联系
  • 自定义组合控件

    2016-05-20 00:19:19
    将多个控件组合再一起作为一个控件称为组合控件
  • Android组合控件

    2016-06-12 10:50:57
    简单的Android组合控件
  • Android 自定义组合控件 App标题栏 从基本的自定义控件讲起 及其系列文章
  • Android 组合控件,用自定义方式实现,非简单重写adapter。同时包含了点击事件的响应。
  • 主要介绍了Android自定义控件之自定义组合控件,重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,感兴趣的小伙伴们可以参考一下
  • 我们来讲一下自定义组合控件,相信大家也接触过自定义组合控件吧,话不多说,直接干(哈~哈~): 大家看到这个觉得这不是很简单的吗,这不就是写个布局文件就搞定嘛,没错,确实直接上布局就行,不过,我只是用这个...
  • android自定义组合控件

    2016-12-21 15:49:10
    android自定义组合控件
  • 主要介绍了Android组合控件实现功能强大的自定义控件的相关资料,需要的朋友可以参考下
  • 自定义组合控件MyTopBar
  • 自定义控件属性使用及属性详情;组合实现组合控件,奠定完全绘制自定控件前提。
  • 主要为大家详细介绍了Android自定义控件之创建可复用的组合控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 1.10 创建组合控件

    2018-09-20 16:05:38
    通过扩展通用的ViewGroup并添加所需的功能就能创建自定义的小部件。创建自定义小部件或可重用用户界面元素的最简单、最实用的方法就是利用Android SDK提供的现有小部件来创建组合控件
  • combox组合控件

    2013-01-20 16:26:00
    一个组合控件,既能够输入文字又能够下拉框形式选择,希望对各位有用!
  • 自定义组合控件topbar

    2016-07-21 09:10:26
    自定义组合控件topbar
  • 自定义控件-组合控件

    千次阅读 2016-06-10 02:42:39
    组合控件的使用方式1、新建控件类首先控件是一个Java类,如android.widget.TextView类、android.widget.LinearLayout类等,那么自定义控件时,也必须新建一个自定义控件的类。由于该自定义控件由多个现

    自定义控件

    当原生控件不能满足需要时,需要进行自定义控件,自定义控件可分为三种方式:

    • 对现有控件进行拓展
    • 通过现有控件的组合实现新的控件
    • 完全自定义一个新的控件

    组合控件的使用方式

    1、新建控件类

    首先控件是一个Java类,如android.widget.TextView类、android.widget.LinearLayout类等,那么自定义控件时,也必须新建一个自定义控件的类。由于该自定义控件由多个现有控件组合而来,该类通常继承一个合适的ViewGroup(ViewGroup可以包含子控件而View不可以),如LinearLayoutRelativeLayout 等。

    public class SettingItemView extends RelativeLayout {
        public SettingItemView(Context context, AttributeSet attrs) {
                super(context, attrs);
        }
    }

    选择构造方法时,应当选择带有AttributeSet attrs参数的构造方法,从attrs参数中可以获取到控件的属性。

    • 控件的属性:以TextView为例,android:layout_widthandroid:layout_heightandroid:textandroid:textSize等在XML文件中使用的,都是控件的属性。自定义控件时可以根据需要设置一些新的属性。


    2、新建XML文件

    自定义的控件由多个现有控件组合而来,那么就要在XML文件中设置这些现有控件的种类和布局。

    控件布局

    如图控件采用相对布局,组合了两个TextView和一个CheckBox。

    3、控件类加载XML文件

    使用如下代码将XML文件填充为View视图:

    View view = View.inflate(context, R.layout.setting_item, this);

    注意inflate方法第三个参数,设置当前视图的父节点:

    ViewGroup root:A view group that will be the parent.

    应该记得在ListViewAdapter继承BaseAdapter后实现getView方法中同样使用了这行代码,在Adapter中不需要指定每一个条目的父节点。所以传参数null:

    View view = View.inflate(context, R.layout.setting_item, null);

    在自定义控件类中,需要指定ViewGroup父节点,由于当前类SettingItemView类继承自RelativeLayout,那么也继承自ViewGroup,所以SettingItemView可以作为ViewGroup类型的父节点,那么就传入this。

    也可以使用如下代码,效果完全相同:

    View view = View.inflate(context, R.layout.setting_item, null);
    this.addView(view);

    此时新的自定义控件已经可以在Activity对应的XML布局文件中使用

    <com.test.myapplication.view.SettingItemView
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    </com.test.mobilesafe.view.SettingItemView>

    4、自定义属性

    如果新控件需要设置新的属性,那么在values包下新建attrs.xml文件,并写入如下代码:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="自定义控件类名">
            <attr name="自定义属性名1(eg:item_title)" format="该自定义属性值的类型1"/>
            <attr name="自定义属性名2(eg:item_updata_on)" format="该自定义属性值的类型2"/>
            <attr name="自定义属性名3(eg:item_updata_off)" format="该自定义属性值的类型3"/>
        </declare-styleable>
    </resources>

    自定义控件类名是否需要带上包名根据编译器提示决定吧 - -

    获得自定义属性值:在1、中提到过,自定义控件类的构造方法AttributeSet attrs即携带了自定义属性的值。可通过attrs.getAttributeValue方法获取。第一个参数为命名空间,第二个参数为属性名。即根据命名空间、属性名获取到属性值。

    定义属性的目的是通过属性来设置自定义的控件,所以下一步要将获取到的属性值设置到控件上,这里根据具体情况进行具体设置。例如自定义控件包含两个TextView,在布局文件中使用自定义的属性设置了TextView的默认显示文本,则需调用tv1.setText(attr1); tv2.setText(attr2);等进行设置。

    5、在布局文件中使用控件的自定义属性

    在布局文件中都可以看到这行代码指定了命名空间:

    xmlns:android="http://schemas.android.com/apk/res/android" 所以属性可以写成:

    android:id="@+id/siv_updata"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    那么在类似的,指定 xmlns:mywidget="http://schemas.android.com/apk/res-auto"后,自定义属性也可以类似设置:

    mywidget:item_title="何时升级"
    mywidget:item_updata_on="现在升级"
    mywidget:item_updata_off="今晚升级"

    其中mywidget可以任意设置,只需保证命名空间中和属性中的一致即可。


    • 疑问:为什么要指定命名空间:

    参考:《属性资源与Android命名空间》:http://my.oschina.net/u/255456/blog/519379

    简单解释:需要通过命名空间来指定使用哪一个R文件。
    使用attrs.xml自定义属性后,AndroidStudio会在R文件中生成相应属性的索引,在Android自身的R文件中并没有这个属性的索引。同样的,Android原生控件如TextView的属性在应用生成的R文件中没有,而在Android自身的R文件中有。

    public static final int SettingItemView_item_des_off = 2;

    应用生成的R文件                  Android自身

    左图为应用生成的R文件,含有自定义属性索引。
    右图为Android自身的R文件,不含有自定义属性索引。

    • 疑问: View view = View.inflate(context, R.layout.setting_item, this); 要指定ViewGroup root为this的原因?

      (待解决)

    • 动态添加组合控件:《Android群英传》- 3.6 节

    展开全文
  • 小火箭组合控件

    2016-03-14 22:57:52
    自定义控件系列三,组合控件,感兴趣的可以看看,欢迎交流
  • 自定义组合控件的步骤: 例如设置界面的某一条设置一般由两个TextView,一个checkBox和一个Viw(那条下面的分割线)组成的相对布局构成,而这个组合一般是比较常用的,可以考虑把他们做成一个自定义组合控件。 步骤...
    自定义组合控件的步骤:
    

    例如设置界面的某一条设置一般由两个TextView,一个checkBox和一个Viw(那条下面的分割线)组成的相对布局构成,而这个组合一般是比较常用的,可以考虑把他们做成一个自定义组合控件。

    步骤一:新建一个相对布局的文件update_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <!--该布局文件是一个自定义的控件,可看成是一个整体的控件,由多个控件组成-->
        <TextView
            android:id="@+id/tv_isUpdate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30sp"
            android:textColor="#000000"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="10dp"
            android:text="@string/tv_isUpdate_text"/>
        <TextView
            android:id="@+id/tv_isUpdate_state"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/tv_isUpdate"
            android:textSize="25sp"
            android:textColor="#808080"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="10dp"
            android:text="@string/tv_isUpdate_state_text"/>
        <!--将CheckBox的clickable属性和focusable的属性设为false的目的是放弃CheckBox自身的属性,因为CheckBox的获取焦点和可点击的优先级-->
        <!--在整个自定义控件中时最高的,因此放弃掉,而只是把CheckBox作为整个自定义控件的一个普通的部分看待,但是保留了勾选和非勾选的样式,为了-->
        <!--提示用户-->
        <CheckBox
            android:id="@+id/ck_checkbox"
            android:clickable="false"
            android:focusable="false"
            android:layout_alignParentRight="true"
            android:layout_marginRight="20dp"
            android:layout_centerVertical="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <View
            android:id="@+id/view_line"
            android:layout_below="@id/tv_isUpdate_state"
            android:layout_width="fill_parent"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_height="1dp"
            android:background="#808080"/>
    
    </RelativeLayout>

    步骤二:新建一个类CustomRelativeLayoutView继承RelativeLayout,在CustomRelativeLayoutView的构造方法中,将刚才自定义的MyRelative.xml文件填充到我自定的MyRelativeView中,View.inflate(context,MyRelative.xml的id,MyRelativeView填充目标);这个方法第三个参数就是填充目标; 这样我定义的xml布局文件就填充到我定义的类中了,我这个类就是我定义的xml文件的样式。假如在组合控件中有一个CheckBox,想实现点击组合控件的任意位置都可以实现选中和取消CheckBox的方法:
    思路将CheckBox与这个组合控件整体实现同生共死:在MyRelativeView.java中写一个boolean isChecked();和void setChecked()方法,方法体都是CheckBox的isChecked()方法和setChecked()方法。然后给这个组合控件一个单机事件实现

    public class CustomRelativeLayoutView extends RelativeLayout {
    
        private CheckBox ck_checkBox;
        private TextView is_update_state;
    
        private void initView(Context context) {
            View.inflate(context, R.layout.update_item, CustomRelativeLayoutView.this);
            ck_checkBox = (CheckBox) this.findViewById(R.id.ck_checkbox);
            is_update_state = (TextView) this.findViewById(R.id.tv_isUpdate_state);
        }
        public CustomRelativeLayoutView(Context context) {
            super(context);
            initView(context);
        }
    
        public CustomRelativeLayoutView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView(context);
        }
    
        public CustomRelativeLayoutView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initView(context);
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public CustomRelativeLayoutView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            initView(context);
        }
    
        /**
         * 将checkBox的选中与否的状态赋予当前自定义控件,
         * 使当前控件与checkbox看成一个整体
         */
        public boolean isChecked(){
            return ck_checkBox.isChecked();
        }
    
        /**
         * 给当前控件设置是否选中状态,其实就是给CheckBox设置是否选中状态。
         * @param boo
         */
        public void setChecked(boolean boo) {
            ck_checkBox.setChecked(boo);
        }
    
        /**
         * 是否启用更新的结果
         * @param text
         */
        public void setIsUpdateState(String text){
            is_update_state.setText(text);
        }
    }


    步骤三:要在某个布局文件中引用我自定的布局文件,就可以引用CustomRelativeLayoutView.java的全类名就行了,可以在指定一下宽高;也就是说此时这个全类名的控件就可以被看成普通的控件来操作了,例如定义一个id,再在activity中findViewById()等等
    试试,在xml布局文件中引用自定义控件时,执行了自定义控件的哪个构造方法,其实是一般执行两个参数的构造方法

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="60dp"
            android:gravity="center"
            android:textSize="30sp"
            android:background="#A52A2A"
            android:text="@string/tv_setting_text"/>
        <com.mycompany.mysimple.customrelativelayout.CustomRelativeLayoutView
            android:id="@+id/custom_relative"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    步骤四:Activity中的单击事件

    public class CustomRelativeLayoutActivity extends FragmentActivity implements View.OnClickListener{
    
        private CustomRelativeLayoutView custom_relative;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_customrelativelayout);
            custom_relative = (CustomRelativeLayoutView) findViewById(R.id.custom_relative);
            custom_relative.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.custom_relative:
                    if(custom_relative.isChecked()){
                        custom_relative.setChecked(false);
                        custom_relative.setIsUpdateState("自动更新已关闭");
                    }else{
                        custom_relative.setChecked(true);
                        custom_relative.setIsUpdateState("自动更新已开启");
                    }
                    break;
                default:
                    break;
            }
        }
    }


    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 120,074
精华内容 48,029
关键字:

组合控件