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