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

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);
    }

}

示例图片:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值