2014-06-09

【Android】context menu 浮動功能表

context menu 可以應用在任何 viewview 的子類別,但通常使用在 ListViewGridView,當使用者在 ListView 上一直按著某個項目不放(長按),就會跳出浮動功能表。

開發工具:ADT v22.6.2-1085508
target SDK:v4.1.2 JellyBean(API 16)
min SDK:v2.3.3 Gingerbread(API 10)

AndroidManifest.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. package="com.example.contextmenutest"
  5. android:versionCode="1"
  6. android:versionName="1.0" >
  7.  
  8. <uses-sdk
  9. android:minSdkVersion="10"
  10. android:targetSdkVersion="16" />
  11.  
  12. <application
  13. android:allowBackup="true"
  14. android:icon="@drawable/ic_launcher"
  15. android:label="@string/app_name"
  16. android:theme="@style/AppTheme" >
  17. <activity
  18. android:name="com.example.contextmenutest.MainActivity"
  19. android:label="@string/app_name" >
  20. <intent-filter>
  21. <action android:name="android.intent.action.MAIN" />
  22.  
  23. <category android:name="android.intent.category.LAUNCHER" />
  24. </intent-filter>
  25. </activity>
  26. </application>
  27.  
  28. </manifest>
  29.  


activity_main.xml
  1. <LinearLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/container"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:orientation="vertical"
  8. tools:context="com.example.contextmenudemo.MainActivity" >
  9.  
  10. <ListView
  11. android:id="@+id/listView1"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:longClickable="true" >
  15.  
  16. </ListView>
  17. </LinearLayout>


main_list_item.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <LinearLayout
  4. xmlns:android="http://schemas.android.com/apk/res/android"
  5. android:id="@+id/ListItem"
  6. android:layout_width="fill_parent"
  7. android:layout_height="wrap_content"
  8. android:orientation="vertical">
  9.  
  10. <TextView
  11. android:id="@+id/TextView1"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="text1"
  15. android:textAppearance="?android:attr/textAppearanceSmall" />
  16. </LinearLayout>


MainActivity.java
  1. package com.example.contextmenudemo;
  2.  
  3. import java.util.ArrayList;
  4. import android.support.v7.app.ActionBarActivity;
  5. import android.os.Bundle;
  6. import android.view.ContextMenu;
  7. import android.view.Menu;
  8. import android.view.MenuInflater;
  9. import android.view.MenuItem;
  10. import android.view.View;
  11. import android.view.ContextMenu.ContextMenuInfo;
  12. import android.widget.AdapterView;
  13. import android.widget.ListView;
  14. import android.widget.Toast;
  15.  
  16. public class MainActivity extends ActionBarActivity
  17. {
  18. ListView listview;
  19. String[] values = new String[] { "item1", "item2", "item3", "item4", "item5" };
  20. int pos = -1;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState)
  23. {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. listview = (ListView) findViewById(R.id.listView1);
  27. final ArrayList<String> list = new ArrayList<String>();
  28. for(int i=0; i<values.length; ++i)
  29. {
  30. list.add(values[i]);
  31. }
  32.  
  33. MainListAdapter mAdapter = new MainListAdapter (this, list);
  34. listview.setAdapter(mAdapter);
  35. // 註冊浮動功能表給 view, 在本例為 listview
  36. registerForContextMenu(listview);
  37. }
  38.  
  39. @Override
  40. public boolean onCreateOptionsMenu(Menu menu)
  41. {
  42. getMenuInflater().inflate(R.menu.main, menu);
  43. return true;
  44. }
  45.  
  46. // 點選功能表選項的回應碼
  47. @Override
  48. public boolean onOptionsItemSelected(MenuItem item)
  49. {
  50. int id = item.getItemId();
  51. switch(id)
  52. {
  53. case R.id.action_settings:
  54. Toast.makeText(this, "list "+pos+" menu 設定", Toast.LENGTH_LONG).show();
  55. pos = -1;
  56. return true;
  57. case R.id.action_new:
  58. Toast.makeText(this, "list "+pos+" menu 新增", Toast.LENGTH_LONG).show();
  59. pos = -1;
  60. return true;
  61. case R.id.action_edit:
  62. Toast.makeText(this, "list "+pos+" menu 修改", Toast.LENGTH_LONG).show();
  63. pos = -1;
  64. return true;
  65. }
  66. return super.onOptionsItemSelected(item);
  67. }
  68. // 建立浮動功能表
  69. @Override
  70. public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
  71. {
  72. // 功能表 和 浮動功能表是可以不同的
  73. // 選項不同, 各自點擊選項時的反應也可不同
  74. // 不過在本例, 偷懶採用同一個功能表
  75. super.onCreateContextMenu(menu, v, menuInfo);
  76. AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
  77. pos = info.position + 1;
  78. // 設定浮動功能表的標題欄
  79. menu.setHeaderTitle("選取 "+values[info.position]);
  80. MenuInflater inflater = getMenuInflater();
  81. inflater.inflate(R.menu.main, menu);
  82. }
  83. // 點選浮動功能表選項的回應碼
  84. @Override
  85. public boolean onContextItemSelected(MenuItem item)
  86. {
  87. // 因為在本例, 浮動功能表 和 功能表 是同一個
  88. // 所以直接將參數傳給功能表的 onOptionsItemSelected()
  89. // 讓功能表去處理
  90. return onOptionsItemSelected(item);
  91. }
  92.  
  93. }


MainListAdapter.java
  1. package com.example.contextmenudemo;
  2.  
  3. import java.util.List;
  4.  
  5. import android.app.Activity;
  6. import android.content.Context;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.BaseAdapter;
  11. import android.widget.TextView;
  12.  
  13. public class MainListAdapter extends BaseAdapter
  14. {
  15. private Activity activity;
  16. private List<String> mTextView;
  17. private static LayoutInflater inflater = null;
  18. public MainListAdapter(Activity a, List<String> str)
  19. {
  20. activity = a;
  21. mTextView = str;
  22. inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  23. }
  24.  
  25. public int getCount()
  26. {
  27. return mTextView.size();
  28. }
  29.  
  30. public Object getItem(int position)
  31. {
  32. return position;
  33. }
  34.  
  35. public long getItemId(int position)
  36. {
  37. return position;
  38. }
  39. public View getView(int position, View convertView, ViewGroup parent)
  40. {
  41. View vi = convertView;
  42. if(convertView==null)
  43. {
  44. vi = inflater.inflate(R.layout.main_list_item, null);
  45. }
  46. TextView TextView1 = (TextView) vi.findViewById(R.id.TextView1);
  47. TextView1.setText(mTextView.get(position).toString());
  48. return vi;
  49. }
  50. }


沒有留言:

張貼留言