(轉).net開發人員對android第二周的學習體會

來源:互聯網
上載者:User

標籤:android   分頁控制項   style   blog   http   color   使用   os   

這一周相對沒有春節時這麼閑了,白天也比較多的工作要做,每天晚上又要被我三歲的女兒折騰到十點, 實在沒有多少時間學習。在前一周的基礎上,這周我試著自己練習寫了一個個人管理的android的程式,主要實現萬年曆,議程,隨手便貼,簡訊群發等一些功能。下面總結一下自己在其過程中的一些心得和體會,都是一些沒技術含量的活,我唯寫下自己的思路,不貼具體的代碼了。苦於周圍沒有人可交流,大部分功能都是自己閉門造車或參考網上的資料實現,也不知道是否合理,望高手能加以指正。

1.   頁面配置技巧

頁面配置是android開發比較重要的一部分,相對PC程式,由於手機的屏少,要想讓使用者有好的體驗,UI設計就更為重要了。相對.net中的form,android的頁面設計也更為複雜。最開始我是直接試著在layout中畫了幾個控制項,位置和大小也是固定的,結果一到摸似器中,介面全亂了。後來才摸索出一些布局組件的用法。

  • LinearLayout和RelativeLayout。

這兩個應該是最常用的兩個布局組件了。LinearLayout一般用來把介面分成幾部分,可以設定它的orientation,指定它是橫向還是縱向的。RelativeLayout是一個相對布局的組件,非常好用的一個組件。它裡面的控制項都可以隨意設定相對位置,可以是相對於相鄰的控制項(layout_toLeftOf等),也可以是相對其父控制項RelativeLayout(layout_alignParentLeft等)。相對父控制項特別有用,比如有時我們需把一個控制項靠底部,就可以使用layout_alignParentBottom.

整個頁面的布局,通常是一個大的LinearLayout,把頁面分成幾部分,比如上中下。然後再根據需要,每個部分放一個RelativeLayout,再在其中放子控制項,並設定好相對的位置。

  • Drawable資源,我感覺是非常有用的一個東東,很類似web開發中的css。我們可以為一個控制項指定一個drawable,它一般放在res/drawable中。特別是其中有一個中,可以設定一個控制項的動態狀態,比如一個按鈕禁用的顏色,正常的顏色,按下時的顏色。
  • 動態設定控制項的高度和寬度。

Android中好象並沒有直接在程式中給控制項設寬和高的屬性,需要用到LayoutParams,比如

              LinearLayout.LayoutParams param = (LinearLayout.LayoutParams)textView.getLayoutParams();

              param.width = colWidth;

              param.height = colHeight;

              textView.setLayoutParams(param);

  •  動態設定控制項的上下左右表徵圖。

這個可是.net中的控制項沒有的很cool的功能,我們可以為控制項的上下左右四個方向添加不同的表徵圖,並且在程式中動態改變。

       Drawable dw_left = getResources().getDrawable(R.drawable.schedule_type);

       dw_left.setBounds(0,0,dw_left.getMinimumWidth(), dw_left.getMinimumHeight());

       textView.setCompoundDrawables(null, null, dw_left, null);

2.   自訂控制項wedgit

初學者不要一看到要自己寫一個控制項,就覺得很難。其實在android中還是很好實現的。有時我需要把一些控制項加一些表徵圖,或者邊框之類,它本身的屬性不能實作類別似功能。我們只要簡單的把原有的控制項簡單封裝一下。比如我要用到帶邊框的EditText,EditText本身屬性是不能加邊框的,我們可以簡單的寫一個擴充的EditText類,這裡主要用到onDraw(Canvas canvas)方法。我們在子類中重載這個方法,可以為控制項畫一些邊框之類。

    protected void onDraw(Canvas canvas) {

        // TODO Auto-generated method stub

        super.onDraw(canvas);

        Paint paint = new Paint();

        paint.setStrokeWidth(1);

        paint.setStyle(Style.STROKE);

        paint.setColor(android.graphics.Color.Blue);

        paint.setAntiAlias(true);

        RectF rectF = new RectF(2,0,this.getWidth()-2,this.getHeight()-2);

        canvas.drawRoundRect(rectF, 8, 8, paint);

    }

3.   GridView和ListView的提示

GridView和ListView是使用最多的多資料呈現控制項,我們已經知道它通常重載一個Adapter類還實現資料繫結。利用這個Adapter,我們可以實現很多很炫的功能。

  •  設定選中項的背景或改變選中項中的控制項狀態

我想到兩個方法去實現這種效果,具體哪個更好,由於沒有實際的開發經驗,我也不太清楚,望高手指點。

a)在Grid中onItemClick事件中實現。onItemClick(AdapterView arg0, View arg1, int arg2,long arg3)有四個參數,我們常用到的是第二和第三參數。Arg1,指的是這個子項的View,通過它,我們可以得到相應的子控制項。Arg2,是指當前項在列表中的位置。

我們要改變當前選定項的狀態,當然也要恢複上一個選定項的狀態,這樣我們需要一個頁面級的中間臨時變數,把上一個選定項儲存起來。比如下面的代碼就是把當前選定項中的一個textview的下方,加一個表徵圖。

public void onItemClick(AdapterView arg0, View view, int position,long arg3) {

       Drawable dw_left = getResources().getDrawable(R.drawable.date_convert);

       dw_left.setBounds(0,0,dw_left.getMinimumWidth(), dw_left.getMinimumHeight());

       TextView textView = (TextView) view.findViewById(R.id.tvtext);

       textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, dw_left);

       if(lastSelectedCol != null){

              lastSelectedCol.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);

       }

       lastSelectedCol = textView;

}

b) 在Adapter中實現。onItemClick事件我們還是要利用到的,這次我們要利用它的第三個參數arg2,即當前項在列表中的位置。   

       首先我們要給Adapter設一個屬性,以便把這當前項的位置傳給Adapter。

              public void setSelectedCol(int position){

              selectedCol = position;

       }

       得到了選定項的位置後,我們就可以在Adapter的getView方法中處理了。處理的方法跟上面的一樣了,先得到控制項,再作相應處理。

              if(selectedCol == position){

                     //處理控制項

              }

       最後在grid的onItemClick事件中,我們別忘了用myAdapter.notifyDataSetChanged方法去重新整理控制項。

  •  動態改變GridView或ListView中每項的表徵圖

比如要做一個類似iphone中簡訊的功能,點擊編輯按鈕,列表中所有的簡訊的左邊都顯示一個操作表徵圖,點這個操作表徵圖,右邊就會增加一個刪除按鈕,再點刪除按鈕,刪除當前項。這裡不貼詳細的代碼了,只是總結一下實現要點:

a. Adpater要加一個屬性,指明當ListView是在可編輯狀態還是唯讀狀態。

    public void setEdit(boolean edit){

    this.isEdit = edit;

 }

b. Adpater中的getView方法中,根據這個isEdit屬性去判斷是否顯示左邊的表徵圖,並是否添加相應事件。

c. 父頁面的編輯按鈕click事件中,動態設定Adpater中的isEdit的值。

4.   ListView的滾動式載入頁

Android雖然沒有像.net中的分頁控制項,但分頁顯示資料的功能很好實現。我們只要在onScroll事件中判斷listview是否滾動底部了if (firstVisibleItem + visibleItemCount == totalItemCount),然後在到底部時,動態改變資料來源,增加資料來源的項就行了。

如果取的是SQLite的資料,由於速度很快,我們可以直接載入。別忘了SQLiteDatabase的query方法是可以分頁取數的。

如果取的是網路,可能要用到非同步,在取數的同時,我們可以用一個控制項顯示“正在載入”。載入完後,再隱藏該控制項。

5.   Tab控制項中的子Activity的跳轉

程式的頂部或底的Tab控制項是用得比較多的功能,很多程式都要底部有多tab,點不同的tab跳轉到不同的功能模組。Android也有一個叫TabHost的控制項實現該功能。具體的實現很簡單,要用到TabActivity。自己的activity 需要extents TabActivity。

在使用的過程中,我發現一個問題,比如我一個Main頁面,上面用到了一個tab ,點第二項開啟的是A頁面,然後我要從A頁面跳轉到B頁,B頁面完成操作後再返回A頁面,這時問題來了,A頁面由於是main頁面的一個子頁面,我需要下部是一直顯示Tab的,但在B頁面用intent到A頁面後,下面的Tab不見了。我如果從B頁面返回到main頁面,這樣預設開啟的就不是A頁面了。這個問題開始困惑我好久,會來在網上找到一個方法,把main頁面的Tabhost控制項設成一個全域的靜態變數,這樣在B頁面運行返回到main頁面的代碼後面,再加上MainActivity.tabHost.setCurrentTab(1),這樣main頁面開啟的同時,又會指向A頁面了。

上面的問題解決後,又來一個新的問題,本來A頁面是一個子頁面,下面是顯示了首頁的Tab的,如果我從A頁跳轉到B頁面,想要B頁面也保留下面的tab,這應該怎麼實現呢?在網上找了很久,才發現一個用GroupView實現的列子。它使用的是一個ActivityGroup頁面。這裡稱它為BaseGroup頁面。在main頁面的tab選項中,點擊開啟的BaseGroup頁面,再通過BaseGroup跳轉到A頁面。具體參考下面的文章。

http://hkp.iteye.com/blog/1185482

6.   非同步擷取網路資料

非同步擷取網路資料通常有兩種方式,使用Handler+線程或AsyncTask方法,兩種方法我都只是做了簡單的實驗,感覺Handler+線程思路更清晰,初學者更容易掌握。具體的實現可以參考下面的文章,寫得非常詳細。

http://www.cnblogs.com/JerryWang1991/archive/2012/03/09/2388312.html

7.   兩周的總結

通過兩周的學習,總的感覺android的開發是比較好上手的,它要用到的知識面的廣度應該還比不上.net的項目開發。用一兩周的時間,完全可以比較輕鬆的掌握基本和常用的一些技巧,並做一些實際的開發了。

對於學習資源,我建議是直接看android的官方網站,特別是一些API的說明。每使用一個控制項或功能前,應該首先看看它的API說明,大概的瞭解它有哪些方法和屬性,這樣就比較清楚的知道它能幹些什麼了,是否能滿足你的需要了。

看別人的代碼或sample代碼,是一個很好的學習方式。Android是一個開放的平台,在網上也可以找到很多的代碼。但是要真正把它變成自己的東西,無它,還是要自己試著動手,just do it!

有時間希望能跟大家更多的交流,祝好運......

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.