1. 程式人生 > 其它 >記一次大半夜Android開發氣哭的過程

記一次大半夜Android開發氣哭的過程

技術標籤:從0開始學Android學習android studio

我踏馬Android開發到大半夜竟然直接氣哭。
震驚震驚震驚!!!
如我上篇部落格,activity中bottomnavigationview配合viewpager巢狀fragment使用時控制元件無法檢測到點選事件,用盡一切方法無果之後選擇曲線救國,通過recyclerview中viewholder繫結控制元件,讓recyclerview的每個item響應點選事件,這多蠢啊!但是我只能這樣做,作為一個程式設計師,如此曲線,真的很丟人,但是我卡了兩天,最後只能妥協如此去做,然後!還會有一系列的弊端,最後終於被我全部解決了之後,開始進行下一步工作!我發現,在很普通的佈局和activity中很普通控制元件還是會檢測不到點選事件,也就是說根本不在我上述描述中,所以無論我嘗試什麼方法都會失敗!為什麼我先前沒有發現這一點呢?因為我先前既看到初始的loginactivity實現了控制元件的點選監測(問題在於這裡用的是原始的方法,而後面失靈是因為用第二種方法直接給類引入了介面),又嘗試了兩種方法,但是我在使用具體控制元件設定點選事件監聽的時候並沒有取消類的監聽介面!(個人猜測可能原因在此,還能在哪呢!)所以我就這麼被帶的直接排除了問題根源!

那麼,我是怎麼解決問題的呢?
如上述,很普通的情況竟然重現問題,那我總不能全部用recyclerview來曲線救國,而且那樣太太太太太太太麻煩了,再加上我踏馬本來就不甘心,本來就屈辱,本來就煩,本來就想幹掉他,所以我心如死灰地一點點去排除任何一丟丟問題,哪怕是警告而不是錯誤,在我不斷的探索中,我發現如下三點:
① android:ADT14以後,不再支援使用R.id.XX作為constant使用,所以當使用switch case結構的時候,不提倡使用R.id.xx。所以switch case結構轉成if結構:

    @Override
    public void onClick(View view)
{ int vid = view.getId(); if (vid == R.id.consult_button){ //從資料庫查詢會員卡剩餘次數填入到numText裡 Toast.makeText(SubActivity.this, "點選查詢按鈕!", Toast.LENGTH_SHORT).show(); } if (vid == R.id.button_sub){ //edit次數減少一次 num--; numEdit.
setText("" + num); } if (vid == R.id.button_add){ //edit次數增加一次 num++; numEdit.setText("" + num); } if (vid == R.id.sub_button){ //彈窗確認,從資料庫扣除該會員卡edit中數目 } // switch (view.getId()) { // case R.id.consult_button: // //從資料庫得到會員卡剩餘次數填入到numText裡 // break; // case R.id.button_sub: // //edit次數減少一次 // num--; // numEdit.setText("" + num); // break; // case R.id.button_add: // //edit次數減少一次 // num++; // numEdit.setText("" + num); // break; // case R.id.sub_button: // //彈窗確認,從資料庫扣除該會員卡edit中數目 // break; // } }

連結: android:ADT14以後,不再支援使用R.id.XX作為constant使用.
但這沒有解決問題,也就是說這不是問題所在。
② 兩個xml檔案裡面控制元件的id不應該重名,我一點點修改全部id包括變數(這裡真的要告誡大家,一定要注意命名規範啊,我平時這一丟丟的強迫症已經很注意了,結果還是進了這個坑),問題依然沒有解決,也就是說這也不是問題根源。具體會有什麼後果我不想再去深究和探索了,有興趣的可以自己去嘗試一下。反正沒有報錯,只是警告。
哦對了,shift+F6以更換整個工程裡所有對應變數的名字是很好用的,但是重名問題理應一個檔案一個檔案的修改而不是整個工程,否則無論怎麼修改還是重名,這時候就要用到ctrl+r(替換),這個東西在這個時候就顯得多麼重要,先前懶不捨得搜,後來改名改的煩了,就去找了這個快捷鍵。
③ 最關鍵的點來了。AS4.1好像必須要用findviewbyid來繫結控制元件然後單獨給控制元件設定監聽事件。
在我最開始學Android開發的時候,還是很老實的用findviewbyid來繫結控制元件,然後一個控制元件一個控制元件的設定事件監聽,但是當我涉獵越來越多,我發現一些很棒的騷操作,比如直接引入介面然後直接重寫onclick方法來直接很有序的監聽所有控制元件,所以才會出現我上述的程式碼,也是這次問題的根本原因!誰踏馬能想到這麼好用的東西竟然有這麼噁心的弊端!先前用Android Studio3.6的時候還沒有發現這問題,也可能是我的一知半解誤打誤撞地避開了問題,但是現在用AS4.1真的是裂開了,當我開心的用先前的方法引入介面然後有序設定監聽事件的時候,竟然失靈了,其實我在檢查完大部分問題的時候是嘗試過用最老的方法的,先前的截圖可以為證!但是我當時好像偷懶沒有去掉介面,我就很自然地排除了答案!

    private void setOnClick() {
        consButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(SubActivity.this, "點選查詢按鈕!", Toast.LENGTH_SHORT).show();
            }
        });
        buttonSub.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //edit次數減少一次
                num--;
                numEdit.setText("" + num);
            }
        });
        buttonAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //edit次數增加一次
                num++;
                numEdit.setText("" + num);
            }
        });
        subButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }

改用最原始的方法之後就解決了問題。
真的,當成功的那一刻,真的眼淚就直接出來了,不是興奮,是憤怒,憤怒,怒不可遏的憤怒。