findviewbyid跟setOnClickListtener的简化

最近每天都要对button进行获取id然后再监听.

每次都要写


btn = (Button) findViewById(id);

btn.setOnClickListener(this);

btn1 = (Button) findViewById(id);

btn1.setOnClickListener(this);

btn2 = (Button) findViewById(id);

btn2.setOnClickListener(this);

btn3 = (Button) findViewById(id);

btn3.setOnClickListener(this);

.

.

.

100个你就不行了

就想要设置个方法进行简化.刚开始想法就是直接设置个方法.将button控件传入,id传入,  

/**
* 设置监听并找id

* @param btn
* @param id
*/
public void setOneMoreTwo(Button btn, int id) {
btn = (Button) findViewById(id);
btn.setOnClickListener(this);
}

这样的结果就是,将原来的2局转变成一句.后来想想100个还会变成50个啊.有什么办法就变成一个呢.??

setOneMoreTwo进行再次升级


 一次设想

public void setOneMoreTwo2(Button...btn,int...id){
for(int i ;i<btn.length;i++){

                        this.findViewById(id[i]);

btn[i].setOnClickListener(this);

} 
}

 

然后调用时使用

setOneMoreTwo2(btn1,btn2,btn3,btn4,R.id.btn1,R.id.btn2,R.id.btn3,R.id.btn4);

一行搞定.不过当我真的把这句话写到里面去的时候.却发现了   Button...btn  跟,int... id不能同时存在2个.那该怎么办呢..?


 请看.这!

既然不能同时存在2个,那只能将一组...可变参数数组变成全局变量.

 Button btn1, btn2, btn3, btn_share;
int button_id[];


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setOneMoreTwo1(R.id.btn_share, R.id.button1, R.id.button2, R.id.button3);
setOneMoreTwo2(btn_share, btn1, btn2, btn1);
}
public void setOneMoreTwo1(int... id) {
button_id = id;


}
public void setOneMoreTwo2(Button... btn) {


for (int i = 0; i < btn.length; i++) {
btn[i] = (Button) findViewById(button_id[i]);
btn[i].setOnClickListener(this);
}


}

 


然后调用的时候只要将想要接入的button加入数组


setOneMoreTwo1(btn1,btn2,btn3,btn4);

setOneMoreTwo2(R.id.btn1,R.id.btn2,R.id.btn3,R.id.btn4);

接下来就是使用这2个方法,按顺序对控件和id进行排列.

当然我这里全都是button,如果要其他空控件的话需要将 如下方法进行修改..

public void setOneMoreTwo2(Button... btn) {


for (int i = 0; i < btn.length; i++) {
btn[i] = (Button) findViewById(button_id[i]);
btn[i].setOnClickListener(this);
}

               Button...btn改成为Object...obj;就可以传入任何类型控件..


btn[i] = (Button) findViewById(button_id[i]);这一句就不能强转成Button了.而是需要用T(泛型)这个东西来进行替代.以至于

传入什么类型的控件就强转成什么类型的控件.....

具体泛型如何嵌入这个方法中.我还需要想想......


这是一篇新手笔记.别贱笑哦!!



此处奉上代码跟xml.

package com.example.sharedemo;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;


import com.luocaca.sharedemo.R;
 


/**
 * api分享 步奏: 1:判断是否授权, 2:授权成功后返回进行api分享
 * 
 * 
 * @author luocaca
 * 
 */
public class MainActivity extends Activity implements OnClickListener {


Button btn1, btn2, btn3, btn_share;
int button_id[];


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setOneMoreTwo1(R.id.btn_share, R.id.button1, R.id.button2, R.id.button3);
setOneMoreTwo2(btn_share, btn1, btn2, btn1);
}
public void setOneMoreTwo1(int... id) {
button_id = id;


}
public void setOneMoreTwo2(Button... btn) {


for (int i = 0; i < btn.length; i++) {
btn[i] = (Button) findViewById(button_id[i]);
btn[i].setOnClickListener(this);
}


}

/**
* 设置监听并找id

* @param btn
* @param id
*/
public void setOneMoreTwo(Button btn, int id) {
btn = (Button) findViewById(id);
btn.setOnClickListener(this);


}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
Toast.makeText(getApplicationContext(), "bt1", 0).show();
case R.id.btn_share:
Toast.makeText(getApplicationContext(), "share", 0).show();
break;
case R.id.button2:
Toast.makeText(getApplicationContext(), "btn2", 0).show();
break;
case R.id.button3:
Toast.makeText(getApplicationContext(), "btn3", 0).show();
break;


default:
break;
}
}


 
}




xml


<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="match_parent"
    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.sharedemo.MainActivity" >


    <Button
        android:id="@+id/btn_share"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="56dp"
        android:layout_marginTop="133dp"
        android:text="授权登录" />


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/btn_share"
        android:layout_centerVertical="true"
        android:text="Button1" />


    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/button1"
        android:layout_below="@+id/button1"
        android:layout_marginTop="17dp"
        android:text="Button2" />


    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/button2"
        android:layout_below="@+id/button2"
        android:text="Button3" />


</RelativeLayout>








基于现在有点激情.我又把T(泛型也给写了.就一句话.跟原来的一模一样)

由方法转变一下就好了

public void setOneMoreTwo2(Button... btn) {


for (int i = 0; i < btn.length; i++) {
btn[i] = (Button) findViewById(button_id[i]);
btn[i].setOnClickListener(this);
}



}

变为↓↓↓↓↓↓↓↓↓

public <T> void setOneMoreTwoT(T... t) {
for (int i = 0; i < t.length; i++) {
t[i] = (T) findViewById(button_id[i]);
((View) t[i]).setOnClickListener(this);
}
};


直接替代原文中的setOneMoreTwo2方法变为setOneMoreTwoT方法.就完成了任意控件传入都可以进行自动转化.,,,,,,,,,,,


哈哈.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值