Android ActionBarCompat-ListPopupMenu Sample
This sample shows how to display a pop up menu using PopupMenu from the v7 appcompat library.
此示例演示如何使用 v7 appcompat 库中的弹出菜单来显示一个弹出菜单。
项目下载地址:http://download.csdn.net/detail/a599231042/9130889
目录结构:
上一篇讲ActionBarCompat-Basic时还没有发现这么个有趣的东西,测试类,等下讲完项目之后说说这个测试类。
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set content view (which contains a PopupListFragment) setContentView(R.layout.sample_main); } }
MainActivity 类中并没有什么东西,而是通过R.layout.sample_main加载了一个ListFragment<fragment xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.example.android.actionbarcompat.listpopupmenu.PopupListFragment" />
public class PopupListFragment extends ListFragment implements View.OnClickListener {
public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // We want to allow modifications to the list so copy the dummy data array into an ArrayList ArrayList<String> items = new ArrayList<String>(); for (int i = 0, z = Cheeses.CHEESES.length ; i < z ; i++) { items.add(Cheeses.CHEESES[i]); } // Set the ListAdapter setListAdapter(new PopupAdapter(items));//这里绑定了一个定义为内部类的Adapter }Cheeses类就是一个数组通过覆盖实现了onListItemClick方法public void onListItemClick(ListView listView, View v, int position, long id) { String item = (String) listView.getItemAtPosition(position); Toast.makeText(getActivity(), "Item Clicked: " + item, Toast.LENGTH_SHORT).show(); }通过接口implements View.OnClickListener实现了onClick的方法class PopupAdapter extends ArrayAdapter<String> { PopupAdapter(ArrayList<String> items) { super(getActivity(), R.layout.list_item, android.R.id.text1, items); } @Override public View getView(int position, View convertView, ViewGroup container) { View view = super.getView(position, convertView, container); View popupButton = view.findViewById(R.id.button_popup); popupButton.setTag(getItem(position)); popupButton.setOnClickListener(PopupListFragment.this); return view; } }这里的setOnClickListener(PopupListFragment.this)就是PopupListFragment
public void onClick(final View view) { //这里系统自带一段说明,是说因为在弹出PopupMenu之前可能位置(position)会发生改变,为了保证在正确的地方弹出所以使用了Runnable。 view.post(new Runnable() { @Override public void run() { showPopupMenu(view); } }); }showPopupMenu没有什么多余的东西,主要是通过PopupMenu 来弹出菜单,然后remove掉Adapter中的数据private void showPopupMenu(View view) { final PopupAdapter adapter = (PopupAdapter) getListAdapter(); final String item = (String) view.getTag(); PopupMenu popup = new PopupMenu(getActivity(), view); popup.getMenuInflater().inflate(R.menu.popup, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.menu_remove: // Remove the item from the adapter adapter.remove(item); return true; } return false; } }); popup.show(); }
}
好了,东西就这么多,下面说说项目中的测试类:
首先是AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.actionbarcompat.listpopupmenu.tests" android:versionCode="1" android:versionName="1.0"> <application> <uses-library android:name="android.test.runner" /><!--这个library是必须的--> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.android.actionbarcompat.listpopupmenu"<!--目标包名--> android:label="Tests for com.example.android.actionbarcompat.listpopupmenu" /> </manifest>
测试类
public class SampleTests extends ActivityInstrumentationTestCase2<MainActivity> { private MainActivity mTestActivity; private PopupListFragment mTestFragment; public SampleTests() { super(MainActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); mTestActivity = getActivity(); mTestFragment = (PopupListFragment) mTestActivity.getSupportFragmentManager().getFragments().get(0); }
//mTestActivity,mTestFragment是否为空,为空就报错 public void testPreconditions() { assertNotNull("mTestActivity is null", mTestActivity); assertNotNull("mTestFragment is null", mTestFragment); } }
示例图片: