Fragment 中使用菜单
在 Activity 中我们可以通过调用 onCreateOptionsMenu() 创建菜单,通过 onOptionsItemSelected() 方法响应用户的点击事件。当然,在 Fragment 也是这两个回调方法的,所以我们就可以通过覆盖这两个方法为自己的 Fragmrnt 创建菜单栏。
首先,创建一个自定义Fragment,命名为 MainFragment.java,在类中实现两个方法,如下示
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu,menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.test:
Toast.makeText(getActivity(), "Test", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
当然,仅仅是这样菜单栏是无法显示出来的,这也是和在 Activity 中使用不同的地方,我们还需要在 Fragment 的 onCreate() 方法中调用 setHasOptionsMenu(boolean hasMenu) 方法,如下
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
这样,我们就可以在Fragment 中定义的菜单栏就可以显示出来了。
层级式导航
有的时候,我们希望在 ActionBar 中提供一个左指向的图标,用于提供回退上一级的功能,当然这在 Fragment 中也是可以轻易实现的,当然如果 NavUtils 和 manifest 配置文件中的元数据配合使用是最完美的。下面就来就来介绍一下这种使用方法。
首先,在 Manifest 中配置元数据
<activity android:name=".SecondActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity">
</meta-data>
</activity>
正如以上代码所示,为 Activity 设置 父 Activity,用于 NavUtils 的判断和实现回返功能。
下面需要在 Fragment 中进行两次判断,一次是在创建视图的时候,一次是在用户点击菜单之后
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
if (NavUtils.getParentActivityName(getActivity()) != null) {
((AppCompatActivity) getActivity()).getSupportActionBar()
.setDisplayHomeAsUpEnabled(true);
}
}
因为 setDisplayHomeAsUpEnabled() 方法来自于 API 11 级,所以使用前首先对当前Android 版本进行检测,如果是低于 HONEYCOME 的版本,则不创建层级视图。其次是利用 NavUtils 类的 getParentActivityName() 方法去获取托管当前 Fragment 的 Activity 是否有父 Activity,这个值就是上面我们设定的值。
当用户点击了当前设置的返回菜单时,会触发 onOptionsItemSelected() 方法,下面我们就要进行响应
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (NavUtils.getParentActivityName(getActivity()) != null) {
NavUtils.navigateUpFromSameTask(getActivity());
}
}
return super.onOptionsItemSelected(item);
}
}
正如以上代码所示,利用 NavUtils 的 navigateUpFromSameTask() 方法就可以导航至父 Activity。