Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android進階:實現聯系人列表滑動顯示提示信息 以及彈出選擇菜單

Android進階:實現聯系人列表滑動顯示提示信息 以及彈出選擇菜單

編輯:Android開發實例

經常看到一些Contact類的軟件軟件聯系人列表在滾動時會在屏幕中間彈出一個提示信息,就是當前位置的聯系人序號之類的,嘗試實現了一下

 

先看效果:

 

 

中間彈出的就是一個類似於Overlay的層

 

布局文件 pop_overlay.xml

 

 

  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <TextView xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:textSize="70sp"    
  4.     android:textColor="#99ff00ff"    
  5.     android:background="#99fff34f"    
  6.     android:minWidth="80dip"    
  7.     android:maxWidth="80dip"    
  8.     android:padding="10dip"    
  9.     android:gravity="center"    
  10. />   

 

在onCreate方法中加載這個View並且通過addView加入到Activity中

 

  1. //滾動時彈出的提示框  
  2.         txtOverlay = (TextView) LayoutInflater.from(this).inflate(R.layout.pop_overlay, null);    
  3.         // 默認設置為不可見。    
  4.         txtOverlay.setVisibility(View.INVISIBLE);    
  5.         WindowManager.LayoutParams lp = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT,    
  6.                 LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION,    
  7.                 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,    
  8.                 PixelFormat.TRANSLUCENT);    
  9.         windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);    
  10.         windowManager.addView(txtOverlay, lp);   

 

然後可以通過實現 ListView.OnScrollListener接口來重寫  onScroll 和 onScrollStateChanged方法

 

 

  1. boolean visible;  
  2.       
  3.     @Override 
  4.     public void onScroll(AbsListView view, int firstVisibleItem,  
  5.             int visibleItemCount, int totalItemCount) {  
  6.         Log.i("bb", "onScroll");  
  7.         Log.i("bb", "visible:"+visible);  
  8.         int index = cursor.getColumnIndex("display_name");  
  9.         if (visible) {  
  10.             cursor.moveToPosition(firstVisibleItem);  
  11.             String firstChar = Pinyin4j.getFirstChar(cursor.getString(index));  
  12.             txtOverlay.setText(firstChar);  
  13.             txtOverlay.setVisibility(View.VISIBLE);  
  14.         }  
  15.     }  
  16.       
  17.     @Override 
  18.     public void onScrollStateChanged(AbsListView view, int scrollState) {  
  19.         visible = true;  
  20.         Log.i("bb", "onScrollStateChanged");  
  21.         //在onScrollStateChanged (AbsListView view, int scrollState) 中,scrollState有三種狀態,  
  22.         //分別是開始滾動(SCROLL_STATE_FLING ),正在滾動(SCROLL_STATE_TOUCH_SCROLL ), 已經停止(SCROLL_STATE_IDLE ),  
  23.         if (scrollState == ListView.OnScrollListener.SCROLL_STATE_IDLE) {  
  24.             txtOverlay.setVisibility(View.INVISIBLE);  
  25.             visible = false;  
  26.         }  
  27.           
  28.     } 

 

這兩個方法的調用時機是不同的,可以自己打印看一下

 

這裡顯示的是用戶中文名的首字母  通過 pingyin4j.jar 來實現的 可以下載來試下 還可以設置一些參數的

 

下面是調試代碼:

 

 

  1. import java.util.HashSet;  
  2. import java.util.Set;  
  3. import net.sourceforge.pinyin4j.PinyinHelper;  
  4. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;  
  5. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;  
  6. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;  
  7. import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;  
  8. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;  
  9. public class Pinyin4j {  
  10.     /**  
  11.      * 字符串集合轉換字符串(逗號分隔)  
  12.      */ 
  13.     public static String makeStringByStringSet(Set<String> stringSet) {  
  14.         StringBuilder str = new StringBuilder();  
  15.         int i = 0;  
  16.         for (String s : stringSet) {  
  17.             if (i == stringSet.size() - 1) {  
  18.                 str.append(s);  
  19.             } else {  
  20.                 str.append(s + ",");  
  21.             }  
  22.             i++;  
  23.         }  
  24.         return str.toString().toLowerCase();  
  25.     }  
  26.     /**  
  27.      * 獲取拼音集合  
  28.      */ 
  29.     public static Set<String> getPinyin(String src) {  
  30.         if (src != null && !src.trim().equalsIgnoreCase("")) {  
  31.             char[] srcChar;  
  32.             srcChar = src.toCharArray();  
  33.             // 漢語拼音格式輸出類  
  34.             HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();  
  35.             // 輸出設置,大小寫,音標方式等  
  36.             hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
  37.             hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
  38.             hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);  
  39.             String[][] temp = new String[src.length()][];  
  40.             for (int i = 0; i < srcChar.length; i++) {  
  41.                 char c = srcChar[i];  
  42.                 // 是中文或者a-z或者A-Z轉換拼音(我的需求,是保留中文或者a-z或者A-Z)  
  43.                 if (String.valueOf(c).matches("[//u4E00-//u9FA5]+")) {  
  44.                     try {  
  45.                         temp[i] = PinyinHelper.toHanyuPinyinStringArray(  
  46.                                 srcChar[i], hanYuPinOutputFormat);  
  47.                     } catch (BadHanyuPinyinOutputFormatCombination e) {  
  48.                         e.printStackTrace();  
  49.                     }  
  50.                 } else if (((int) c >= 65 && (int) c <= 90)  
  51.                         || ((int) c >= 97 && (int) c <= 122)) {  
  52.                     temp[i] = new String[] { String.valueOf(srcChar[i]) };  
  53.                 } else {  
  54.                     temp[i] = new String[] { "" };  
  55.                 }  
  56.             }  
  57.             String[] pingyinArray = Exchange(temp);  
  58.             Set<String> pinyinSet = new HashSet<String>();  
  59.             for (int i = 0; i < pingyinArray.length; i++) {  
  60.                 pinyinSet.add(pingyinArray[i]);  
  61.             }  
  62.             return pinyinSet;  
  63.         }  
  64.         return null;  
  65.     }  
  66.     /**  
  67.      * 遞歸  
  68.      */ 
  69.     public static String[] Exchange(String[][] strJaggedArray) {  
  70.         String[][] temp = DoExchange(strJaggedArray);  
  71.         return temp[0];  
  72.     }  
  73.     /**  
  74.      * 遞歸  
  75.      */ 
  76.     private static String[][] DoExchange(String[][] strJaggedArray) {  
  77.         int len = strJaggedArray.length;  
  78.         if (len >= 2) {  
  79.             int len1 = strJaggedArray[0].length;  
  80.             int len2 = strJaggedArray[1].length;  
  81.             int newlen = len1 * len2;  
  82.             String[] temp = new String[newlen];  
  83.             int Index = 0;  
  84.             for (int i = 0; i < len1; i++) {  
  85.                 for (int j = 0; j < len2; j++) {  
  86.                     temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j];  
  87.                     Index++;  
  88.                 }  
  89.             }  
  90.             String[][] newArray = new String[len - 1][];  
  91.             for (int i = 2; i < len; i++) {  
  92.                 newArray[i - 1] = strJaggedArray[i];  
  93.             }  
  94.             newArray[0] = temp;  
  95.             return DoExchange(newArray);  
  96.         } else {  
  97.             return strJaggedArray;  
  98.         }  
  99.     }  
  100.     public static String getFirstChar(String str) {  
  101.         return makeStringByStringSet(getPinyin(str)).substring(0, 1);  
  102.     }  
  103.     /**  
  104.      * @param args  
  105.      */ 
  106.     public static void main(String[] args) {  
  107.         String str = "測試";  
  108.         System.out.println(makeStringByStringSet(getPinyin(str)));  
  109.     }  

 

 

下面看彈出菜單的創建

 

 

  1. //監聽條目單擊事件  
  2.         listView.setOnItemClickListener(new OnItemClickListener(){  
  3.             @Override 
  4.             public void onItemClick(AdapterView<?> parent, View view,  
  5.                     int position, long id) {  
  6.                 TextView tv = (TextView)view.findViewById(R.id.phonename);  
  7.                 Toast.makeText(ListViewDemo.this, tv.getText(), Toast.LENGTH_LONG).show();  
  8.             }  
  9.               
  10.         });  
  11.         listView.setOnItemLongClickListener(new OnItemLongClickListener(){  
  12.             @Override 
  13.             public boolean onItemLongClick(AdapterView<?> parent, View view,  
  14.                     int position, long id) {  
  15.                 Toast.makeText(ListViewDemo.this, "長按一次", Toast.LENGTH_LONG).show();  
  16.                 return false;//如果返回true 就不會調用下面onCreateContextMenu事件  
  17.             }  
  18.               
  19.         });  
  20.           
  21.           
  22.         //長按彈出菜單選項的點擊選擇事件監聽  
  23.         final OnMenuItemClickListener mOnMenuItemClickListener = new OnMenuItemClickListener(){  
  24.             @Override 
  25.             public boolean onMenuItemClick(MenuItem item) {  
  26.                 switch (item.getItemId()) {  
  27.                 case 0:  
  28.                     Toast.makeText(ListViewDemo.this, "test1", Toast.LENGTH_LONG).show();  
  29.                     break;  
  30.                 case 1:  
  31.                     Toast.makeText(ListViewDemo.this, "test2", Toast.LENGTH_LONG).show();  
  32.                     break;  
  33.                 case 2:  
  34.                     Toast.makeText(ListViewDemo.this, "test3", Toast.LENGTH_LONG).show();  
  35.                     break;  
  36.                 case 3:  
  37.                     Toast.makeText(ListViewDemo.this, "test4", Toast.LENGTH_LONG).show();  
  38.                     break;  
  39.                 }  
  40.                 return false;  
  41.             }  
  42.               
  43.         };  
  44.           
  45.         //監聽長按事件 長按時彈出選擇菜單   
  46.         listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){  
  47.             @Override 
  48.             public void onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo arg2) {  
  49.                   
  50.                 menu.setHeaderTitle("提示框");  
  51.                 menu.add(0, 0, 0, "test1").setOnMenuItemClickListener(mOnMenuItemClickListener);  
  52.                 menu.add(0, 1, 1, "test2").setOnMenuItemClickListener(mOnMenuItemClickListener);  
  53.                 menu.add(0, 2, 2, "test3").setOnMenuItemClickListener(mOnMenuItemClickListener);  
  54.                 menu.add(0, 3, 3, "test4").setOnMenuItemClickListener(mOnMenuItemClickListener);  
  55.             }  
  56.               
  57.         }); 

 

效果如上圖,這裡就有ListView種的幾個點擊事件


首先是單擊事件 通過setOnItemClickListener 來監聽


長按事件 通過 setOnItemLongClickListener 來監聽 如果是長按就可以通過setOnCreateContextMenuListener這個事件來創建彈出菜單,注意如果要通過這種方式創建菜單需要在onItemLongClick方法中返回false

 

通過setOnCreateContextMenuListener事件來監聽彈出菜單的點擊事件

 

總之這裡有N多的事件

 

還有一點看一下ListView的每個條目Item實現點擊切換底色的效果

 

如圖

 

點擊是底色變成如果的顏色


這個可以在Item的布局文件中實現  來看布局文件 listviewdemoitem.xml

 

 

  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="horizontal"    
  4.     android:layout_width="fill_parent"    
  5.     android:layout_height="fill_parent"    
  6.     android:background="#ffffff"        
  7.     >      
  8.     <RelativeLayout    
  9.         android:layout_width="wrap_content"    
  10.         android:layout_height="fill_parent"    
  11.         android:background="@drawable/listview_selected"    
  12.         android:padding="6px"    
  13.     >    
  14.     <TextView    
  15.         android:id="@+id/phonename"      
  16.         android:layout_width="fill_parent"     
  17.         android:layout_height="wrap_content"     
  18.         android:textSize="20px"    
  19.         android:textColor="#000000"    
  20.         />    
  21.     <TextView    
  22.         android:layout_below="@id/phonename" 
  23.         android:id="@+id/phonenumber"      
  24.         android:layout_width="fill_parent"     
  25.         android:layout_height="wrap_content"     
  26.         android:textSize="16px"    
  27.         android:textColor="#000000"    
  28.         />    
  29.         <ImageView    
  30.             android:layout_alignParentRight="true" 
  31.             android:layout_width="wrap_content"     
  32.             android:layout_height="wrap_content"   
  33.             android:src="@drawable/menu_city_manager" 
  34.             android:layout_gravity="right" 
  35.             /> 
  36.      </RelativeLayout>    
  37. </LinearLayout>   

 

外面是一個LinerLayout 作為底色 防止滾動的時候底色變成黑色

 

裡面用一個RelativeLayout實現了布局調整,它的android:background="@drawable/listview_selected"  屬性通過一個Selector

 

來實現焦點 點擊等操作時的背景切換

 

  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">    
  3.     <item android:state_pressed="true" android:drawable="@drawable/list_selector_background_pressed" />    
  4. </selector>   

 

這裡簡單實現了一下,還可以有其他的設置 譬如 android:state_focus等

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved