Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 批量設置監聽器,監聽器傳遞參數,重寫監聽器構造函數

Android 批量設置監聽器,監聽器傳遞參數,重寫監聽器構造函數

編輯:關於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遍那麼多。。這思路之前咋沒想到過,在網上查閱到的相關資料也比較少,希望能夠給別人帶來靈感。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved