实验四 选项菜单、Actionbar/Toolbar与Fragment
目 录
选项菜单、Actionbar/Toolbar与Fragment
内容一,使用选项菜单,为应用程序添加退出选项。将退出选项放置在ToolBar中,具体效果如下所示,用户点击退出选项,则退出该应用
内容二,利用Toolbar、控件和碎片Fragment技术实现下述类似功能。
(二)内容二要求,则需要使用到Fragment、Toolbar以及选项菜单。与课件Fragment小节中第一个例子类似。具体可参见第五章课件。Fragment操作的步骤如下:
2.在activity_main.xml布局文件中使用Toolbar控件。首先,在activity_main.xml布局文件中使用Toolbar控件。
3.activity_main.xml布局文件除了有Toolbar控件,下面与前面实验类似,放“用户名”和“密码”及其输入框。修改代码如下:
5.修改MainActivity.java代码,声明变量,将布局文件中的Toolbar控件传递给toolbar变量。
7.在要使用该菜单的Activity中,重写onOptionsItemSelected(MenuItem item)方法,完成菜单选项点击事件,为菜单选项添加功能。
修改activity_main.xml布局文件,在Toolbar内添加“登录”和“注册”按钮。
一、实验目的
- 掌握选项菜单。
- 利用ActionBar设置选项菜单。
- 掌握ToolBar
- 利用ToolBar和Fragment设置多个标签。
二、实验内容
实验内容包括三个:
内容一,使用选项菜单,为应用程序添加退出选项。将退出选项放置在ToolBar中,具体效果如下所示,用户点击退出选项,则退出该应用
内容二,利用Toolbar、控件和碎片Fragment技术实现下述类似功能。
当用户点击“登陆”按钮,显示登陆界面,点击“注册”按钮,显示注册界面。如上面两图所示。不同选项,产生不同的显示效果。
内容二不使用选项菜单,直接在Toolbar上放置其它控件,如TextView和ImageView。
三、实验思路
(一)内容一要求,添加选项菜单。步骤为:
1. 新建资源文件夹menu,在res/menu/文件夹中定义选项菜单的格式,这里用menu.xml命名。
2. 在activity_main.xml布局文件中使用Toolbar控件。首先,在activity_main.xml布局文件中使用Toolbar控件。
<androidx.appcompat.widget.Toolbar
android:id="@+id/my_tool_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
然后,修改MainActvity.java代码。添加属性。
private Toolbar toolbar;
最后,在onCreate方法中使用Toolbar作为操作栏。
toolbar = findViewById(R.id.my_tool_bar);
setSupportActionBar(toolbar);
3. 在要使用该菜单的Activity中,重写onCreateOptionsMenu(Menu menu)方法,完成菜单初始化。
4. 在要使用该菜单的Activity中,重写onOptionsItemSelected(MenuItem item)方法,完成菜单选项点击事件,为菜单选项添加功能。
将选项菜单以图片的形式显示在ToolBar中。步骤两步:
①为选项菜单添加图标。
②将选项菜单设置到Toolbar中。这里只需要修改选项菜单格式文件中,对应Item项的app:showAsAction属性即可。
(二)内容二要求,则需要使用到Fragment、Toolbar以及选项菜单。与课件Fragment小节中第一个例子类似。具体可参见第五章课件。Fragment操作的步骤如下:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.main_root, fragment);
ft.commit();
其中第1,2,4步是固定步骤,第3步根据项目可执行添加,移除,替换碎片等操作。
在Toolbar中使用控件较为简单,可直接放入activity_main.xml布局文件的Toolbar标签中,在MainActivity中直接通过findViewById方法即可拿到。
四、实验步骤
(一)内容一
-
新建资源文件夹menu,在res/menu/文件夹中定义选项菜单的格式,这里用menu.xml命名。
①右键点击app下的res文件夹,选择New->Sample Data Directory。
图 1 新建menu文件夹
②右键点击menu文件夹,点击New->Menu Resource File,新建文件menu.xml
图 2新建文件menu.xml
③用menu.xml命名文件。
图 3 命名menu.xml
2.在activity_main.xml布局文件中使用Toolbar控件。首先,在activity_main.xml布局文件中使用Toolbar控件。
①在activity_main.xml布局文件中添加Toolbar控件,标题为“实验四”。
a.android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar": 这设置了Toolbar及其内部组件的主题为深色主题。
b.app:popupTheme="@style/ThemeOverlay.AppCompat.Light": 这设置了当你在Toolbar上显示一个上下文菜单或一个弹出菜单时所使用的主题。这里使用的是浅色主题。
<androidx.appcompat.widget.Toolbar
android:id="@+id/tool_bar"
android:layout_width="match_parent"
android:layout_height="69dp"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="实验四">
</androidx.appcompat.widget.Toolbar>
3.activity_main.xml布局文件除了有Toolbar控件,下面与前面实验类似,放“用户名”和“密码”及其输入框。修改代码如下:
①TextView "用户名:"
android:id="@+id/userName": 定义了一个唯一的ID,用于在Java或Kotlin代码中引用。
android:layout_height="48dp": 定义了高度为48密度独立像素(dp)。
android:layout_width="216px": 定义了宽度为216像素。
android:gravity="center_vertical|right": 文本在垂直方向上居中,在水平方向上靠右。
android:layout_below="@+id/title": 放置在ID为"title"的组件之下。
android:text="用户名:": 设置显示的文本为"用户名:"。
②EditText "输入用户名"
android:id="@+id/enterUserName": 定义了一个唯一的ID。
android:layout_width="864px": 定义了宽度为864像素。
android:layout_height="48dp": 定义了高度为48dp。
android:layout_below="@+id/title" 和 android:layout_alignRight="@+id/userName": 放置在ID为"userName"的TextView组件之下,并且右对齐。
android:layout_alignParentRight="true": 与其父容器的右边对齐。
android:inputType="textPersonName": 设置输入类型为个人姓名。
③TextView "密码:"
android:id="@+id/userPassword": 定义了一个唯一的ID。
其他属性与第一个TextView类似,但显示文本为"密码:"。
④EditText "输入密码"
android:id="@+id/enterPassword": 定义了一个唯一的ID。
其他属性与"输入用户名"的EditText类似,但高度设置为"wrap_content"。
android:inputType="textPassword": 设置输入类型为密码,这样输入的字符会被隐藏。
⑤Button "下一步"
android:id="@+id/confirm": 定义了一个唯一的ID。
其他属性用于定位按钮,并设置其文本为"下一步"。
⑥Button "取消"
android:id="@+id/cancel": 定义了一个唯一的ID。
其他属性用于定位按钮,并设置其文本为"取消"。这个按钮被放置在"下一步"按钮的左侧。
4.取消按钮
点击Toolbar右上角退出按钮,可以退出。当用户点击一个ID为exit的菜单项时,结束当前的活动。
public boolean onOptionsItemSelected( MenuItem item) {
int id = item.getItemId();
if(id==R.id.exit) finish();
return true;
}
①int id = item.getItemId();: 这行代码获取被点击的菜单项的ID,并将其存储在整数变量id中。
②if(id==R.id.exit) finish();: 这是一个条件判断。如果被点击的菜单项的ID与常量R.id.exit相等(这通常表示一个退出或关闭菜单项),则调用finish()方法。finish()方法会结束当前的活动(Activity),并返回到前一个活动(如果有的话)。
③return true;: 这表示该方法已经成功处理了菜单项的点击事件,不需要其他的方法再处理这个事件。如果返回false,那么系统会继续寻找其他的方法来处理这个事件。
5.修改MainActivity.java代码,声明变量,将布局文件中的Toolbar控件传递给toolbar变量。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
}
①private Toolbar toolbar;声明了一个私有成员变量toolbar,其类型为Toolbar。Toolbar是Android中用于实现Material Design风格的操作栏的一个控件。
②toolbar = findViewById(R.id.my_tool_bar);使用findViewById方法来查找布局文件中定义的ID为my_tool_bar的Toolbar控件,并将其引用赋值给toolbar变量。
③setSupportActionBar(toolbar);调用了setSupportActionBar方法,并将之前找到的toolbar作为参数传入。这会将该Toolbar设置为当前Activity的操作栏。
6.在要使用该菜单的Activity中,重写onCreateOptionsMenu(Menu menu)方法,完成菜单初始化。
在Activity中加载并创建选项菜单。它首先获取一个MenuInflater对象,然后使用这个对象来从XML资源文件中加载菜单项到传入的Menu对象中,最后返回true表示已经处理了菜单的创建。
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
①公共方法的声明,其名为onCreateOptionsMenu。它属于Activity类中的一个回调方法。当一个Activity被创建时,此方法会被自动调用,以准备Activity的选项菜单。这个方法接受一个Menu类型的参数,名为menu。这个参数用于存放将要创建的菜单项。
②getMenuInflater().inflate(R.menu.menu, menu);这行代码调用了getMenuInflater()方法,它返回一个MenuInflater对象。这个对象用于将XML菜单资源文件转换为Menu对象。
inflate()方法用于将XML菜单资源文件加载到Menu对象中。这里的第一个参数是资源的ID,即R.menu.menu,表示要加载的菜单资源文件。第二个参数是存放加载后的菜单项的Menu对象。
③return true;这行代码返回了一个布尔值true。在onCreateOptionsMenu方法中,返回true表示这个Activity已经处理了菜单的创建,系统将不再为它显示标准选项菜单。如果返回false,系统会继续显示标准选项菜单。
7.在要使用该菜单的Activity中,重写onOptionsItemSelected(MenuItem item)方法,完成菜单选项点击事件,为菜单选项添加功能。
处理在Activity的选项菜单中点击的事件。当用户点击ID为“exit”的菜单项时,当前Activity会被关闭。
public boolean onOptionsItemSelected( MenuItem item) {
int id = item.getItemId();
if(id==R.id.exit) finish();
return true;
}
①public boolean onOptionsItemSelected( MenuItem item) {公共方法的声明,其名为onOptionsItemSelected。它属于Activity类中的一个回调方法。当一个选项菜单项被点击时,此方法会被自动调用。
这个方法接受一个MenuItem类型的参数,名为item。这个参数代表被点击的菜单项。
②int id = item.getItemId();这行代码从被点击的菜单项中获取其ID,并将其存储在整数变量id中。
③if(id==R.id.exit) finish();这行代码检查被点击的菜单项的ID是否等于资源IDR.id.exit。如果是,则调用finish()方法关闭当前Activity。这通常用于实现退出功能。
④return true;这行代码返回true。在onOptionsItemSelected方法中,返回true表示该事件已被处理,而系统不会为其他菜单项或Activity的默认行为处理此事件。如果返回false,系统可能会继续处理其他菜单项或Activity的默认行为。
8.将选项菜单以图片的形式显示在ToolBar中。
①为选项菜单添加图标
首先,确保选项菜单项(通常在XML文件中定义)都有一个图标。图标通常是Drawable资源,在 res/drawable 目录下创建或获取。
<item
android:id="@+id/exit"
android:title="退出"
android:icon="@drawable/exit"
android:orderInCategory="1"
app:showAsAction="always"/>
a.android:icon="@drawable/exit":这是为菜单项设置的图标资源。这里引用了@drawable/exit,意味着图标文件名为“exit”的图像资源应该在res/drawable目录下。
b.android:orderInCategory="1":这个属性决定了菜单项的排序。数字越小,排序越前。这里设置为1,意味着这个菜单项会排在其他所有设置了orderInCategory属性的菜单项之前。
c.app:showAsAction="always":这个属性决定了菜单项如何显示。always意味着这个菜单项将始终显示在主屏幕(ActionBar)上,而不是在溢出菜单(Overflow Menu)中。
②将选项菜单设置到Toolbar中
确保你在XML菜单文件中为每个菜单项设置了正确的 app:showAsAction 属性。这个属性决定了该菜单项如何在ToolBar中显示。
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
9.运行结果
使用选项菜单,为应用程序添加退出选项。将退出选项放置在ToolBar中,具体效果如下所示,用户点击退出选项,则退出该应用。运行结果如图4
图 4添加选项菜单
(二)内容二
直接在Toolbar上放置其它控件,如TextView和ImageView。显示“登录”和“注册”按钮。
1.修改activity_main.xml布局文件,在Toolbar内添加“登录”和“注册”按钮。
<TextView
android:id="@+id/register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18dp"
android:layout_gravity="right"
android:layout_margin="10dp"
android:text="注册" />
<TextView
android:id="@+id/login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18dp"
android:layout_gravity="right"
android:text="登录" />
两个TextView都被放置在Toolbar的右侧(通过layout_gravity="right"属性)。这意味着它们会显示在工具栏的右侧,紧挨着工具栏的边缘。
2.修改MainActivity.java文件
在ID为R.id.main_root的容器中,用一个新的Fragment(fragment)替换原有的Fragment(如果有的话)。
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.main_root, fragment);
ft.commit();
①FragmentManager fm = getSupportFragmentManager();这行代码获取了MainActivity中的FragmentManager实例。FragmentManager是用于执行Fragment事务(例如添加、替换、删除等)的管理器。
② FragmentTransaction ft = fm.beginTransaction();通过FragmentManager的beginTransaction()方法,开始一个新的Fragment事务。这个事务可以包含多个对Fragment的更改,并且可以一起提交。
③ ft.replace(R.id.main_root, fragment);使用replace()方法替换容器ID为R.id.main_root的Fragment。这意味着,如果容器中已经有其他Fragment,它会被这个新的fragment替换。如果没有其他Fragment,那么这个fragment会被添加到容器中。
④ft.commit(); 提交前面所做的所有更改。这是必须的,因为只有提交事务,之前所做的更改才会实际生效。
3.运行结果
①点击“登陆”出现图5左图,要求用户输入用户名和密码,点击“取消”退出,点击右上角退出按钮也可以退出。
②点击“注册”出现图5右图,用户可以进行“爱好选择”和“性别选择”,爱好可以多选,性别只能选择一个且必须选择一个。
图 5内容二运行结果
五、实验心得
通过这次实验,我深入了解了Android开发中的选项菜单、ActionBar、ToolBar以及Fragment的使用。掌握了如何创建和显示选项菜单。选项菜单是一种用户界面元素,允许用户在应用程序中执行各种操作。通过使用onCreateOptionsMenu()和onOptionsItemSelected()方法,我可以创建和响应选项菜单项的点击事件。
学习了如何使用ToolBar。ToolBar是一种用户界面元素,提供了与ActionBar类似的功能,但具有更多的自定义选项。通过使用ToolBar,我可以更好地控制应用程序的外观和功能。以及如何使用ToolBar和Fragment设置多个标签页。Fragment是一种可重复使用的用户界面片段,可以嵌入到Activity中。通过使用Fragment和ToolBar,我可以创建多个标签页,并在这些标签页之间轻松切换。