最初的想法:创建一个新的activity,然后用menu的方式在此 新的activity下显示文件名称。
根据逐步了解到的信息,采用listview控件完成此工作更加合适。本文主要总结前期针对Intent和Menu的使用。
1. Intent 使用
用于activity之间的通讯,例如activityA 中启动 activityB;或者activityA启用某个action,android中的action完全说明参考文献[2]。
(1) 为测试需要,首先增加一个activity。
(1.1) 在AndroidManifest.xml 中增加配置
<activity
android:name="com.example.filedel.FileDispActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
(1.2) 增加新的布局文件 /filedel/res/layout/file_display.xml
(1.3) 增加新的类: /filedel/src/com/example/filedel/FileDispActivity.java 并在其中override onCreate等接口。
(2) 新的activity建立后,在mainActivity中进行调用。
Intent调用分为显式调用和隐式调用,此处采用显式调用,直接指定要调用的activity对应的类。
Intent FileDispActivity = new Intent(MainActivity.this,FileDispActivity.class);
startActivity(FileDispActivity);
此处直接通过指明要调用的activity(FileDispActivity)类,来运行FileDispActivity,为显式调用,即一眼就能看出调用的哪个activity。
另外一种方式,隐式调用,代码如下:
Intent FileDispActivity = new Intent(Intent.ACTION_VIEW);
startActivity(FileDispActivity);
此处在创建新的Intent参数时,仅仅指明了Intent的action类型,而后所有注册为此action类型的activity都会被通知到。以此为例,我们在(1.1)节中设置了intent-filter,指明了此activity对应的action名字为VIEW,因而上述隐式调用命令中携带的Intent.ACTION_VIEW会由OS发送到此activity中,而后此activity检查自己注册了VIEW action,则响应OS的启动命令,进行activity的运行,具体运行的activity由配置文件中的activity android :name来指定。其中创建对象时要添加ACTION_前缀。隐式调用的效果如下图,除了我们自己(红圈)的activity,还有其他的(绿线 )也被通知到了。
2. menu的使用
分为option menu和context menu。考虑到交互性,使用context menu。
context menu 需要和某个view进行关联,在使用之前,先要创建一个view组件,并将此view组件和menu进行关联,以后点击此view组件时,就会弹出创建的menu。
2.1 在中增加一个view组件
<TextView
android:id="@+id/menu"
android:layout_width="200dp"
android:layout_height="300dp"
android:layout_alignRight="@+id/filelist"
android:layout_below="@+id/hidenFile"
android:layout_marginTop="20dp"
android:text="@string/Menu" />
2.2 增加menu配置文件 /filedel/res/menu/contextmenu.xml,并在其中增加菜单项
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<group android:id="@+id/group1"
android:visible="true"
android:checkableBehavior="all"
android:menuCategory="container"
android:enabled="false">
<item android:id="@+id/item1"
android:enabled="true"
android:menuCategory="container"
android:checked="false"
android:visible="true"
android:title="file1"
android:checkable="true"></item>
<item android:id="@+id/item2"
android:title="file"
android:visible="true"
android:enabled="true"
android:checkable="false"
android:checked="true"
android:menuCategory="container"></item>
</group>
</menu>
2.3 将初始创建的View控件注册为一个contextMenu,进行此种注册后,VIEW控件就类似一个button按键,每当按此VIEW控件时,就会弹出菜单
TextView menuTv= (TextView) findViewById(R.id.menu);
registerForContextMenu(menuTv);
2.4 override onCreateContextMenu的实现。其中调用了Menu的inflate,是为了从mainAcitivity中找出contextmenu对应的layout。假如在2.3中针对多个View控件注册了contextMenu,那么此处应该根据View中的ID等字段来分别inflate。
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.contextmenu, menu);
}
参考资料:
1. Android Intent action 说明。 Intent action 主要介绍了intent filter中 action字段配置的意义及用途
2.intent action 大全 action详细说明
3. inflate inflate说明 讲述inflate作用,某个activity中存在多个layout,从一个activity中找出某个layout。