青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Codejie's C++ Space

Using C++

EL : Compatible PopupMenu Class


    大約兩周前, 在修復EL的2.3.x的兼容問題時, 有一個是PopupMenu相關的, 這個類在API9才有的, 那么在2.3.x平臺上就沒法用了. 為了能夠兼容, 當時用了PopupWindow.
    這兩天考慮到PopupMenu后面還是很需要的, 且以前的封裝僅僅是為了實現播放快速跳轉的兼容功能, 沒考慮再使用, 所以昨晚重新封裝了下, 這樣更加方便和實用了.

    實現的方式還是在2.3.x平臺下使用PopupWindow來實現PopupMenu的功能, 但這次只需要在xml下定義個Menu資源就好了, 不再需要另行準備個PopupWindow所需的Layout資源了, 方便再次使用.
    4.x平臺下直接就使用Menu資源初始PopupMenu了, 而使用PopupWindow時, 就需要先解析Menu資源文件, 得到所需的Item的ID和Title, 然后使用這些數據初始PopupWindow的View.



    
    封裝的ELPopupMenu代碼如下:
  1 package jie.android.el.view;
  2 
  3 import java.io.IOException;
  4 import java.util.ArrayList;
  5 import org.xmlpull.v1.XmlPullParserException;
  6 
  7 import jie.android.el.R;
  8 import jie.android.el.utils.Utils;
  9 import android.content.Context;
 10 import android.content.res.XmlResourceParser;
 11 import android.graphics.drawable.BitmapDrawable;
 12 import android.util.AttributeSet;
 13 import android.view.Gravity;
 14 import android.view.Menu;
 15 import android.view.MenuItem;
 16 import android.view.View;
 17 import android.view.View.OnClickListener;
 18 import android.view.ViewGroup.LayoutParams;
 19 import android.widget.Button;
 20 import android.widget.LinearLayout;
 21 import android.widget.PopupMenu;
 22 import android.widget.PopupMenu.OnMenuItemClickListener;
 23 import android.widget.PopupWindow;
 24 
 25 public class ELPopupMenu {
 26 
 27     private class MenuData {
 28         public int id;
 29         public String title;
 30         
 31         public MenuData(int id, String title) {
 32             this.id = id;
 33             this.title = title;
 34         }
 35     }
 36     
 37     public interface OnItemClickListener {
 38         public void OnClick(int item);
 39     }
 40     
 41     private Context context;
 42     private int resMenuId;
 43     private View parent;
 44     private Object popup;
 45     private OnItemClickListener listener;
 46     
 47     public ELPopupMenu(Context context, int resMenuId, View parent, OnItemClickListener listener) {
 48         this.context = context;
 49         this.resMenuId = resMenuId;
 50         this.parent = parent;
 51         this.listener = listener;
 52         
 53         make();
 54     }
 55     
 56     private void make() {
 57         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
 58             popup = makePopupMenu(context, resMenuId, parent);
 59         } else {
 60             popup = makePopupWindow(context, resMenuId, parent);
 61         }
 62     }
 63 
 64     private Object makePopupMenu(Context context, int resId, View parent) {
 65         PopupMenu pm = new PopupMenu(context, parent);
 66         pm.getMenuInflater().inflate(resId, pm.getMenu());
 67         pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {
 68 
 69             @Override
 70             public boolean onMenuItemClick(MenuItem menu) {
 71                 if (listener != null) {
 72                     listener.OnClick(menu.getItemId());
 73                     return true;
 74                 } 
 75                 return false;
 76             }            
 77         });
 78         
 79         return pm;
 80     }
 81 
 82     private int getAttributeIntValue(Context context, String resId) {
 83         return Integer.valueOf(resId.substring(1));
 84     }
 85     private String getAttributeStringValue(Context context, String resId) {
 86         int id = Integer.valueOf(resId.substring(1));
 87         return context.getString(id);
 88     }
 89     
 90     
 91     private ArrayList<MenuData> analyseMenuResource(Context context, int resId) {
 92         
 93         ArrayList<MenuData> menu = new ArrayList<MenuData>();
 94         
 95         XmlResourceParser parser = context.getResources().getXml(resId);
 96         
 97         try {
 98             int event = parser.next();
 99             while (event != XmlResourceParser.END_DOCUMENT) {
100                 if (event == XmlResourceParser.START_TAG) {
101                     if (parser.getName().equals("item")) {
102                         menu.add(new MenuData(getAttributeIntValue(context, parser.getAttributeValue(Utils.NS_ANDROID, "id")),
103                                 getAttributeStringValue(context, parser.getAttributeValue(Utils.NS_ANDROID, "title"))));
104                     }
105                 }
106                 event = parser.next();
107             }
108             
109         } catch (XmlPullParserException e) {
110             // TODO Auto-generated catch block
111             e.printStackTrace();
112         } catch (IOException e) {
113             // TODO Auto-generated catch block
114             e.printStackTrace();
115         }
116         
117         return menu;
118     }
119     
120     private Object makePopupWindow(Context context, int resId, View parent) {
121         
122         ArrayList<MenuData> menu = analyseMenuResource(context, resId);
123         if (menu.size() == 0) {
124             return null;
125         }
126             
127         OnClickListener l = new OnClickListener() {
128             @Override
129             public void onClick(View v) {
130                 if (listener != null) {
131                     listener.OnClick(v.getId());
132                 }
133                 if (popup != null) {
134                     ((PopupWindow)popup).dismiss();
135                 }
136             }            
137         };        
138         
139         AttributeSet attrs = Utils.getAttributeSet(context, R.layout.layout_popmenu_window_template, "LinearLayout", R.id.linearLayout1);
140         LinearLayout ll = new LinearLayout(context, attrs);
141         
142         int pos = 0;
143         for (MenuData data : menu) {
144             if (pos == 0) {
145                 attrs = Utils.getAttributeSet(context, R.layout.layout_popmenu_window_template, "Button", R.id.button1);
146             } else if (pos == menu.size() -1) {
147                 attrs = Utils.getAttributeSet(context, R.layout.layout_popmenu_window_template, "Button", R.id.button3);
148             } else {
149                 attrs = Utils.getAttributeSet(context, R.layout.layout_popmenu_window_template, "Button", R.id.button2);
150             }
151             
152             Button btn = new Button(context, attrs);
153             btn.setId(data.id);
154             btn.setText(data.title);
155             btn.setOnClickListener(l);
156             
157             ll.addView(btn, ll.generateLayoutParams(attrs));
158             
159             ++ pos;
160         }
161         
162         PopupWindow pw = new PopupWindow(ll);
163         //pw.setWidth(250);
164         pw.setWidth(LayoutParams.WRAP_CONTENT);
165         pw.setHeight(LayoutParams.WRAP_CONTENT);
166         pw.setFocusable(true);
167         pw.setOutsideTouchable(true);
168         pw.setBackgroundDrawable(new BitmapDrawable());
169         
170         return pw;        
171     }
172     
173     public void show() {
174         show(Gravity.LEFT | Gravity.BOTTOM, 16, 64);
175     }    
176 
177     public void show(int gravity, int x, int y) {
178         if (popup != null) {
179             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
180                 ((PopupMenu)popup).show();
181             } else {
182                 ((PopupWindow)popup).showAtLocation(parent, gravity, x, y);
183             }
184         }
185     }    
186     
187     public void setItemEnabled(int item, boolean enabled) {
188         if (popup != null) {
189             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
190                 Menu menu = ((PopupMenu)popup).getMenu();
191                 MenuItem sub = menu.findItem(item);
192                 if (sub != null) {
193                     sub.setEnabled(enabled);
194                 }
195             } else {
196                 View p = ((PopupWindow)popup).getContentView();
197                 View v = p.findViewById(item);
198                 v.setEnabled(enabled);
199             }
200         }
201     }
202     
203 }
204 


    初始PopupWindow的View的資源模板文件如下:
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:id="@+id/linearLayout1"
 4     android:layout_width="match_parent"
 5     android:layout_height="wrap_content"
 6     android:layout_marginLeft="16dp"
 7     android:layout_marginRight="16dp"
 8     android:background="@android:color/darker_gray"
 9     android:orientation="vertical" >
10 
11     <Button
12         android:id="@+id/button1"
13         android:layout_width="match_parent"
14         android:layout_height="wrap_content"
15         android:layout_marginTop="4dp" />
16 
17     <Button
18         android:id="@+id/button2"
19         android:layout_width="match_parent"
20         android:layout_height="wrap_content" />
21 
22     <Button
23         android:id="@+id/button3"
24         android:layout_width="match_parent"
25         android:layout_height="wrap_content"
26         android:layout_marginBottom="0dp" />
27 </LinearLayout>





posted on 2013-09-14 17:20 codejie 閱讀(1397) 評論(2)  編輯 收藏 引用 所屬分類: G7EL

評論

# re: EL : Compatible PopupMenu Class 2013-09-14 19:26 ccsdu2009

樓主是干什么工作的  回復  更多評論   

# re: EL : Compatible PopupMenu Class 2013-09-15 00:37 codejie

@ccsdu2009
職業敲字的..  回復  更多評論   

公告

Using C++

導航

統計

留言簿(73)

隨筆分類(513)

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合中文字幕| 日韩亚洲欧美一区二区三区| 亚洲精品国产精品国自产观看| 欧美亚洲第一页| 亚洲福利在线视频| 国产午夜精品美女毛片视频| 亚洲精品免费一二三区| 亚洲国产精品va| 久久黄色小说| 久久精品视频一| 国产精品日韩一区| 99在线精品视频在线观看| 亚洲日本视频| 男女精品网站| 欧美电影免费观看高清| 伊人久久av导航| 久久国产一区二区| 久久久欧美精品sm网站| 国产亚洲福利一区| 性欧美xxxx视频在线观看| 香蕉av777xxx色综合一区| 欧美天堂亚洲电影院在线观看| 亚洲黄色成人| 日韩视频在线一区二区| 欧美国产日本| 亚洲精品欧美日韩专区| 一本不卡影院| 欧美午夜免费影院| 亚洲宅男天堂在线观看无病毒| 亚洲欧美在线另类| 国产精品综合久久久| 亚欧成人在线| 老妇喷水一区二区三区| 亚洲第一精品夜夜躁人人爽| 免费在线国产精品| 日韩西西人体444www| 亚洲欧美日韩一区在线观看| 国产精品色婷婷| 久久不射2019中文字幕| 欧美国产另类| 在线亚洲高清视频| 国产精品亚洲综合天堂夜夜| 性做久久久久久免费观看欧美| 久久夜色精品亚洲噜噜国产mv| 尤物九九久久国产精品的分类| 免费久久99精品国产| 99ri日韩精品视频| 久久国产精品亚洲va麻豆| 在线日本成人| 欧美精品久久久久久久久久| 日韩午夜电影av| 午夜视频在线观看一区二区三区| 国产亚洲综合性久久久影院| 男人的天堂亚洲在线| 一本色道久久综合亚洲精品高清| 久久精品日韩欧美| 亚洲精品国产品国语在线app| 欧美偷拍一区二区| 久久久久久亚洲精品中文字幕| 亚洲精品美女在线| 久久久青草婷婷精品综合日韩| 亚洲美女在线看| 国产欧美日韩三级| 欧美激情va永久在线播放| 午夜精品一区二区三区在线| 欧美va天堂va视频va在线| 亚洲神马久久| 亚洲成在人线av| 国产女主播一区二区| 欧美国产日韩二区| 久久精品国产亚洲高清剧情介绍 | 亚洲精品国产精品国产自| 国产精品成人播放| 免费成人高清视频| 午夜天堂精品久久久久| 亚洲精品免费网站| 鲁大师影院一区二区三区| 亚洲免费在线| 一区二区免费在线播放| 影院欧美亚洲| 国产一区二区丝袜高跟鞋图片| 欧美日韩亚洲一区三区| 免费欧美电影| 久久亚洲精品中文字幕冲田杏梨| 亚洲一本视频| 一区二区三区免费网站| 欧美国产日本高清在线| 久久一二三区| 久久久久99精品国产片| 欧美一区二区三区免费看| 一区二区精品在线观看| 亚洲国产另类 国产精品国产免费| 国产日韩精品一区观看| 国产精品免费观看视频| 欧美日韩一区二区高清| 欧美精品播放| 欧美国产日韩视频| 欧美超级免费视 在线| 久久影视精品| 蜜桃久久av一区| 久久婷婷蜜乳一本欲蜜臀| 欧美专区在线观看| 午夜免费电影一区在线观看| 亚洲欧美成人综合| 欧美一级免费视频| 欧美一区二区三区精品电影| 午夜亚洲视频| 欧美在线观看视频一区二区三区| 亚洲欧美日韩精品久久奇米色影视| 亚洲视频在线观看视频| 亚洲午夜女主播在线直播| 一区二区日韩免费看| 亚洲视频狠狠| 亚洲欧美日韩一区二区在线 | 亚洲精品1区2区| 91久久午夜| 一个色综合av| 亚洲欧美美女| 久久大逼视频| 欧美va天堂在线| 亚洲国产精品国自产拍av秋霞| 亚洲国产精品久久久久秋霞不卡 | 亚洲影院高清在线| 午夜在线电影亚洲一区| 久久国产精品99国产精| 老司机免费视频一区二区三区 | 久久精品国产v日韩v亚洲| 久久久久网站| 亚洲第一伊人| 一本综合久久| 久久精品国产第一区二区三区最新章节| 久久高清国产| 欧美不卡一卡二卡免费版| 欧美日韩小视频| 国产日韩一区二区| 亚洲成在线观看| 亚洲综合国产激情另类一区| 欧美制服丝袜| 91久久亚洲| 午夜精品视频网站| 久久亚洲综合色| 欧美视频二区| 激情欧美日韩| 亚洲天堂av在线免费观看| 久久久www成人免费无遮挡大片 | 最新国产乱人伦偷精品免费网站| 亚洲免费福利视频| 久久9热精品视频| 欧美日韩国产另类不卡| 国产一区二区日韩| 亚洲视频香蕉人妖| 美女91精品| 亚洲手机视频| 欧美激情精品久久久久| 国产农村妇女毛片精品久久麻豆| 亚洲国产一区二区三区a毛片| 亚洲欧美成人综合| 亚洲高清视频中文字幕| 西瓜成人精品人成网站| 欧美日韩国产精品成人| 精品成人在线观看| 亚洲在线一区二区| 亚洲国产日韩在线| 久久久精品一区| 国产精品久久久一本精品| 亚洲乱码国产乱码精品精98午夜| 久久精品亚洲精品| 99精品国产福利在线观看免费| 久久综合给合| 国产亚洲精久久久久久| 亚洲综合视频在线| 亚洲精品久久久久久下一站 | 国产亚洲欧美激情| 亚洲午夜精品在线| 亚洲高清免费| 久久蜜臀精品av| 国产日韩欧美在线播放| 午夜精品999| a4yy欧美一区二区三区| 欧美极品在线播放| 亚洲国产精品久久久久秋霞蜜臀 | 久久网站热最新地址| 国产欧美一区二区精品性色| 亚洲尤物在线视频观看| 亚洲裸体在线观看| 欧美另类99xxxxx| 亚洲精品一区在线观看| 欧美福利一区二区三区| 久久琪琪电影院| 亚洲大片在线| 欧美电影在线| 欧美激情国产高清| 亚洲精品色图| 亚洲精品在线三区| 欧美日韩免费看| 亚洲一区国产精品| 亚洲一区二区三区视频播放| 国产精品一区二区在线观看网站| 午夜精品久久久久久99热| 亚洲一区二区成人在线观看|