編輯:關於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遍那麼多。。這思路之前咋沒想到過,在網上查閱到的相關資料也比較少,希望能夠給別人帶來靈感。
在上篇文章給大家介紹了仿餓了嗎點餐界面兩個ListView聯動效果主要實現了2個ListView怎樣實現互相關聯,正好上篇博客review了ListView控件常規使用,
本文是想總結一些Android Studio的使用技巧,對於大多數習慣了使用eclipse的人來說,可能會需要一段時間,但是如果看過下面的一些介紹,你就能體會到Andr
一、資源管理器介紹現在在一些移動終端上面都會有自帶的資源管理器,其實其並非是Android系統自帶,而是手機產商與app開發商的合作而導致融合,借助第三方的開發軟件預裝在
開門見山:這裡給出rk 在cameraHAL層的camera數據結構:typedef struct FramInfo{ int phy_addr; int v