1>创建复合控件
1.1>属性值类型声明
<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="MyCompoundView"><attr name="et_hint" format="reference|string"></attr><attr name="bt_text" format="reference|string"></attr></declare-styleable></resources>

1.2>复合控件布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><EditTextandroid:id="@+id/newItem_et"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"/><Buttonandroid:id="@+id/done_bt"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>

效果为:

1.3>复合控件代码
package com.demo.cxc.compoundview;import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;/*** Created by CXC on 15/4/12.*/
public class MyCompoundView extends LinearLayout {private EditText newItem_et;private Button done_bt;OnButtonClickListener buttonClickListener;public MyCompoundView(Context context) {super(context);init(null,0);}public MyCompoundView(Context context, AttributeSet attrs) {/*---注意调用的父类构造函数形式,如果使用super(context);在Activity中通过findFragmentById()or findFragmentByTag()时返回Null,进而使用该Fragment时会出现NullPointerException*/super(context,attrs);init(attrs,0);}private void init(AttributeSet attrs, int defStyles) {//使用布局资源填充视图LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);View view = layoutInflater.inflate(R.layout.compound_view_layout, this, true);//获得对子控件的引用newItem_et = (EditText) view.findViewById(R.id.newItem_et);done_bt = (Button) view.findViewById(R.id.done_bt);//获取设置的各个属性final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MyCompoundView, defStyles, 0);String newItem_et_hint = a.getString(R.styleable.MyCompoundView_et_hint);String done_bt_text = a.getString(R.styleable.MyCompoundView_bt_text);//设置属性值newItem_et.setHint(newItem_et_hint);done_bt.setText(done_bt_text);done_bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(buttonClickListener==null){return ;}//调用listenerbuttonClickListener.onButtonClick(newItem_et.getText().toString());newItem_et.setText("");}});}public void setOnButtonClickListener(OnButtonClickListener listener) {this.buttonClickListener = listener;}public interface OnButtonClickListener {public void onButtonClick(String newItemString);}}

2>使用该复合控件

2.1>布局
效果如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
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=".MainActivity">
<!--使用该组合控件-->
<!--xmlns:cv="http://schemas.android.com/apk/res/AndroidManifest文件中的package属性值"-->
<com.demo.cxc.compoundview.MyCompoundView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cv="http://schemas.android.com/apk/res/com.demo.cxc.compoundview"
android:id="@+id/new_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
cv:bt_text="@string/done_bt_text"
cv:et_hint="@string/new_item_et_hint"/>
<TextView
android:id="@+id/show_tv"
android:text="Show Text..."
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

其中Strings.xml如下:
<resources><string name="app_name">CompoundView</string><string name="action_settings">Settings</string><string name="done_bt_text">Done</string><string name="new_item_et_hint">Please input what you want to do ...</string>
</resources>

2.2>MainActivity代码

package com.demo.cxc.compoundview;import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;/*实现 MyCompoundView.OnButtonClickListener接口,以便实现相关操作*/
public class MainActivity extends ActionBarActivity implements MyCompoundView.OnButtonClickListener {private MyCompoundView new_item_cv;private TextView show_tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initViews();}private void initViews() {new_item_cv = (MyCompoundView) findViewById(R.id.new_item);if (new_item_cv == null) {Log.i("CXC", "***********Null---------");} else {new_item_cv.setOnButtonClickListener(this);}show_tv=(TextView)findViewById(R.id.show_tv);}@Overrideprotected void onResume() {super.onResume();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.menu_main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}@Overridepublic void onButtonClick(String newItemString) {//在这里进行显示操作show_tv.setText(newItemString);}
}
3>运行效果如下:

Android复合控件创建与使用Demo相关推荐

  1. Android Studio SVN配置忽略文件 1.用Android Studio创建一个项目,会在根目录和Module目录下自动生成.gitignore文件,貌似是Git的配置文件,

    Android Studio SVN配置忽略文件 1.用Android Studio创建一个项目,会在根目录和Module目录下自动生成.gitignore文件,貌似是Git的配置文件,和SVN没有关 ...

  2. Android 系统(207)---Android各种Drawable讲解和demo实例

    Android各种Drawable讲解和demo实例 转载自  : https://blog.csdn.net/linghu_java/article/details/42119969 PS:文字内容 ...

  3. Android手动创建和解析Json

    Android手动创建和解析Json 概述 现在Android开发中创建和解析Json大都是利用Gson.fastJson等可以映射对象的第三方库,确实非常方便,使用Gson解析可以参考我的另一篇文章 ...

  4. android studio创建md,如何在Android Studio中设置*md文件打开方式

    最近在Android Studio中写一些Demo的时候,会顺便在里面创建一个.md文件用来进行Demo笔记的书写.然而Android Studio不带有markdown预览功能,所以我就琢磨如何在A ...

  5. Android Studio创建项目

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010046908/article/details/47000873 创建项目 首先,先指出Andr ...

  6. 如何在android中创建自定义对话框?

    本文翻译自:How to create a Custom Dialog box in android? I want to create a custom dialog box like below ...

  7. Android字体占有内存,android随意创建字体对象引发的应用程序运行时占用内存过大...

    android随意创建字体对象引发的应用程序运行时占用内存过大 在实际开发android项目过程中,由于是初次设置android系统没有的字体,所以用到了一个外部文件FounderFineRoundS ...

  8. Android handler Thread 修改UI Demo

    /*********************************************************************** Android handler Thread 修改UI ...

  9. android工程创建,3.2.1 创建Android 项目(2)

    3.2.1 创建Android 项目(2) (3) Shape. None:只有图案,没有外框. Square:方形外框. Circle:圆形外框. (4) Background Color:设置背景 ...

最新文章

  1. eclipse 环境下 FreeMarker 编辑器插件
  2. 支持鸿蒙的手机型号多少钱,华为鸿蒙系统支持手机型号一览
  3. 深度学习英文文献_文献速递 | 预测术后30天死亡率的深度学习模型
  4. 分数线划定(信息学奥赛一本通-T1180)
  5. [Unity] 定义 Assembly 之后还要定义 Assembly Reference
  6. 【机器学习】图解最常用的10个机器学习算法!
  7. Kubesploit:针对容器化环境的跨平台后渗透利用工具
  8. vue项目运用繁体字
  9. python股票查询系统_使用Python查询股票所属行业
  10. 计算机图形图像设计构图的基本形式,设计构图的八大基本表现手法!你造吗?...
  11. 【基金学习】小白基金学习记录-从入门到实践(一)
  12. 转载:50有用的JavaScript和jQuery技术和插件
  13. Windows 10快速截图快捷键 (Windows徽标键+shift+S)
  14. Android谷歌地图地理编码,谷歌地图API地理编码多个地点
  15. Spring源码 - 从缓存中获取单例Bean
  16. jquery手机触屏滑动拼音字母城市选择器代码
  17. IDE 10 月指数榜:Eclipse 反超 Visual Studio
  18. 阿里云地域节点IP测试Ping值延迟测速(国内+海外)
  19. LoadRunner:Run-time-settings
  20. 惠普笔记本电池充不进电

热门文章

  1. node.js跨域问题
  2. redis pool
  3. requirejs使用笔记
  4. Jquery 提示插件
  5. 小熊维尼项目冲刺 第三天
  6. Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装
  7. 第二节 -- python的基础语法
  8. Android 基础概念了解
  9. 把docker当做绿色打包工具
  10. The Tao to Excellent