实验四: Android 资源访问

实验四: Android 资源访问

4.1 实验目的

本次实验的目的是让大家熟悉 Android 中的资源,资源指的是代码中使用 的外部文件,这些文件作为应用程序的一部分,被编译到应用程序中。

4.2 实验要求

  • 掌握字符串资源,颜色资源和尺寸资源文件的定义和使用

  • 掌握如何通过菜单资源定义上下文菜单和选项菜单

4.3实验内容

【练习 4.1】为 ImageView 更换图片

实现本程序前需要准备两张图片, 分别存放在”/res/drawable/”文件夹与手机 文件系统的另 一个文件夹中。在本程序中两张图片文件的路径分别为 /res/drawable/img01.jpg 与/data/data/com.example.resource1/img02.jpg。程序中 会先将 drawable 目录里的图片文件显示在 ImageView 中,再设计一个 Button , 当用户单击 Button 后,将 ImageView 里的图片换成另一张存在手机文件系统里 的图形文件。好的,以下是实现该功能的详细步骤:

步骤一:准备两张图片

首先,确保你有两张要使用的图片,一张放在/res/drawable/目录下,命名为img01.jpg,另一张放在手机文件系统的另一个文件夹中,路径为/data/data/img/img02.jpg

步骤二:在布局文件中添加 TextView、ImageView 和 Button
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/activity_horizontal_margin"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/mTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/str_text" />

    <ImageView
        android:id="@+id/mImageView"
        android:layout_width="500dp"
        android:layout_height="356dp"
        android:layout_below="@id/mTextView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="16dp"
        android:src="@drawable/img01" />

    <Button
        android:id="@+id/mButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/mImageView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="16dp"
        android:text="@string/str_button"
        android:textSize="18sp" />

</RelativeLayout>

步骤三:在 MainActivity.java 中设置点击事件

打开MainActivity.java文件,并在其中添加以下代码:

package com.example.imageswitcherapp;


import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.File;

public class MainActivity extends Activity {
    private ImageView mImageView;
    private Button mButton;
    private TextView mTextView;
    private String fileName = "/data/data/img/img02.jpg";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = (Button) findViewById(R.id.mButton);
        mButton.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                mImageView = (ImageView) findViewById(R.id.mImageView);
                mTextView = (TextView) findViewById(R.id.mTextView);

                File f = new File(fileName);
                if (f.exists()) {
                    Bitmap bm = BitmapFactory.decodeFile(fileName);
                    mImageView.setImageBitmap(bm);
                    mTextView.setText(fileName);
                } else {
                    mTextView.setText("文件不存在");
                }
            }
        });
    }
}
步骤四:处理文件系统权限

要访问/data/data/com.example.resource1/img02.jpg,你可能需要相应的文件系统权限。请确保你的应用程序在 AndroidManifest.xml 文件中具有相应的权限声明。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
步骤五:在 AndroidManifest.xml 中声明 Activity

确保在AndroidManifest.xml文件中声明了你的Activity,类似于以下代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.imageswitcherapp">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 将权限声明放在这里 -->

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ImageSwitcherApp">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
步骤六:运行应用程序

现在可以构建并运行你的应用程序。当点击按钮时,ImageView 将会切换显示两张不同的图片。

image-20231103150347558

image-20231103150620417

【练习 4.2】运用上下文菜单

编写 Android 项目,实现带子菜单的上下文菜单。

步骤一:创建项目
  1. 在 Android Studio 中创建一个新的 Android 项目,并命名为 MenuApp
步骤二:准备资源文件
  1. res 目录下创建一个 menu 目录。
  2. menu 目录中创建一个名为 contextmenu.xml 的菜单资源文件。

contextmenu.xml 文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/color1"
        android:title="红色">
    </item>
    <item
        android:id="@+id/color2"
        android:title="绿色">
    </item>
    <item
        android:id="@+id/color3"
        android:title="蓝色">
    </item>
    <item
        android:id="@+id/color4"
        android:title="橙色">
    </item>
    <item
        android:id="@+id/color5"
        android:title="恢复默认">
    </item>
    <item
        android:id="@+id/item2"
        android:alphabeticShortcut="e"
        android:title="其他颜色">
        <menu>
            <group
                android:id="@+id/other" >
                <item
                    android:id="@+id/other1"
                    android:title="橄榄色">
                </item>
                <item
                    android:id="@+id/other2"
                    android:title="水绿色">
                </item>
            </group>
        </menu>
    </item>
</menu>
步骤三:创建布局文件
  1. 打开 activity_main.xml 文件,将以下代码添加到布局文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5px"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/show"
        android:textSize="60px"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="打开菜单..." />
</LinearLayout>
步骤四:编写 Java 代码
  1. 打开 MainActivity.java 文件,将以下代码添加到文件中:
package com.example.menu;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.show);
        registerForContextMenu(tv);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.contextmenu, menu);
        menu.setHeaderIcon(R.drawable.ic_launcher);
        menu.setHeaderTitle("请选择文字颜色: ");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getGroupId() == R.id.other) {
            if (item.getItemId() == R.id.other1) {
                tv.setTextColor(Color.rgb(118, 146, 60));
            } else if (item.getItemId() == R.id.other2) {
                tv.setTextColor(Color.rgb(0, 255, 255));
            }
        } else {
            switch (item.getItemId()) {
                case R.id.color1:
                    tv.setTextColor(Color.rgb(255, 0, 0));
                    break;
                case R.id.color2:
                    tv.setTextColor(Color.rgb(0, 255, 0));
                    break;
                case R.id.color3:
                    tv.setTextColor(Color.rgb(0, 0, 255));
                    break;
                case R.id.color4:
                    tv.setTextColor(Color.rgb(255, 180, 0));
                    break;
                default:
                    tv.setTextColor(Color.rgb(255, 255, 255));
            }
        }
        return true;
    }
}
步骤五:运行应用程序

image-20231103153944310

4.4 扩展练习

  1. 编写 Android 程序,实现带子菜单的选项菜单

步骤一:创建一个新的 Android 项目

  1. 在 Android Studio 中创建一个新的 Android 项目,命名为 OptionsMenuApp

步骤二:准备资源文件

  1. res/menu 目录下创建一个名为 options_menu.xml 的菜单资源文件。

options_menu.xml 文件内容如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/file_menu"
        android:title="文件">
        <menu>
            <item
                android:id="@+id/open_file"
                android:title="打开文件" />
            <item
                android:id="@+id/save_file"
                android:title="保存文件" />
        </menu>
    </item>
    <item
        android:id="@+id/edit_menu"
        android:title="编辑">
        <menu>
            <item
                android:id="@+id/copy"
                android:title="复制" />
            <item
                android:id="@+id/paste"
                android:title="粘贴" />
        </menu>
    </item>
</menu>

步骤三:在 MainActivity.java 中实现选项菜单

  1. 打开 MainActivity.java 文件。

  2. onCreate 方法之后,添加以下代码来重写创建选项菜单的方法:

package com.example.optionsmenuapp;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.open_file:
                openFile();
                return true;
            case R.id.save_file:
                saveFile();
                return true;
            case R.id.copy:
                copyText();
                return true;
            case R.id.paste:
                pasteText();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private void openFile() {
        // 处理打开文件的逻辑
        Toast.makeText(this, "打开文件", Toast.LENGTH_SHORT).show();
    }

    private void saveFile() {
        // 处理保存文件的逻辑
        Toast.makeText(this, "保存文件", Toast.LENGTH_SHORT).show();
    }

    private void copyText() {
        // 处理复制文本的逻辑
        Toast.makeText(this, "复制文本", Toast.LENGTH_SHORT).show();
    }

    private void pasteText() {
        // 处理粘贴文本的逻辑
        Toast.makeText(this, "粘贴文本", Toast.LENGTH_SHORT).show();
    }
}

步骤四:在布局文件中添加一个 TextView

  1. 打开 activity_main.xml 文件,并在布局中添加一个 TextView
<TextView
    android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello, Options Menu!"
    android:layout_gravity="center"
    android:textSize="24sp"/>

步骤五:运行应用程序

image-20231103160433217

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/115553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第五部分:Tomcat

5.1&#xff1a;JavaWeb 5.1.1&#xff1a;JavaWeb的概念 ①什么是JavaWeb? JavaWeb是指所有通过Java语言编写可以通过浏览器访问的程序的总称 JavaWeb是基于请求和响应来开发的 ②什么是请求&#xff1f; 请求是指客户端给服务器发送数据&#xff0c;叫请求Request ③什么是…

时空智友企业流程化管控系统文件存在任意文件上传漏洞

时空智友企业流程化管控系统文件存在任意文件上传漏洞 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: app"时空智友V10.1" 漏洞复现1. 构造poc2. 发送数据包&#xff0c;上传文件3. 访问webshellwebshell地址 免责声明 仅用于技术交流,目的是向相关安全人员展示漏…

NUUO网络摄像头(NVR)RCE漏洞复现

简介 NUUO Network Video Recorder&#xff08;NVR&#xff09;是中国台湾NUUO公司的一款网络视频记录器。 NUUO NVR视频存储管理设备的__debugging_center_utils___.php文件存在未授权远程命令执行漏洞&#xff0c;攻击者可在没有任何权限的情况下通过log参数执行任意命令。…

【产品经理从0到1】ID(工业设计)知识构建

目录 一、ID知识架构思维导图 ​二、3D打印设计工具 导语&#xff1a;作为一个硬件产品经理&#xff0c;虽然不需要自己进行工业设计&#xff0c;但是若要对产品外观和品质细节进行更深入和准确的把控&#xff0c;就需要了解工业设计的相关知识。 一、ID知识架构思维导图 二、…

JavaScript(WebAPI)

文章目录 什么是WebAPIDOM 基本概念DOM 树事件 操作元素获取/修改元素内容获取/修改元素属性获取/修改表单元素属性获取/修改样式属性 网页版猜数字游戏实现一个表白墙 什么是WebAPI 前面学习的 JS 分成三个大的部分 ECMAScript: 基础语法部分DOM API: 操作页面结构BOM API: …

两天实现思维导图的协同编辑?用Yjs真的可以

最近使用 Yjs 给自己开源的一个思维导图加上了协同编辑的功能&#xff0c;得益于该框架的强大&#xff0c;一直觉得很复杂的协同编辑能力没想到实现起来异常的简单&#xff0c;所以通过本文来安利给各位。 要实现协同编辑&#xff0c;目前主要有两种算法&#xff0c;一是 OT&a…

关于Intel Press出版的《Bedyong BIOS》第2版的观后感

文章目录 此书的背景UEFI运行时DXE基础CPU架构协议PCI协议UEFI驱动的初始化串口DXE驱动示例 《Beyond BIOS》首先介绍一个简单的UEFI应用程序模块&#xff0c;用于展示UEFI应用程序的行为。作者为Waldo。该模块名为“InitializeHelloApplication”&#xff0c;它接受两个参数&a…

【Mysql】Mysql中表连接的原理

连接简介 在实际工作中&#xff0c;我们需要查询的数据很可能不是放在一张表中&#xff0c;而是需要同时从多张表中获取。下面我们以简单的两张表为例来进行说明。 连接的本质 为方便测试说明&#xff0c;&#xff0c;先创建两个简单的表并给它们填充一点数据&#xff1a; …

保障效率与可用,分析Kafka的消费者组与Rebalance机制

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

react+canvas实现横跨整个页面的动态的波浪线(贝塞尔曲线)

本来写这个特效 我打算用css实现的&#xff0c;结果是一波三折&#xff0c;我太难了&#xff0c;最终没能用css实现&#xff0c;转战了canvas来实现。来吧先看效果图 当然这个图的波浪高度、频率、位置、速度都是可调的&#xff0c;请根据自己的需求调整&#xff0c;如果你讲波…

windows10系统-17-文献管理软件

参考诸多文献管理软件的优劣比较如何&#xff1f;你有哪些使用心得&#xff1f; 参考我愿称之为目前最好用的文献管理和阅读软件&#xff01;readpaper 1 文献总结 文献总结是非常重要的一项技能&#xff0c;不知道大家看完文献后有没有总结文献的习惯&#xff0c;有的话那挺…

数据仓库-拉链表

在数据仓库中制作拉链表&#xff0c;可以按照以下步骤进行&#xff1a; 确定需求&#xff1a;首先明确需要使用拉链表的场景和需求。例如&#xff0c;可能需要记录历史数据的变化&#xff0c;以便进行时间序列分析等。设计表结构&#xff1a;在数据仓库中&#xff0c;拉链表通…

Web自动化测试 —— PageObject设计模式!

一、page object 模式简介 1.1、传统 UI 自动化的问题 无法适应 UI 频繁变化无法清晰表达业务用例场景大量的样板代码 driver/find/click 二、page object 设计原则 2.1、POM 模式的优势 降低 UI 变化导致的测试用例脆弱性问题让用例清晰明朗&#xff0c;与具体实现无关 2.…

JVM常用命令

jps —查看pid jstat -gcutil 4364 1000 2000 —查看堆内存占用百分比&#xff0c;每秒打印1次&#xff0c;总共打印2000次 S0&#xff1a;幸存1区当前使用比例 S1&#xff1a;幸存2区当前使用比例 E&#xff1a;伊甸园区使用比例 O&#xff1a;老年代使用比例 M&#xff1a;元…

服务Service

一、服务概述 Service(服务)是Android四大组件之一&#xff0c;是能够在后台长时间执行操作并且不是供用户界面的应用程序组件。Senice可以与其他组件进行交互&#xff0c;一般由Activity启动&#xff0c;但是并不依赖于Activity。当Activity的生命周期结束时&#xff0c;Serv…

野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍

STM32入门——基于野火 F407 霸天虎课程学习 前言 博主开始探索嵌入式以来&#xff0c;其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪&#xff0c;不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科…

学Python,一个月从小白到大神?看你怎么学!

Python是一门超强大而且超受欢迎的编程语言。它被用在各种领域&#xff0c;比如网站开发、数据分析、人工智能和机器学习。学会Python会给你创造很多职业机会&#xff0c;所以绝对是值得一试的。 但你有没有过这样的梦想&#xff1a;一个月时间&#xff0c;从Python小白变成Py…

Docker DeskTop安装与启动(Windows版本)

一、官网下载Docker安装包 Docker官网如下&#xff1a; Docker官网不同操作系统下载页面https://docs.docker.com/desktop/install/windows-install/ 二、安装Docker DeskTop 2.1 双击 Docker Installer.exe 以运行安装程序 2.2 安装操作 默认勾选&#xff0c;具体操作如下…

页面淘汰算法模拟实现与比较

1.实验目标 利用标准C 语言&#xff0c;编程设计与实现最佳淘汰算法、先进先出淘汰算法、最近最久未使用淘汰算法、简单 Clock 淘汰算法及改进型 Clock 淘汰算法&#xff0c;并随机发生页面访问序列开展有关算法的测试及性能比较。 2.算法描述 1. 最佳淘汰算法&#xff08;Op…

编写shell脚本,利用mysqldump实现mysql数据库分库分表备份

摘要&#xff1a;本文介绍了如何使用 Shell 脚本和 mysqldump 工具实现 MySQL 数据库的分库分表备份。通过编写脚本&#xff0c;我们可以自动化备份多个数据库以及每个数据库中的所有表&#xff0c;并将备份文件按照数据库和表的层次结构进行存储。 一、准备工作 在开始编写 Sh…