关于Android里自定义属性的使用网上已经有很多介绍了,比如: http://gundumw100.iteye.com/blog/1040917 在Button组件里有android:onClick属性,其值是点击Button时触发的方法的名称。我这里想说的就是添加这种属性方法的方法。 比如我们现在有这样一个自定义组件:

它是由一个TextView,一个SeekBar,再加一个TextView组成: //aq_mic_seekbar.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mic_seekbar" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:gravity="center" android:background="#ff0000" > <TextView android:id="@+id/mic_seekbar_title" android:layout_width="100dp" android:layout_height="30dp" android:hint="title" android:gravity="center" android:background="#00ff00" /> <SeekBar android:id="@+id/mic_seekbar_seekbar" android:layout_width="200dp" android:layout_height="30dp" android:max="100" android:progress="50" /> <TextView android:id="@+id/mic_seekbar_value" android:layout_width="50dp" android:layout_height="30dp" android:hint="value" android:gravity="center" android:background="#00ff00" /> </LinearLayout> //AQmic_seekbar.java publicclassAQmic_seekbarextendsLinearLayout{ publicAQmic_seekbar(Contextcontext){ this(context,null); //TODOAuto-generatedconstructorstub } publicAQmic_seekbar(Contextcontext,AttributeSetattrs){ super(context,attrs); //TODOAuto-generatedconstructorstub LayoutInflater.from(context).inflate(R.layout.aq_mic_seekbar,this,true); } } //activity_main.xml

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <com.example.aqmic.AQmic_seekbar android:layout_width="500dp" android:layout_height="50dp"/> </RelativeLayout> //MainActivity.java publicclassMainActivityextendsActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } 现在我们为这个组件添加一个onSeekBarChange属性,其值是当组件里的SeekBar改变时触发的方法的名称。 //attrs.xml <?xmlversion="1.0"encoding="utf-8"?> <resources> <declare-styleablename="AQmic_seekbar"> <attrname="onSeekBarChange"format="string"/> </declare-styleable> </resources> 然后在我们的组件类文件里对该属性进行处理,这也是最关键的地方: //AQmic_seekbar.xml publicclassAQmic_seekbarextendsLinearLayout{ MethodmMethod; SeekBarmSeekBar; ContextmContext; publicAQmic_seekbar(Contextcontext){ this(context,null); //TODOAuto-generatedconstructorstub } publicAQmic_seekbar(Contextcontext,AttributeSetattrs){ super(context,attrs); //TODOAuto-generatedconstructorstub LayoutInflater.from(context).inflate(R.layout.aq_mic_seekbar,this,true); mSeekBar=(SeekBar)findViewById(R.id.mic_seekbar_seekbar); mContext=context; //获取onSeekBarChange属性的值 TypedArrayta=context.obtainStyledAttributes(attrs,R.styleable.AQmic_seekbar); CharSequenceonSeekBarChange=ta.getText(R.styleable.AQmic_seekbar_onSeekBarChange); try{ //根据方法名获取方法 mMethod=context.getClass().getMethod((String)onSeekBarChange,View.class); }catch(NoSuchMethodExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } mSeekBar.setOnSeekBarChangeListener(newOnSeekBarChangeListener(){ @Override publicvoidonProgressChanged(SeekBarseekBar,intprogress, booleanfromUser){ //TODOAuto-generatedmethodstub try{ //调用方法 mMethod.invoke(mContext,seekBar); }catch(IllegalArgumentExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IllegalAccessExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(InvocationTargetExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } publicvoidonStartTrackingTouch(SeekBarseekBar){} publicvoidonStopTrackingTouch(SeekBarseekBar){} }); ta.recycle(); } } 最后修改activity_main.xml,为我们的组件添加该属性,并在主Activity文件里实现该方法: //activity_main.xml <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:myspace="http://schemas.android.com/apk/res/com.example.aqmic" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <com.example.aqmic.AQmic_seekbar android:id="@+id/mySeekBar" android:layout_width="500dp" android:layout_height="50dp" myspace:onSeekBarChange="onMySeekBarChange" /> </RelativeLayout> //MainActivity.java publicclassMainActivityextendsActivity{ SeekBarmSeekBar; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } publicvoidonMySeekBarChange(Viewview) { mSeekBar=(SeekBar)view; mSeekBar.setProgress(mSeekBar.getMax()); } } 这样当SeekBar组件进度值发生改变时,其进度值就会变为最大了。

更多相关文章

  1. [置顶] Android中保存数据常用的方法
  2. Android(安卓)属性动画(Property Animation) 完全解析 (上)
  3. Android(安卓)简介及基础知识
  4. Android(安卓)自定义view组件
  5. Android获取网络图片并显示的方法
  6. http://www.jianshu.com/p/7e46fe7485bb
  7. Android五大布局详解——LinearLayout(线性布局)
  8. Android的程序关联和自定义类型文件的方法步骤和实现过程
  9. UI组件之TextView及其子类(一)TextView和EditText

随机推荐

  1. android 对软键盘的显示和消失监听
  2. 安装android studio 不能启动
  3. android图片上传springMvc
  4. TextInputLayout,让输入框更有灵性
  5. android kill package
  6. Android 常用的SDCARD和内存操作
  7. android > SDcard读写文件
  8. Android 读取本地txt文件和写入txt文件到
  9. Android os设备谎言分辨率的解决方案
  10. Android部分字体高亮