Android samples API Demos之UI篇1(ActionBarCompat-ListPopupMenu)

来源:互联网 发布:如何评价裸儿 知乎 编辑:程序博客网 时间:2024/06/03 15:14

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();}
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
通过接口implements View.OnClickListener实现了onClick的方法
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);    }}

示例图片:


0 0
原创粉丝点击