对于按钮或textview,不能使用for循环来设置setOnClickListener吗?

时间:2012-12-29 08:29:35

标签: android textview

我有很多可点击的textview /按钮。如果我必须键入:

,它只会使开发过程变得乏味
OnCreate... etc, etc.
    tvOutput0.setOnClickListener(this);
    tvOutput1....
    tvOutput2.....
    ...
    tvOutput100.setOnClickListener(this)

我尝试实现for循环

   tvOutputArray[] = {tvOutput0, tvOutput1,....TvOutput100}
   for(int i=0; i< tvOutputArray.length-1;i++){
         tvOutputArray[i].setOnClickListener(this);
   }
唉,它每次都会崩溃。我尝试这个。还有其他方法可以手动执行此操作(即输入每个单独的一个吗?

  12-29 08:42:58.120: ERROR/StrictMode(597): null
    android.app.ServiceConnectionLeaked: Service com.android.exchange.ExchangeService        has leaked ServiceConnection com.android.emailcommon.service.ServiceProxy$ProxyConnection@40cd0fb0 that was originally       bound here
    at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:969)
    at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:863)
    at android.app.ContextImpl.bindService(ContextImpl.java:1418)
    at android.app.ContextImpl.bindService(ContextImpl.java:1407)
    at android.content.ContextWrapper.bindService(ContextWrapper.java:473)
    at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:157)
    at com.android.emailcommon.service.ServiceProxy.setTask(ServiceProxy.java:145)
    at com.android.emailcommon.service.ServiceProxy.test(ServiceProxy.java:191)
    at com.android.exchange.ExchangeService$7.run(ExchangeService.java:1850)
    at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:551)
    at com.android.emailcommon.utility.Utility$2.doInBackground(Utility.java:549)
    at android.os.AsyncTask$2.call(AsyncTask.java:287)
    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
    at java.lang.Thread.run(Thread.java:856)

3 个答案:

答案 0 :(得分:1)

我认为你必须以编程方式使用创建Button / Textview

public class ActivityName extends Activity implements OnClickListener

{

 private static final int MY_BUTTON = 9000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
        LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayout2);
 
        // add text view
        TextView tv = new TextView(this);
        tv.setText("Dynamic Text!");
        ll.addView(tv);
 
        // add edit text
        EditText et = new EditText(this);
        et.setText("Dynamic EditText!");
        et.setMinLines(1);
        et.setMaxLines(3);
        ll.addView(et);
 
        // add button
        Button b = new Button(this);
        b.setText("Button added dynamically!");
        b.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        b.setId(MY_BUTTON);
        b.setOnClickListener(this);
        ll.addView(b);
 
        //add checkboxes
        for(int i = 0; i < 10; i++) {
            CheckBox cb = new CheckBox(this);
            cb.setText("Dynamic Checkbox " + i);
            cb.setId(i+10);
            ll.addView(cb);
        }
 
        //add radio buttons
        final RadioButton[] rb = new RadioButton[5];
        RadioGroup rg = new RadioGroup(this); //create the RadioGroup
        rg.setOrientation(RadioGroup.HORIZONTAL);//or RadioGroup.VERTICAL
        for(int i=0; i<5; i++){
            rb[i]  = new RadioButton(this);
            rb[i].setText("Dynamic Radio Button " + i);
            rb[i].setId(i);
            rg.addView(rb[i]); //the RadioButtons are added to the radioGroup instead of the layout
 
        }
        ll.addView(rg);//you add the whole RadioGroup to the layout
        
        // add Toggle button
        ToggleButton tb = new ToggleButton(this);
        tb.setTextOn("Dynamic Toggle Button - ON");
        tb.setTextOff("Dynamic Toggle Button - OFF");
        tb.setChecked(true);
        tb.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        ll.addView(tb);
 
    }
    
    public void onClick(View v) {
        Toast toast;
        Log.w("ANDROID DYNAMIC VIEWS:", "View Id: " + v.getId());
        switch (v.getId()) {
        case MY_BUTTON:
            toast = Toast.makeText(this, "Clicked on my dynamically added button!", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.TOP, 25, 400);
            toast.show();
            saveAnswers();
            break;
            // More buttons go here (if any) ...
 
        }
    
  }
}

&安培;你使用b.setOnClickListener(this)只是一次&amp;使用Id或标记访问Button / ToggleButton / textviews。

答案 1 :(得分:0)

 for(int i=0; i< tvOutputArray.length-1;++)
你忘记了i ++;

 for(int i=0; i< tvOutputArray.length-1;i++)

答案 2 :(得分:0)

我认为你正在尝试这样做:

// we need array of view's id
int [] viewIds = new int [] {R.id.tv1, R.id.tv2, R.id.bt1...};

// loop through ids, find view, set listener
for (int i = 0; i < viewIds.lenght; i++){
     View v = findViewById(viewIds[i]);
     if (v != null) {
         v.setOnClickListener(this);
     }
}