Android 批量设置监听器,监听器传递参数,重写监听器构造函数

这个问题困扰了我好几天,就在我做的课程表应用中,每个页面有15个TextView,每个都要设置监听器,但是这还不是难事,难的是,用匿名内部类实现监听借口的时候,还要再在里面设置监听器!简而言之,TextView长按变为EditText,EditText点击完成之后把值传回TextView,这一个地方需要两个监听器。

我最早的实现方法是(mon_tv[ ]是一个TextView数组,mon_et[ ]是一个EditText数组):

mon_tv[1].setOnLongClickListener(new OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

mon_tv[1].setVisibility(View.GONE);

mon_et[1].setVisibility(View.VISIBLE);

mon_et[1].setText(mon_tv[1].getText().toString());

mon_et[1].setOnEditorActionListener(new OnEditorActionListener() {

@Override

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

if (actionId == EditorInfo.IME_ACTION_DONE)  {

mon_et[1].setVisibility(View.GONE);

mon_tv[1].setVisibility(View.VISIBLE);

mon_tv[1].setText(mon_et[1].getText().toString());

}

return false;

}

});

return false;

}

});

这个好用,但是要连续写15个,如果更多岂不更麻烦,不可取,后来我想直接写在一个循环里,如下:

for(int i=0;i<15;i++){

mon_tv[i].setOnLongClickListener(new OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

mon_tv[i].setVisibility(View.GONE);

mon_et[i].setVisibility(View.VISIBLE);

mon_et[i].setText(mon_tv[i].getText().toString());

mon_et[i].setOnEditorActionListener(new OnEditorActionListener() {

@Override

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

if (actionId == EditorInfo.IME_ACTION_DONE)  {

mon_et[i].setVisibility(View.GONE);

mon_tv[i].setVisibility(View.VISIBLE);

mon_tv[i].setText(mon_et[1].getText().toString());

}

return false;

}

});

return false;

}

});

}

注意这回红色的地方报错,因为匿名内部类里面再次匿名内部类的时候要求i必须final类型,也就是不可变的,但是我的i必须得变啊!这样想来,不可行,只好作罢。

今天上机课,问助教,提示给我一个非常好的思路,就是Listener中传递参数,恍然大悟,给Listener传递一个参数,并重写构造函数,解决终极办法如下:

for(int i=0;i<15;i++){

mon_tv[i].setOnLongClickListener(new MyMonTvOnLongClickListener(i));

}

//周一,给tv初始化,并给et准备

private class MyMonTvOnLongClickListener implements OnLongClickListener{

private int temp;

public MyMonTvOnLongClickListener(int i) {

// TODO Auto-generated constructor stub

temp=i;

}

@Override

public boolean onLongClick(View v) {

System.out.println("调用Longclick: mon_tv_id="+temp);

mon_tv[temp].setVisibility(View.GONE);

mon_et[temp].setVisibility(View.VISIBLE);

mon_et[temp].setText(mon_tv[temp].getText().toString());

mon_et[temp].setOnEditorActionListener(new MyMonOnEditListener(temp));

return false;

}

}

//给et初始化

private class MyMonOnEditListener implements OnEditorActionListener{

private int temp;

public MyMonOnEditListener(int i) {

temp=i;

}

@Override

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

System.out.println("调用Editover: mon_tv_id="+temp);

if (actionId == EditorInfo.IME_ACTION_DONE) {

mon_et[temp].setVisibility(View.GONE);

mon_tv[temp].setVisibility(View.VISIBLE);

int a=judgeZSG("mon_tv["+String.valueOf(temp)+"]",mon_et[temp].getText().toString());

if(a!=4){

ManageSqlite(a,  "mon_tv["+String.valueOf(temp)+"]",  mon_et[temp].getText().toString());

}

mon_tv[temp].setText(mon_et[temp].getText().toString());

}

return false;

}

}

问题解决如此简单,话说我想了好几天,都准备去直接写十五遍了,其实不止,有15*5遍那么多。。这思路之前咋没想到过,在网上查阅到的相关资料也比较少,希望能够给别人带来灵感。

Android 批量设置监听器,监听器传递参数,重写监听器构造函数,布布扣,bubuko.com

时间: 2024-10-14 12:26:10

Android 批量设置监听器,监听器传递参数,重写监听器构造函数的相关文章

Android学习笔记——Activity之间传递参数

Intent i = new Intent(CurrActivity.this, AnotherActivity.class); i.putExtra("name", "这里可以传入各种常用数据类型,包括Bundle"); 在AnotherActivity中可以通过 getIntent()方法获取CurrActivity传过来的Intent i Intent i = getIntent(); String name = i.getStringExtra("

android传递参数的方法

Android由众多Activity组成,每个Activity对应不同的功能和UI,但是每个Activity都是一个单独的类,所以需要传递参数.一般来讲,Android中传递参数是在不同的Activity中.大致上有5类方案: 1 静态 static 定义方法: 1 public class MainActivity extends TabActivity { 2 public static DatabaseHelper mHelper; 3 public static SQLiteDataba

Android里的AdapterView中OnItemClickListener监听器四个参数的含义

对Android开发中的Adapter接口的onItemClickListener监听器四个参数(arg)的理解: 代码:public void onItemClick(AdapterView<?> arg0, View view, int position,long arg3){} 假如有一个listview,该listview中含a,b,c,d这4个item. 如果你点了b这个item.如下: (1)public  void onItemClick (AdapterView<?>

Android开发系列(十三):Intent实现Activity之间的转换以及startActivityForResult传递参数

一.Intent实现Activity之间的切换 1.构造函数法: Intent intent = new Intent(this , OtherActivity.class); //两个参数:第一个是上下文对象,第二个是要切换的Activity的class字节码 startActivity(intent); 2.setClass方法: Intent intent = new Intent(); intent.setClass(this, OtherActivity.class); //设置要激活

Android: 启动另外的APP及传递参数(转)

转载自:http://blog.csdn.net/iefreer/article/details/8812585 有时候需要从一个APP中启动另外一个APP,比如Twitter/微信等. 如果你不知道那个APP的Activity,但是知道包名(package name),那么可以使用如下的方法: [java] view plaincopy Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.packag

Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数(转)

Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragment时,为什么官方推荐Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?为了弄清这个问题,我们可以做一个测试,分别测试下这两种方式的不同 首先,我们来测试下通过构造方法传递参数的情况 public class FramentT

Android Handler之Message传递参数

最近发现Message,发送消息可以传递参数,这个思路很好,所以写了一个例子,点击屏幕,给Activity发送一个消息,传递两个参数,并把这个activity销毁掉! 程序打开界面: 点击屏幕,销毁activity弹出Toast: MainActivity: package com.cn.Android; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android

如何批量设置参数

一.什么是批量设置? 批量设置是将 已设置号的参数克隆(拷贝.覆盖)到其它号上. 二.操作方法 第1步:从一个已设置好的号上打开设置窗口,调好参数 每2步:点批量设置按纽 1)勾选项目 2)选择账号 3)点确定 每3步:点关闭 第4步:点设置窗口中的保存 完

Android开发之Fragment传递参数的几种方法

Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragment时,为什么官方推荐Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?为了弄清这个问题,我们可以做一个测试,分别测试下这两种方式的不同 首先,我们来测试下通过构造方法传递参数的情况 public class FramentT