2014年10月21日 星期二

Code Snippet in Android Studio

在使用 Android Studio 撰寫程式時,很常輸入 inn 再加上 tab 來產生 if (obj != null) 的程式碼區段,這種程式碼片段是可以自行建立的,在 Android Studio 的 Preference / IDE Settings / Live Templates 中可以看到全部的 Code Snippets 與加入新的 Snippet。

隨意點選一個,例如 others 中的 inst 可以看到這是一個 if instanceof 的程式碼片段,並且中間包含 3 個可編輯的變數及使用 $END$ 來令編輯完後輸入焦點停留在某處

if ($EXPR$ instanceof $TYPE$) {
  $TYPE$ $VAR1$ = ($TYPE$)$EXPR$;
  $END$
}

利用這些簡單的規則,我們就可以將平時一些常用到,篇幅又長的程式碼片段建立成 Live Template 來提高效率 (帥度),以我自己為例,平時在開發上或撰寫試驗性的小專案時,我是不太喜歡寫 ListView + Adapter 的,因為重覆的程式碼非常的多,雖然可以使用 cmd+N 的方式 Gen 出需 Override 的 Function,但內容只有 return null 並沒有太大的幫助,所以我建立了一個自動產生 Adapter 的 Template 並取名為 newadpt 如下

public class $ADAPTER$ extends BaseAdapter {

    class ViewHolder {
    }

    private Context context;
    private LayoutInflater inflater;
    private ArrayList<$ITEMTYPE$> $ITEMS$ = new ArrayList<$ITEMTYPE$>();

    public $ADAPTER$(Context context, ArrayList<$ITEMTYPE$> $ITEMS$) {
        this.context = context;
        this.$ITEMS$ = $ITEMS$;
        inflater = LayoutInflater.from(context);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.$LAYOUT$, parent, false);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        $ITEMTYPE$ model = $ITEMS$.get(position);
        $END$
 
        return convertView;
    }

    @Override
    public int getCount() {
        return ($ITEMS$ == null) ? 0 : $ITEMS$.size();
    }

    @Override
    public $ITEMTYPE$ getItem(int position) {
        return $ITEMS$.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}

這裡可以看到我加入了 4 個變數,只要我輸入 newadpt 再按 tab 後,依序透過 tab 輸入 MemberListAdapter、Member、members、listview_item_member,就可以產生出以下程式碼片段,接下來我只要在被標為紅字的 Member 上按 option + Enter 再選 Create Class 就可以流暢 (帥氣) 的生出一個給 ListView 使用的 Adapter 如下

public class MemberListAdapter extends BaseAdapter {

    class ViewHolder {
    }

    private Context context;
    private LayoutInflater inflater;
    private ArrayList<Member> members = new ArrayList<Member>();

    public MemberListAdapter(Context context, ArrayList<Member> members) {
        this.context = context;
        this.members = members;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.list_view_item_member, parent, false);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        Member model = members.get(position);
     

        return convertView;
    }

    @Override
    public int getCount() {
        return (members == null) ? 0 : members.size();
    }

    @Override
    public Member getItem(int position) {
        return members.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}




Visual C# 的版本可以參考這裡:開發團隊的基礎建設 Code Snippet for C#




沒有留言:

張貼留言