2012年5月17日 星期四

數據存儲 in Android - 使用 SharedPreferences

目的: 簡單和快速的儲存數據 使用上感覺像簡易版wp7的IsolatedStorage

範例:


2012年5月15日 星期二

Intent and Intent Filter in Android

內容涵蓋:
1.在App中開啟另一個App
2.了解Intent-Filter的使用

參考:
http://developer.android.com/reference/android/content/Intent.html
http://developer.android.com/guide/topics/intents/intents-filters.html


首先從Intent說起

先看一下官方文檔:


  • Explicit Intents have specified a component (via setComponent(ComponentName) or setClass(Context, Class)), which provides the exact class to be run. Often these will not include any other information, simply being a way for an application to launch various internal activities it has as the user interacts with the application.
  • Implicit Intents have not specified a component; instead, they must include enough information for the system to determine which of the available components is best to run for that intent.



  • 可以看到Intent分為兩個種類
    一種為  Explicit Intents
    另一種為  Implicit Intents

    查一下英文字典:
    Explicit  adj. 明顯的
    Implicit  adj. 暗示的

    從文檔可看出 Explicit Intent 使用方式很明確 就是指定 component 讓系統去調用
    而 Implicit Intent就是提供"資訊", 讓系統決定去調用哪個component


    本文要講的重點是第二種: Implicit Intent

    而要了解Implicit Intent必須先了解 Intent-Filter
     Intent-Filter由三個元素組成
    1.action
    2.category
    3.data
    而從Filter本身的含意 : 過濾,篩選
    可以判斷 Intent-Filter可以指定上列三種元素的屬性
    進而讓符合條件的Intent通過, 進而執行該Activity or Service or..
    因此可以得知 Implicit Intent 要提供的資訊就是上面這三種


    如果寫過打電話的功能,  一定看過以下代碼



    Intent _Intent = new Intent();
    _Intent.setAction(Intent.ACTION_DIAL);
    _Intent.setData(Uri.parse("tel:0123456789"));
    startActivity(_Intent);



    而其中的 Intent.ACTION_DIAL   中就是Android中撥號的Activity中所指定的Action


    那如何使用自己的Action呢?
    以下為代碼


    <activity
         android:name=".intent.IntentDemoActivity"
         android:label="@string/app_name" >
         <intent-filter>
              <action android:name="maca.demo.GOTO_INTENT" />
              <category android:name="android.intent.category.DEFAULT" />
         </intent-filter>
    </activity>


    指定action為"maca.demo.GOTO_INTEN"
    而如何調用就和之前一樣


    Intent _Intent = new Intent();
    _Intent.setAction("maca.demo.GOTO_INTENT");
    startActivity(_Intent);


    而category和data也就是同樣的原理 這裡僅附上代碼

    xml:

    <intent-filter>
        <action android:name="maca.demo.GOTO_INTENT" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="maca.demo.category.INTENT" />
        <data android:scheme="hello" android:mimeType="text/plain"></data>
    </intent-filter>



    java:


    Intent _Intent = new Intent();
    _Intent.setAction("maca.demo.GOTO_INTENT");
    _Intent.addCategory("maca.demo.category.INTENT");
    _Intent.setDataAndType(Uri.parse("hello://nihowma"), "text/plain");
    startActivity(_Intent);




    2012年5月12日 星期六

    Random String in Python


    '''
    Created on 2012-5-13

    @author: cnp
    '''

    import string
    import random


    def random_string(size=6, chars=string.ascii_letters + string.digits):
        return ''.join(random.choice(chars) for x in xrange(size))


    print random_string()



    output:

    bXwN6t


    2012年5月10日 星期四

    Hashing in Python



    hashlib 裡面有md5 和sha可以使用
    以下為範例

    '''
    Created on 2012-5-11

    @author: cnp
    '''

    import hashlib

    import hmac

    x= hashlib.md5("MACA")

    print x.hexdigest()

    x= hashlib.sha256("udacity")

    print x.hexdigest()

    x= hmac.new("Secret", "HAHA").hexdigest()

    print x







    output:

    19e165f571d62cbd06b97cc1413c86e2
    6b63aae7ade6895dd8cd5b2621dccd546e278398
    0224daa3a5efbaaa2414745183e20646



    2012年5月9日 星期三

    ExpandableListView and BaseExpandableListAdapter in Android

    SDK版本: 3.0
    系統: Android 4.0.3

    使用過的人AdapterView一定知道有三個必備的元素

    第一個 : AdapterView本身
    第二個 : Data
    第三個 : Adapter

    現在來一個一個解決他們

    第一個 : AdapterView (使用ExpandableListView)
    xml :

            <ExpandableListView
                android:id="@+id/expandableListView1"
                android:groupIndicator="@null"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
            </ExpandableListView>


    之後就 findViewById...不用說了


    第二個 : Data
    Data分成兩個部分 : Group還有Child

    範例如下:
    Group部分: 一共三個人

             List<String> _GroupList = new ArrayList<String>();      
             _GroupList.add("Maca");
             _GroupList.add("Paca");
             _GroupList.add("Waca");


    Child部分:

             List<View> _ChildList = new ArrayList<View>();
            
             TextView _TextView1 = new TextView(this);
             _TextView1.setText("Hello Maca");
             _TextView1.setTextColor(Color.RED);
            
             TextView _TextView2 = new TextView(this);
             _TextView2.setText("Hello Paca");
             _TextView2.setTextColor(Color.RED);
            
             TextView _TextView3 = new TextView(this);
             _TextView3.setText("Hello Waca");
             _TextView3.setTextColor(Color.RED);
            
             _ChildList.add(_TextView1);
             _ChildList.add(_TextView2);
             _ChildList.add(_TextView3);


    第三個 : Adapter

    這個地方看起來最複雜 但是實際上就是看名稱實現他們而已
    主要是看自己的需求再來看怎樣實現他們

    以下是範例


         class MyAdapter extends BaseExpandableListAdapter
         {
             private Context mContext;
             private List<String>  mGroupList;
             private List<View>  mChildList;
            
             public MyAdapter(Context pContext,List<String> pGroupList,List<View> pChildList)
             {
                  mContext = pContext;
                  mGroupList =  pGroupList;
                  mChildList = pChildList;
             }

             public Object getChild(int groupPosition, int childPosition)
             {
                 
                  return mChildList.get(childPosition);
             }

             public long getChildId(int groupPosition, int childPosition)
             {
                  // TODO Auto-generated method stub
                  return 0;
             }

             public View getChildView(int groupPosition, int childPosition,
                      boolean isLastChild, View convertView, ViewGroup parent)
             {
                  // TODO Auto-generated method stub
                  return mChildList.get(groupPosition);
             }

             public int getChildrenCount(int groupPosition)
             {
                  // TODO Auto-generated method stub
                  return 1;
             }

             public Object getGroup(int groupPosition)
             {
                  // TODO Auto-generated method stub
                  return mGroupList.get(groupPosition);
             }

             public int getGroupCount()
             {
                  // TODO Auto-generated method stub
                  return mGroupList.size();
             }

             public long getGroupId(int groupPosition)
             {
                  // TODO Auto-generated method stub
                  return 0;
             }

             public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
                      ViewGroup parent)
             {
                  TextView _View = new TextView(mContext);
                  _View.setText(mGroupList.get(groupPosition));
                  return _View;
             }

             public boolean hasStableIds()
             {
                  // TODO Auto-generated method stub
                  return false;
             }

             public boolean isChildSelectable(int groupPosition, int childPosition)
             {
                  // TODO Auto-generated method stub
                  return false;
             }
            
         }


    最後記得要把它們串在一起:


             MyAdapter _Adapter = new MyAdapter(this, _GroupList, _ChildList);
             _ExpandableListView.setAdapter(_Adapter);
    完成!!

    效果圖:
    發現有個礙眼的圖標
    所以在 xml 加上這行把圖標的位置指向null

                android:groupIndicator="@null"
    搞定











    2012年5月8日 星期二

    Disable RatingBar in Android



    當GridView裡面Item當中有RatingBar的時候
    會影響GridView的onItemClick事件無法被觸發
    要如何解決這個問題?

    (使用版本為3.0  其他的不知道有沒有這個問題)

    首先找到了xml中的
                android:focusable="false"
    使用之後沒有效果...
                android:focusableInTouchMode="false"
    這個也一樣
                android:clickable="false"
    也沒用...

    最後找到
                android:isIndicator="true"
    成功~