2012年11月5日 星期一

Android GPS 如何停止搜尋狀態

假設LocationManager 用的是系統的service
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

mLocationManager .requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 100, MyLocation.this);

當App 關閉之後,會發現GPS還會繼續搜尋 導致手機耗電
這是因為這段code把 LocationListener 綁到了service中

所以要記得在關閉App後 解除綁定

protected void onDestroy() {
super.onDestroy();
locationManager.removeUpdates(MyLocation.this);
}

2012年9月9日 星期日

如何用Excel建立 直條圖(長條圖) 與 折線圖 合併圖表


1.插入折線圖








2.對圖表按右鍵 -> 選取資料














3.按住ctrl 選取要做成圖表數據 (這邊選Acc.Volume Acc. Revenue Acc. Expenditure)












4.點擊水平下的編輯 -> 選擇座標軸橫軸標籤範圍


5.對想要換成長條圖的折線 點擊右鍵 -> 變更數列圖表類型






6.選擇長條圖























7.因為使用的單位不同  所以要新增第二個縱軸
   對直條圖點擊右鍵 -> 資料數列格式













8.選擇副座標軸 -> 確定


9. 完成!












excel 合併圖表, excel 圖表合併, 長條圖和折線圖結合,  excel 圖表合併, excel圖表

2012年5月17日 星期四

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"
    成功~

    2012年4月30日 星期一

    Python 筆記 namedtuple and sort with lambda expression



    '''
    Created on 2012-5-1

    @author: Maca
    '''

    from collections import namedtuple

    People = namedtuple("People",["Name","Age"])
    Lists = [People("Maca","24"),People("Puma","18"),People("Lula","30")]

    print Lists

    Lists.sort(key=lambda args:args.Age)

    print Lists

    Lists.sort(key=lambda args:args.Name)

    print Lists



    Outputs:

    [People(Name='Maca', Age='24'), People(Name='Puma', Age='18'), People(Name='Lula', Age='30')]
    [People(Name='Puma', Age='18'), People(Name='Maca', Age='24'), People(Name='Lula', Age='30')]
    [People(Name='Lula', Age='30'), People(Name='Maca', Age='24'), People(Name='Puma', Age='18')]


    2012年4月27日 星期五

    Python筆記 Set List Dictionary




    集合 Set:

    fruit = set(['apple','banana','tomato'])
    vegetable = set (['carrot','tomato'])

    print fruit | vegetable

    print fruit - vegetable

    print fruit & vegetable

    print fruit ^ vegetable



    set(['tomato', 'carrot', 'apple', 'banana'])
    set(['apple', 'banana'])
    set(['tomato'])
    set(['carrot', 'apple', 'banana'])




    List:

    names = ['maca','Maca','Tony','Grace','Maca']

    print names

    print names.count('Maca')

    names.sort()

    print names

    names.reverse()

    print names

    names.remove('Maca')

    print names



    ['maca', 'Maca', 'Tony', 'Grace', 'Maca']
    2
    ['Grace', 'Maca', 'Maca', 'Tony', 'maca']
    ['maca', 'Tony', 'Maca', 'Maca', 'Grace']
    ['maca', 'Tony', 'Maca', 'Grace']






    Dictionary





    di = {1:"HAHA",2:"LALA",3:"HOHO"}

    print di[1]

    di[1] = "MIMI"

    print di[1]

    di["A"] = "HEHE"

    print di
    print "-----------------------------------------------------"

    print di.keys()

    print di.values()

    print "-----------------------------------------------------"
    print di.pop("A")

    print di

    del di[2]

    print di



    HAHA
    MIMI
    {'A': 'HEHE', 1: 'MIMI', 2: 'LALA', 3: 'HOHO'}
    -----------------------------------------------------
    ['A', 1, 2, 3]
    ['HEHE', 'MIMI', 'LALA', 'HOHO']
    -----------------------------------------------------
    HEHE
    {1: 'MIMI', 2: 'LALA', 3: 'HOHO'}
    {1: 'MIMI', 3: 'HOHO'}