文章目录
- 第十三章 工具栏(toolBar)
- 菜单布局文件
- 实现菜单栏的回调函数
- 实现层级式导航
- 相关小记
- 挑战练习
第十三章 工具栏(toolBar)
- 步骤:
- 定义菜单布局文件。
New -> Android Source file -> Menu
选项- 确定布局文件中的图标,有以下几种方法:
1.创建定制图标,放到不同的资源密度文件中。
2.找到合适的系统图标,但由于各设备系统图标可能不同,会破坏整体设计风格。不推荐。(打开SDK目录,platforms/ android-*/ data/ res)
3.使用Android Studio内置的Android Asset Studio工具(New -> Image Asset)
- 实现菜单的回调函数
1.onCreateOptionsMenu(Menu, MenuInflater)
2.onOptionsItemSelected(Menu)
- 可选择实现层级式导航
菜单布局文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/new_crime"
android:icon="@drawable/ic_menu_add"
android:title="@string/new_crime"
app:showAsAction="ifRoom|withText"/>
<item
android:id="@+id/show_subtitle"
android:title="@string/show_subtitle"
app:showAsAction="ifRoom"
/>
</menu>
- 属性showAsAction有
always
,ifRoom
,never
三个属性值可供选择。android:showAsAction
属性是随操作栏的发布才添加(即原生老版本不可用),为了兼容性考虑,使用了app的命名空间。
实现菜单栏的回调函数
onCreateOptionsMenu
方法是fm调用的,应在其管理的fragment中通知fm。即在fragment中添加setHasOptionsMenu(true);
onOptionsItemSelected
方法返回的时boolean
属性的值,一旦完成处理事件,应返回true。用switchj及case来对菜单资源Id进行判断。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_crime, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.delet_crime:
CrimeLab.get(getActivity()).deletCrime(mCrime);
getActivity().finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
实现层级式导航
<activity
android:name=".CrimePagerActivity"
android:parentActivityName=".CrimeListActivity"> <!--加上父activity-->
</activity>
- 解决层级式导航父activity会被重建的问题
- 覆盖向上导航机制调用activity的finish()方法直接回退到前一个activity界面,但只能回退一个层级。
- 在当前activity中覆盖getParentActivityIntent(),用附带的extra信息重建。但这样就需要知道父类的情况,不利于独立性。
相关小记
- 菜单文件名遵循与布局文件名一样的原则,即反向,小写,加下划线。
- 设置菜单栏标题
AppCompatActivity activity = (AppCompatActivity) getActivity();//通过强制类型转换以达到访问工具栏的效果
activity.getSupportActionBar().setSubtitle(subtitle);
- 菜单项发生改变,需要更新时
getActivity().invalidateOptionsMenu();
- 工具栏可以在屏幕上的任何位置摆放,也可以摆放多个,还能内嵌视图和调整高度。
<string name="subtitle_format">%1$d crimes</string>
String subtitle = getString(R.string.subtitle_format, crimeCount); //该方法接受字符串,与占位符的值替换
挑战练习
- 删除Crime记录
跟第十四章的挑战练习类似
- 复数字符串资源
按照示例代码就可以,但由于首选语言为中文, ,不会有单复数的变化. 选为英文就可以了.
- 当没有数据时设置空视图。
- 添加一个TextView和Button
- 实例化他们, 在Button上设置点击监听
- 在
updateUI
中进行判断
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/crime_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/tv_show_tip">
</android.support.v7.widget.RecyclerView>
<TextView
android:id="@+id/tv_show_tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="@string/tv_show_tip"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/crime_recycler_view"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/bt_new_crime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bt_new_crime"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_show_tip" />
</android.support.constraint.ConstraintLayout>
if (crimes.size() != 0){
mTextView.setVisibility(View.INVISIBLE);
mButton.setVisibility(View.INVISIBLE);
}else {
mTextView.setVisibility(View.VISIBLE);
mButton.setVisibility(View.VISIBLE);
}