实验四: 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 将会切换显示两张不同的图片。
【练习 4.2】运用上下文菜单
编写 Android 项目,实现带子菜单的上下文菜单。
步骤一:创建项目
- 在 Android Studio 中创建一个新的 Android 项目,并命名为
MenuApp
。
步骤二:准备资源文件
- 在
res
目录下创建一个menu
目录。 - 在
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>
步骤三:创建布局文件
- 打开
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 代码
- 打开
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;
}
}
步骤五:运行应用程序
4.4 扩展练习
- 编写 Android 程序,实现带子菜单的选项菜单
步骤一:创建一个新的 Android 项目
- 在 Android Studio 中创建一个新的 Android 项目,命名为
OptionsMenuApp
。
步骤二:准备资源文件
- 在
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 中实现选项菜单
-
打开
MainActivity.java
文件。 -
在
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
- 打开
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"/>