移动应用程序设计——课程实验

实验一

课    程

移动应用程序设计

实验项目

Android Studio基础

一、实验目的

  1. 熟悉Android Studio开发工具的基本使用
  2. 理解Android APP工程的目录结构
  3. 能编写简单的APP应用程序

二、实验任务

  1. Android Studio环境配置
  2. 介绍APP工程的目录结构
  3. 编写古诗鉴赏App
  4. 模拟Activity生命周期

三、实验环境

PC机、Android Studio

四、实验内容

1 Android Studio环境配置

1.1 SDK配置

安装SDK8.0和SDK11两个版本

过程截图:

1.2 AVD配置

安装模拟器:Nexus 6,Android8.0,x86

过程截图:

2 介绍APP工程的目录结构

2.1 创建一个APP工程

创建基于:API Android8.0、Empty Activity模板

2.2 介绍APP工程的目录结构

分别介绍Manifest.xml、MainActivity、res文件夹各个文件

介绍并截图:

App工程分为两个层次,第一个层次是项目,另一个层次是模块。模块依附于项目,每个项目至少有一个模块,也能拥有多个模块

2.3 介绍Gradle构建工具

介绍并截图:

Gradle Scripts下面主要是工程的编译配置文件。Gradle是一个项目自动化构建工具,有着依赖、打包、部署、发布、各种渠道的差异管理等作用。

2.4 APP运行后显示一段文字“我的第一个App”

关键源码

avtiviy_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我的第一个App"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActiviy.java

​
package com.example.demo01;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

​

运行截图:

3 编写古诗鉴赏App

3.1 编写程序,实现如下功能:

3.2 代码实现

activity_ancient_poetry.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:background="@mipmap/bg">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/ap_title"
        android:layout_margin="5dp"
        android:textSize="21sp"
        android:textStyle="bold"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/ap_author"
        android:layout_margin="5dp"
        android:textSize="18sp"
        android:textStyle="bold"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/ap_content1"
        android:layout_margin="5dp"
        android:textSize="22sp"
        android:textStyle="bold"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/ap_content2"
        android:layout_margin="5dp"
        android:textSize="22sp"
        android:textStyle="bold"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/ap_content3"
        android:layout_margin="5dp"
        android:textSize="22sp"
        android:textStyle="bold"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/ap_content4"
        android:layout_margin="5dp"
        android:textSize="22sp"
        android:textStyle="bold"
        />

</LinearLayout>

AncientPoetryActivity.java

package com.example.demo01;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class AncientPoetryActivity extends AppCompatActivity {

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

strings.xml

<resources>
    <string name="app_name">Demo01</string>
    <string name="ap_title">《出塞》</string>
    <string name="ap_author">王昌龄</string>
    <string name="ap_content1">秦时明月汉时关</string>
    <string name="ap_content2">万里长征人未还</string>
    <string name="ap_content3">但使龙城飞将在</string>
    <string name="ap_content4">不教胡马度阴山</string>
</resources>

3.3 运行结果

4 模拟Activity生命周期

4.1 编写程序,实现如下功能:

通过Log日志记录Activity的生命周期

(为按钮添加事件实现两个Activity跳转)

4.2 代码实现

 新建一个module:lifetest。新建两个empyt activity

AndroidManifest.xml

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

    <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.Demo01">
        <activity
            android:name=".ActFinishActivity"
            android:exported="false" />
        <activity
            android:name=".ActStartActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

activity_acr_start.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:background="@mipmap/bj">
        <Button
            android:id="@+id/btn_act_next"
            android:layout_width="200dp"
            android:layout_height="60dp"
            android:text="@string/app_jump"
            android:textSize="20sp"
            />

</LinearLayout>

ActStartActivity.java

package com.example.lifetest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class ActStartActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "ning";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.d(TAG,"ActStartActivity onCreate");

        setContentView(R.layout.activity_act_start);
        findViewById(R.id.btn_act_next).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        startActivity(new Intent(this,ActFinishActivity.class));
    }


    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"ActStartActivity onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"ActStartActivity onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"ActStartActivity onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"ActStartActivity onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"ActStartActivity onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG,"ActStartActivity onRestart");
    }
}

activity_acr_finish.xml

?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@mipmap/bj">
        <ImageView
            android:layout_width="227dp"
            android:layout_height="380dp"
            android:layout_gravity="center"
            android:layout_margin="50dp"
            android:src="@drawable/om"
            />

        <Button
            android:id="@+id/btn_act_back"
            android:layout_width="150dp"
            android:layout_height="60dp"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="@string/app_back"
            android:textSize="20sp"
            />

</LinearLayout>

ActFinishActivity.java

package com.example.lifetest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;

public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_finish);
        findViewById(R.id.btn_act_back).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        finish();
    }
}

strings.xml

<resources>
    <string name="app_name">LifeTest</string>
    <string name="app_jump">查看图片</string>
    <string name="app_back">返回</string>
</resources>
</resources>

4.3 运行结果

建立过滤器“ning”,查看标签为“ning”的日志输出。

点击发布运行

点击“查看图片”

点击返回

点击系统左边按钮,返回桌面

在点击“查看图片后”,迅速点击系统左边按钮(即在界面1没完全消失时,又跳回界面1)

当后台有优先运行的应用程序且需要内存时,则onStop——>onCreate,此情况不方便演示。

实验二

课    程

移动应用程序设计

实验项目

界面布局

一、实验目的

  1. 熟悉Android Studio开发工具使用
  2. 理解常用布局使用规则
  3. 能设计不同布局的APP应用程序

二、实验任务

  1. LinearLayout应用
  2. GridLayout+FrameLayout应用
  3. ConstraintLayout应用

三、实验环境

PC机、Android Studio

四、实验内容

1 LinearLayout应用 

1.1 编写程序,实现如下功能:

      应用LinearLayout布局实现发送邮件界面,邮件内容为“学号+姓名” 。要求:(1).使用hint属性;(2).使用string.xml引用字符串

1.2 代码实现

activity_linearlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:inputType="textEmailAddress"
            android:ems="20"
            android:hint="@string/app_to"
            android:textColor="@color/black"
            android:textSize="18sp" />
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:inputType="text"
            android:ems="30"
            android:hint="@string/app_sub"
            android:textColor="@color/black"
            android:textSize="18sp"
            />
        <EditText
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:layout_marginTop="5dp"
            android:inputType="textMultiLine"
            android:hint="@string/app_CRY"
            android:gravity="start|top"
            android:textColor="@color/black"
            android:textSize="18sp"
            />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
                <Button
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginLeft="6dp"
                    android:layout_marginRight="3dp"
                    android:text="@string/app_btn1"
                    android:textSize="18sp"
                    />
                <Button
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:layout_marginLeft="3dp"
                    android:layout_marginRight="6dp"
                    android:text="@string/app_btn2"
                    android:textSize="18sp"
                    />
        </LinearLayout>

</LinearLayout>

strings.xml

<resources>
    <string name="app_name">DEmo02</string>
    <string name="app_to">收件人</string>
    <string name="app_sub">主题</string>
    <string name="app_CRY">邮件内容</string>
    <string name="app_btn1">存为草稿</string>
    <string name="app_btn2">发送</string>
</resources>

1.3 运行结果

2 GridLayout+FrameLayout应用

2.1 编写程序,实现如下功能:

      应用GridLayout和FrameLayout布局实现APP程序总览界面,具体APP名称自拟。

要求:(1). 使用ImageView显示图片;(2). FrameLayout实现背景图片; (3).

2.2 代码实现

activity_gflayout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/bgc"
            />
        <GridLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:columnCount="4"
            android:rowCount="5"
            android:padding="15dp">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                    <ImageView
                        android:layout_width="80dp"
                        android:layout_height="80dp"
                        android:padding="10dp"
                        android:src="@drawable/phone"
                        />
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="10dp"
                        android:text="Phone"
                        android:textSize="12sp"
                        />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/content"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Content"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/message"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Message"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/browser"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Browser"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/camera"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Camera"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/gallery"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Gallery"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/calculator"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Calculator"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/email"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Email"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/market"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Market"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/map"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Map"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/calendar"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Calender"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/clock"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Clock"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/music"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Music"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/theme"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Theme"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/setting"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Setting"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/folder"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Folder"
                    android:textSize="12sp"
                    />
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center">
                <ImageView
                    android:layout_width="80dp"
                    android:layout_height="80dp"
                    android:padding="10dp"
                    android:src="@drawable/open"
                    />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="10dp"
                    android:text="Safe"
                    android:textSize="12sp"
                    />
            </LinearLayout>

        </GridLayout>

</FrameLayout>

2.3 运行结果

3 ConstraintLayout应用

3.1 编写程序,实现如下功能:

应用ConstraintLayout布局实现查看信息详情界面

要求:(1). 使用ImageView显示图片;(2).定义字体大小和字体颜色;(3).通过color.xml引用颜色值

3.2 代码实现

activity_constraintlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/image"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:padding="15dp"
        app:srcCompat="@drawable/googleplay"

        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />
    
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="@string/app_title"
        android:textSize='14sp'
        android:gravity="center"

        app:layout_constraintStart_toEndOf="@id/image"
        app:layout_constraintTop_toTopOf="@id/image"
        />

    <TextView
        android:id="@+id/content"
        android:layout_width="256dp"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:textSize='14sp'
        android:text="@string/app_content"
        android:lineSpacingMultiplier="1.2"

        app:layout_constraintStart_toStartOf="@id/title"
        app:layout_constraintTop_toBottomOf="@id/title"
        />

    <TextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_date"
        android:textSize='11sp'

        app:layout_constraintEnd_toEndOf="@id/content"
        app:layout_constraintBaseline_toBaselineOf="@id/title"
        />
    
    <TextView
        android:id="@+id/reply"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="15dp"
        android:text="@string/app_reply"
        android:textSize='13sp'
        android:textColor='#3592c4'
        android:textStyle='bold'

        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@id/content"
        />

    <TextView
        android:id="@+id/convey"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="15dp"
        android:text="@string/app_convey"
        android:textSize='13sp'
        android:textColor='#3592c4'
        android:textStyle='bold'
        android:gravity="center"

        app:layout_constraintEnd_toEndOf="@id/title"
        app:layout_constraintTop_toTopOf="@id/reply"
        />
</androidx.constraintlayout.widget.ConstraintLayout>

strings.xml

​
<resources>
    <string name="app_name">DEmo02</string>
    <string name="app_to">收件人</string>
    <string name="app_sub">主题</string>
    <string name="app_CRY">邮件内容</string>
    <string name="app_btn1">存为草稿</string>
    <string name="app_btn2">发送</string>
    <string name="app_title">什么是Android操作系统</string>
    <string name="app_date">2022-9-20</string>
    <string name="app_reply">回复</string>
    <string name="app_content">Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。</string>

​

3. 运行结果

实验三

课    程

移动应用程序设计

实验项目

UI控件及

事件响应

一、实验目的

  1. 熟悉Android Studio开发工具使用
  2. 理解事件监听方法
  3. 能根据常用控件设计的APP应用程序

二、实验任务

  1. 常用控件应用
  2. 事件监听应用
  3. Spinner控件应用

三、实验环境

PC机、Android Studio

四、实验内容

1 常用控件应用

1.1 编写程序,实现如下功能:

      设计一个用户登录的App,模拟用户通过账号或邮箱地址进行登录,并判断用户账号及密码是否正确,并给出相应的登录提示。登录界面提供账号,密码及登录类型的输入,单击登录按钮后,后台根据用户选择的类型,进行账号或邮件地址进行登录验证,并给出相关的登录提示。

假设后台的账号和密码是固定的,如:

内置账号:zhangsan  内置密码:123456

内置账号:zhangsan@163.com  内置密码:12345678

 要求:(1).使用hint属性;(2).使用Toast提示登录结果

1.2 代码实现

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".loginActivity">
    <TextView
        android:id="@+id/login_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text='@string/login_title'
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <EditText
        android:id="@+id/identity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:hint="@string/identity"
        android:inputType="text"
        app:layout_constraintTop_toBottomOf="@id/login_title"
        app:layout_constraintStart_toStartOf="parent"/>
    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:hint="@string/password"
        android:inputType="numberPassword"
        app:layout_constraintTop_toBottomOf="@id/identity"
        app:layout_constraintStart_toStartOf="@id/identity"/>
    <RadioGroup
        android:id="@+id/login_ways"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintTop_toBottomOf="@id/password"
        app:layout_constraintStart_toStartOf="@id/password">
        <RadioButton
            android:id="@+id/way1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/login_ways01"
            android:textSize="14sp"/>
        <RadioButton
            android:id="@+id/way2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/login_ways02"
            android:textSize="14sp"/>
    </RadioGroup>
    <CheckBox
        android:id="@+id/ls"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/ls"
        android:textSize="15sp"
        app:layout_constraintStart_toStartOf="@id/login_ways"
        app:layout_constraintTop_toBottomOf="@id/login_ways"/>
    <Button
        android:id="@+id/login_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/login"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/ls"/>

</androidx.constraintlayout.widget.ConstraintLayout>

loginActivity.java

package com.example.demo03;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;

public class loginActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener {

    private EditText identity;
    private EditText password;
    private String select;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        RadioGroup login_ways = findViewById(R.id.login_ways);
        login_ways.setOnCheckedChangeListener(this);
        identity = findViewById(R.id.identity);
        password = findViewById(R.id.password);
        Button login_btn = findViewById(R.id.login_btn);
        login_btn.setOnClickListener(this);

    }


    @Override
    public void onClick(View view) {
        String an = identity.getText().toString();
        String pw = password.getText().toString();


        String nameText ="zhangsan";
        String pw1 = "123456";
        String email ="zhangsan@163.com";
        String pw2 = "12345678";

        if((select.equals("用户名登录") && an.equals(nameText) && pw.equals(pw1)) || (select.equals("邮箱地址登录") &&an.equals(email) && pw.equals(pw2))){
            Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(this,"登录失败",Toast.LENGTH_SHORT).show();
        }

    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
        switch (i){
            case R.id.way1:
                select = "用户名登录";
                break;
            case R.id.way2:
                select = "邮箱地址登录";
                break;

        }
    }
}

strings.xml

resources>
    <string name="app_name">Demo03</string>
    <string name="login_title">用户登录</string>
    <string name="identity">账号</string>
    <string name="password">密码</string>
    <string name="login_ways01">用户名登录</string>
    <string name="login_ways02">邮箱地址登录</string>
    <string name="ls">记住登录状态</string>
    <string name="login">登录</string>
</resources>

1.3 运行结果

2 事件监听应用

2.1 编写程序,实现如下功能:

      设计一个应用程序,包含1个EditText,1个TextView,1个Button。在EditText输入框中输入银行卡号,输入的同时用较大字体四个一组分隔在TextView显示出来。点击清空button时,所有数据清空。

要求:(1). 使用OnKeyListener监听;(2)监听到响应事件类型KeyEvent为KeyEvent.ACTION_UP才分割显示

2.2 代码实现

avtivity_lisener.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".lisenerActivity">
    <EditText
        android:id="@+id/ccb"
        android:layout_width="380dp"
        android:layout_height="wrap_content"
        android:hint="@string/ccb"
        android:inputType="number"
        android:layout_marginTop="60dp"
        android:ems="20"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <TextView
        android:id="@+id/fg"
        android:layout_width="380dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:padding="5dp"
        android:textSize="20sp"
        android:textColor="#999999"
        app:layout_constraintStart_toStartOf="@+id/ccb"
        app:layout_constraintTop_toBottomOf="@+id/ccb" />

    <Button
        android:id="@+id/clc_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="40dp"
        android:text="@string/clc"
        android:textSize="16sp"
        app:layout_constraintStart_toStartOf="@id/fg"
        app:layout_constraintTop_toBottomOf="@id/fg" />


</androidx.constraintlayout.widget.ConstraintLayout>

lisenerActivity.java

package com.example.demo03;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.view.View.OnKeyListener;

public class lisenerActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText ccb = null;
    private TextView fg = null;
//    private String keyCode = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lisener);

        ccb =findViewById(R.id.ccb);
        fg = findViewById(R.id.fg);
        ccb.setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View view, int keyCode, KeyEvent event) {
                switch (event.getAction()){
                    case KeyEvent.ACTION_UP:
                        String sr = ccb.getText().toString();
                        fg.setText(Subs(sr));
                        break;
                    case KeyEvent.ACTION_DOWN:
                        break;
                }

                return false;
            }
            private String Subs(String numb){
                String news = " ";
                for(int i=0;i<=numb.length()/4;i++){
                    if(i*4+4<numb.length()){
                        news = news + numb.substring(i*4,Math.min(i*4+4,numb.length())) + " ";
                    }
                    else {
                        news = news + numb.substring(i*4,Math.min(i*4+4,numb.length()));
                    }
                }
                return news;
            }
        });

        Button clc_btn = findViewById(R.id.clc_btn);
        clc_btn.setOnClickListener(this);


    }

    @Override
    public void onClick(View view) {
        ccb.setText(null);
        fg.setText(null);
    }
}

strings.xml

<resources>
    <string name="app_name">Demo03</string>
    <string name="login_title">用户登录</string>
    <string name="identity">账号</string>
    <string name="password">密码</string>
    <string name="login_ways01">用户名登录</string>
    <string name="login_ways02">邮箱地址登录</string>
    <string name="ls">记住登录状态</string>
    <string name="login">登录</string>
    <string name="ccb">请输入银行卡号</string>
    <string name="clc">清空</string>
</resources>

2.3 运行结果

3 Spinner控件应用

3.1 编写程序,实现如下功能:

UI界面由1个EditText、2个按钮、1个Spinner控件组成。当用户EditText中输入内容,点击“添加”按钮,能够将其动态添加到Spinner中;当用户在Spinner列表中点击某项时,选项文本内容显示在EditText中, 如果点击“删除”按钮,能够将该项从Spinner项中删除。为Spinner添加事件,使用Toast显示选择内容

3.2 代码实现

activity_spinner.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".spinnerActivity">
    <EditText
        android:id="@+id/et"
        android:layout_width="380dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dp"
        android:hint="@string/input"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <Spinner
        android:id="@+id/select"
        android:layout_width="380dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        app:layout_constraintStart_toStartOf="@+id/et"
        app:layout_constraintTop_toBottomOf="@+id/et" />

    <Button
        android:id="@+id/add_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        android:text="@string/add"
        android:textSize="16sp"
        app:layout_constraintStart_toStartOf="@+id/select"
        app:layout_constraintTop_toBottomOf="@+id/select" />

    <Button
        android:id="@+id/delete_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        android:text="@string/delete"
        android:textSize="16sp"
        app:layout_constraintEnd_toEndOf="@+id/select"
        app:layout_constraintTop_toBottomOf="@+id/select" />


</androidx.constraintlayout.widget.ConstraintLayout>

spinnerAvtivity.java

package com.example.demo03;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Collections;

public class spinnerActivity extends AppCompatActivity {

    private EditText et;
    private ArrayList<String> languageList = new ArrayList<>();
    ArrayAdapter<String> arrayAdapter;
    private String selectContent = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spinner);
        et = findViewById(R.id.et);
        String languageArr[] = getResources().getStringArray(R.array.language);
        Collections.addAll(languageList,languageArr);
        final Spinner select = findViewById(R.id.select);
        arrayAdapter = new ArrayAdapter<>(spinnerActivity.this, com.google.android.material.R.layout.support_simple_spinner_dropdown_item,languageList);
        select.setAdapter(arrayAdapter);

        select.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String s = ((Spinner)adapterView).getSelectedItem().toString();
                et.setText(s);
                selectContent = s;
                Toast.makeText(spinnerActivity.this,s, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
        Button add_btn = findViewById(R.id.add_btn);
        add_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String input = et.getText().toString();
                languageList.add(input);
            }
        });
        Button delete_btn = findViewById(R.id.delete_btn);
        delete_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (languageList.contains(selectContent)){
                    languageList.remove(selectContent);
                }
            }
        });
    }
}

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="language">
        <item>C语言</item>
        <item>C++</item>
        <item>C#</item>
    </string-array>
</resources>

strings.xml

<resources>
    <string name="app_name">Demo03</string>
    <string name="login_title">用户登录</string>
    <string name="identity">账号</string>
    <string name="password">密码</string>
    <string name="login_ways01">用户名登录</string>
    <string name="login_ways02">邮箱地址登录</string>
    <string name="ls">记住登录状态</string>
    <string name="login">登录</string>
    <string name="ccb">请输入银行卡号</string>
    <string name="clc">清空</string>
    <string name="input">请输入内容</string>
    <string name="add">添加</string>
    <string name="delete">删除</string>
</resources>

3.3 运行结果

实验四

课    程

移动应用程序设计

实验项目

对话框、菜单及消息通知

一、实验目的

  1. 熟悉Android Studio开发工具使用
  2. 理解事件监听方法
  3. 能根据常用控件、对话框、消息通知、菜单设计的APP应用程序

二、实验任务

  1. 常用控件应用
  2. 提示对话框和日期选择对话框应用
  3. 消息提醒应用
  4. 菜单应用

三、实验环境

PC机、Android Studio

四、实验内容

1 常用控件应用 

1.1 编写程序,实现如下功能:

      设计一个用于注册的APP。要求界面中的注册项包括:用户名、账号、密码、性别、出生年月日、爱好:

  1. 用户名框中只能输入大写字母;
  2. 账号框只能输入数字;
  3. 密码框不可显示明文;
  4. 性别用单选按钮,默认选中“男”;
  5. 出生年月日使用日期选择对话框输入,默认值为当前日期;
  6. 爱好用多选框实现,至少要有4个选项,默认选中第一个和第二个选项;
  7. 界面中有一个“注册”按钮,“注册”按钮要水平居中。
  8. 用户点击“注册”按钮后,显示状态栏提醒Notification消息,消息的标题为“注册完成”,消息中包括注册的用户名-性别-爱好-年/月/日

要求:(1).使用hint属性;(2).使用属性digits 。

例如:android:digits="0123456789" 表示只能输入数字

1.2 代码实现

activity_register.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".registerActivity">
    <TextView
        android:id="@+id/rg_title"
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:layout_marginTop="25dp"
        android:background="@color/blue"
        android:gravity="center"
        android:text="@string/register"
        android:textColor="@color/white"
        android:textSize="28sp"
        android:textStyle="bold"
        android:typeface="serif"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <TextView
        android:id="@+id/un_tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="50dp"
        android:text="@string/user_name"
        android:textColor="@color/grey"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/rg_title" />
    <EditText
        android:id="@+id/et_un"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:inputType="text"
        android:hint="请输入用户名"
        android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        app:layout_constraintStart_toEndOf="@+id/un_tag"
        app:layout_constraintBaseline_toBaselineOf="@+id/un_tag"/>
    <TextView
        android:id="@+id/an_tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/a_n"
        android:textColor="@color/grey"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/un_tag"
        app:layout_constraintTop_toBottomOf="@+id/et_un"/>
    <EditText
        android:id="@+id/et_an"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:hint="请输入账号"
        android:digits="0123456789"
        app:layout_constraintStart_toEndOf="@+id/un_tag"
        app:layout_constraintBaseline_toBaselineOf="@+id/an_tag"/>
    <TextView
        android:id="@+id/pw_tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/password"
        android:textColor="@color/grey"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/an_tag"
        app:layout_constraintTop_toBottomOf="@+id/et_an"/>
    <EditText
        android:id="@+id/et_pw"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:inputType="textPassword"
        app:layout_constraintStart_toEndOf="@+id/un_tag"
        app:layout_constraintBaseline_toBaselineOf="@+id/pw_tag"/>
    <TextView
        android:id="@+id/sex_tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/gender"
        android:textColor="@color/grey"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/pw_tag"
        app:layout_constraintTop_toBottomOf="@+id/et_pw"/>
    <RadioGroup
        android:id="@+id/rg_sex"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="20dp"
        app:layout_constraintStart_toEndOf="@+id/un_tag"
        app:layout_constraintTop_toBottomOf="@+id/et_pw">
            <RadioButton
                android:id="@+id/rb_male"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="true"
                android:text="男"
                android:textColor="@color/grey"
                android:textSize="17sp" />
            <RadioButton
                android:id="@+id/rb_female"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:checked="false"
                android:text="女"
                android:textColor="@color/grey"
                android:textSize="17sp" />
    </RadioGroup>
    <LinearLayout
        android:id="@+id/birth"
        android:layout_width="376dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/rg_sex">
            <Button
                android:id="@+id/birth_btn"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:text="@string/birthday"
                android:textColor="#FFFAF0"
                android:textSize="16sp"
                android:background="@drawable/birthdate_btn"/>
            <EditText
                android:id="@+id/et_birth"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:textColor="#666666" />
    </LinearLayout>
    <TextView
        android:id="@+id/hb_tag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="@string/hobby"
        android:textColor="@color/grey"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="@id/sex_tag"
        app:layout_constraintTop_toBottomOf="@+id/birth"/>
    <LinearLayout
        android:id="@+id/hobby"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="20dp"
        app:layout_constraintStart_toStartOf="@id/et_pw"
        app:layout_constraintTop_toBottomOf="@id/birth">
            <CheckBox
                android:id="@+id/ck_tq"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:checked="true"
                android:text="弹琴"
                android:textColor="@color/grey" />
            <CheckBox
                android:id="@+id/ck_xq"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:checked="true"
                android:text="下棋"
                android:textColor="@color/grey" />
            <CheckBox
                android:id="@+id/ck_sf"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:checked="false"
                android:text="书法"
                android:textColor="@color/grey" />
            <CheckBox
                android:id="@+id/ck_hh"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:checked="false"
                android:text="绘画"
                android:textColor="@color/grey" />
    </LinearLayout>
    <Button
        android:id="@+id/rg_btn"
        android:layout_width="180dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="60dp"
        android:text="注册"
        android:textSize="20sp"
        android:textColor="#FFFAF0"
        android:background="@drawable/register_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/hb_tag" />



</androidx.constraintlayout.widget.ConstraintLayout>

Shape

birthdate_btn.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp" />
</shape>

register_btn.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="100dp"/>
</shape>

registerActivity.java

package com.example.demo04;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import java.util.Calendar;


public class registerActivity extends AppCompatActivity  {

    int SIMPLE_NOTIFICATION_TD = 1001;
    private EditText et_birth;
    private EditText et_un;
    private EditText et_an;
    private EditText et_pw;
    private RadioButton rb_male;
    private RadioButton rb_female;
    private CheckBox ck_tq;
    private CheckBox ck_xq;
    private CheckBox ck_sf;
    private CheckBox ck_hh;

    private String content;
    private String now_time;

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

        et_un = findViewById(R.id.et_un);
        et_an = findViewById(R.id.et_an);
        et_pw = findViewById(R.id.et_pw);
        rb_male = findViewById(R.id.rb_male);
        rb_female = findViewById(R.id.rb_female);
        ck_tq = findViewById(R.id.ck_tq);
        ck_xq = findViewById(R.id.ck_xq);
        ck_sf = findViewById(R.id.ck_sf);
        ck_hh = findViewById(R.id.ck_hh);


        et_birth = findViewById(R.id.et_birth);
        Button birth_btn = findViewById(R.id.birth_btn);
        Calendar calendar = Calendar.getInstance();
        int now_year = calendar.get(Calendar.YEAR);
        int now_month = calendar.get(Calendar.MONTH) + 1;
        int now_day = calendar.get(Calendar.DAY_OF_MONTH);
        now_time = String.valueOf(now_year) + "." + String.valueOf(now_month) + "." + String.valueOf(now_day);
        et_birth.setText(now_time);
        birth_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DatePickerDialog datePickerDialog = new DatePickerDialog(registerActivity.this,
                        new DatePickerDialog.OnDateSetListener() {
                            @Override
                            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                                et_birth.setText(null);
                                et_birth.setText(year + "." + (month+1) + "." + day);
                            }
                        },now_year,now_month,now_day);
                datePickerDialog.show();
            }
        });




        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        String channelId = "num.1";
        String channelName = "通道一";
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel channel = new NotificationChannel(channelId,channelName,importance);

        notificationManager.createNotificationChannel(channel);



        Button rg_btn = findViewById(R.id.rg_btn);
        rg_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String user_name = et_un.getText().toString();

                String user_sex = null;
                if(rb_male.isChecked()){
                    user_sex = "\"男\"";
                }
                if(rb_female.isChecked()){
                    user_sex = "\"女\"";
                }

                StringBuffer user_hobby = new StringBuffer();
                String h_tq = "\"" + ck_tq.getText().toString() + "\"";
                String h_xq = "\"" + ck_xq.getText().toString() + "\"";
                String h_sf = "\"" + ck_sf.getText().toString() + "\"";
                String h_hh = "\"" + ck_hh.getText().toString() + "\"";
                if(ck_tq.isChecked()){
                    user_hobby.append(h_tq);
                }
                if(ck_xq.isChecked()){
                    user_hobby.append(h_xq);
                }
                if(ck_sf.isChecked()){
                    user_hobby.append(h_sf);
                }
                if(ck_hh.isChecked()){
                    user_hobby.append(h_hh);
                }

                String birthDate = "\"" +et_birth.getText().toString() + "\"";

                content = "用户名:" + "\"" + user_name + "\"" + "." + "性别:" + user_sex + "." + "爱好:" + user_hobby + "." + "生日:" + birthDate;
//                Log.d("ning",content);

                NotificationCompat.Builder builder = new NotificationCompat.Builder(registerActivity.this,channelId);

                builder.setSmallIcon(R.mipmap.bilibili);
                builder.setContentTitle("注册完成");
                builder.setContentText(content);
                builder.setAutoCancel(true);
                builder.setColor(Color.parseColor("#666666"));

                Notification notification = builder.build();
                notificationManager.notify(SIMPLE_NOTIFICATION_TD,notification);
            }
        });

    }

}

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="blue">#81beee</color>
    <color name="grey">#999999</color>
</resources>

strings.xml

<resources>
    <string name="app_name">Demo04</string>
    <string name="register">注册界面</string>
    <string name="user_name">用户名:</string>
    <string name="a_n">账号:</string>
    <string name="password">密码:</string>
    <string name="gender">性别:</string>
    <string name="birthday">请选择生日:</string>
    <string name="hobby">爱好:</string>
</resources>

1.3 运行结果

2 事件监听应用

2.1 编写程序,实现如下功能:

继续为注册APP添加菜单:

  1. 菜单项为“清空各选项”和“退出”
  2. 当用户点击“清空各选项”时,将所有文本输入框的文字清空,所有单选和复选按钮设为启动时的默认选项。
  3. 当用户点击“退出”时,弹出提示对话框,用户如果选择“确定”,则关闭APP。

要求:

2.2 代码实现

 options_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/clcAll"
        android:title="清空各选项"/>
    <item
        android:id="@+id/quit"
        android:title="退出"/>
</menu>

registerActivity.java

package com.example.demo04;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import java.util.Calendar;


public class registerActivity extends AppCompatActivity  {

    int SIMPLE_NOTIFICATION_TD = 1001;
    private EditText et_birth;
    private EditText et_un;
    private EditText et_an;
    private EditText et_pw;
    private RadioButton rb_male;
    private RadioButton rb_female;
    private CheckBox ck_tq;
    private CheckBox ck_xq;
    private CheckBox ck_sf;
    private CheckBox ck_hh;

    private String content;
    private String now_time;

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

        et_un = findViewById(R.id.et_un);
        et_an = findViewById(R.id.et_an);
        et_pw = findViewById(R.id.et_pw);
        rb_male = findViewById(R.id.rb_male);
        rb_female = findViewById(R.id.rb_female);
        ck_tq = findViewById(R.id.ck_tq);
        ck_xq = findViewById(R.id.ck_xq);
        ck_sf = findViewById(R.id.ck_sf);
        ck_hh = findViewById(R.id.ck_hh);


        et_birth = findViewById(R.id.et_birth);
        Button birth_btn = findViewById(R.id.birth_btn);
        Calendar calendar = Calendar.getInstance();
        int now_year = calendar.get(Calendar.YEAR);
        int now_month = calendar.get(Calendar.MONTH) + 1;
        int now_day = calendar.get(Calendar.DAY_OF_MONTH);
        now_time = String.valueOf(now_year) + "." + String.valueOf(now_month) + "." + String.valueOf(now_day);
        et_birth.setText(now_time);
        birth_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DatePickerDialog datePickerDialog = new DatePickerDialog(registerActivity.this,
                        new DatePickerDialog.OnDateSetListener() {
                            @Override
                            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                                et_birth.setText(null);
                                et_birth.setText(year + "." + (month+1) + "." + day);
                            }
                        },now_year,now_month,now_day);
                datePickerDialog.show();
            }
        });




        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        String channelId = "num.1";
        String channelName = "通道一";
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel channel = new NotificationChannel(channelId,channelName,importance);

        notificationManager.createNotificationChannel(channel);



        Button rg_btn = findViewById(R.id.rg_btn);
        rg_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String user_name = et_un.getText().toString();

                String user_sex = null;
                if(rb_male.isChecked()){
                    user_sex = "\"男\"";
                }
                if(rb_female.isChecked()){
                    user_sex = "\"女\"";
                }

                StringBuffer user_hobby = new StringBuffer();
                String h_tq = "\"" + ck_tq.getText().toString() + "\"";
                String h_xq = "\"" + ck_xq.getText().toString() + "\"";
                String h_sf = "\"" + ck_sf.getText().toString() + "\"";
                String h_hh = "\"" + ck_hh.getText().toString() + "\"";
                if(ck_tq.isChecked()){
                    user_hobby.append(h_tq);
                }
                if(ck_xq.isChecked()){
                    user_hobby.append(h_xq);
                }
                if(ck_sf.isChecked()){
                    user_hobby.append(h_sf);
                }
                if(ck_hh.isChecked()){
                    user_hobby.append(h_hh);
                }

                String birthDate = "\"" +et_birth.getText().toString() + "\"";

                content = "用户名:" + "\"" + user_name + "\"" + "." + "性别:" + user_sex + "." + "爱好:" + user_hobby + "." + "生日:" + birthDate;
//                Log.d("ning",content);

                NotificationCompat.Builder builder = new NotificationCompat.Builder(registerActivity.this,channelId);

                builder.setSmallIcon(R.mipmap.bilibili);
                builder.setContentTitle("注册完成");
                builder.setContentText(content);
                builder.setAutoCancel(true);
                builder.setColor(Color.parseColor("#666666"));

                Notification notification = builder.build();
                notificationManager.notify(SIMPLE_NOTIFICATION_TD,notification);
            }
        });



    }

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

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

    AlertDialog.Builder builder = new AlertDialog.Builder(registerActivity.this);
        switch (item.getItemId()){
            case R.id.clcAll:
                et_un.setText(null);
                et_an.setText(null);
                et_pw.setText(null);
                et_birth.setText(null);
                et_birth.setText(now_time);
                rb_male.setChecked(true);
                ck_xq.setChecked(true);
                ck_tq.setChecked(true);
                ck_sf.setChecked(false);
                ck_hh.setChecked(false);
                break;
            case R.id.quit:
                builder.setTitle("温馨提示");
                builder.setIcon(R.mipmap.tips);
                builder.setMessage("你确定要退出当前界面吗");
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        registerActivity.this.finish();
                    }
                });
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    }
                });
                AlertDialog dialog = builder.create();
                dialog.show();

                break;

        }

        return super.onOptionsItemSelected(item);
    }

}

2.3 运行结果

实验五

课    程

移动应用程序设计

实验项目

Fragment

一、实验目的

  1. 熟悉Android Studio开发工具使用
  2. 理解事件监听方法
  3. 掌握Fragment的使用
  4. 能根据常用控件设计的APP应用程序

二、实验任务

  1. fragment应用

三、实验环境

PC机、Android Studio

四、实验内容

常用控件应用

1.1 编写程序,实现如下功能:

实现学习强国APP底部导航栏5个选项切换,显示当前对应的页面:

  1. 底部包含五个按钮,分别切换到不同的fragment,按钮采用RadioButton实现。
  2. 实现五个fragment,每个fragment可采用imageview实现简单实现

提示:a.button无边框属性设置:android:button="@null";

b.在按钮上面放置图标:android:drawableTop属性

​​​​​​​

1.2 代码实现

 activity_learnings.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".learningsActivity">
    <LinearLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp"
        android:orientation="vertical"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </LinearLayout>
    <RadioGroup
        android:id="@+id/btn_group"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent">
        <RadioButton
            android:id="@+id/news_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:text="强学习"
            android:textSize="10sp"
            android:textColor="@color/grey"
            android:gravity="center"
            android:drawableTop="@drawable/news_normal"/>
        <RadioButton
            android:id="@+id/player_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:text="百灵"
            android:textSize="10sp"
            android:textColor="@color/grey"
            android:gravity="center"
            android:drawableTop="@drawable/player_normal"/>
        <RadioButton
            android:id="@+id/learn_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:text=""
            android:textSize="0sp"
            android:gravity="center"
            android:drawableTop="@drawable/learn"/>
        <RadioButton
            android:id="@+id/tv_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:text="电视台"
            android:textSize="10sp"
            android:textColor="@color/grey"
            android:gravity="center"
            android:drawableTop="@drawable/tv_normal"/>
        <RadioButton
            android:id="@+id/video_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:button="@null"
            android:text="电台"
            android:textSize="10sp"
            android:textColor="@color/grey"
            android:gravity="center"
            android:drawableTop="@drawable/radio_normal"/>
    </RadioGroup>

</androidx.constraintlayout.widget.ConstraintLayout>

learnActivity.java

package com.example.demo05;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;package com.example.demo05;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;

import android.os.Bundle;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;

import com.example.demo05.fragment.FifthFragment;
import com.example.demo05.fragment.FirstFragment;
import com.example.demo05.fragment.FourthFragment;
import com.example.demo05.fragment.SecondFragment;
import com.example.demo05.fragment.ThirdFragment;

public class learningsActivity extends AppCompatActivity {

    FragmentTransaction transaction;
    FirstFragment fragmentFirst;
    SecondFragment fragmentSecond;
    ThirdFragment fragmentThird;
    FourthFragment fragmentFourth;
    FifthFragment fragmentFifth;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_learnings);

        RadioGroup btn_group = findViewById(R.id.btn_group);
        final RadioButton news_btn = findViewById(R.id.news_btn);
        final RadioButton player_btn = findViewById(R.id.player_btn);
        final RadioButton learn_btn = findViewById(R.id.learn_btn);
        final RadioButton tv_btn = findViewById(R.id.tv_btn);
        final RadioButton video_btn = findViewById(R.id.video_btn);

        transaction = getSupportFragmentManager().beginTransaction();

        if(fragmentFirst == null){
            fragmentFirst = new FirstFragment();
            transaction.add(R.id.fragment_container,fragmentFirst);
        }
        if(fragmentSecond == null){
            fragmentSecond = new SecondFragment();
            transaction.add(R.id.fragment_container,fragmentSecond);
        }
        if(fragmentThird == null){
            fragmentThird = new ThirdFragment();
            transaction.add(R.id.fragment_container,fragmentThird);
        }
        if(fragmentFourth == null){
            fragmentFourth = new FourthFragment();
            transaction.add(R.id.fragment_container,fragmentFourth);
        }
        if(fragmentFifth == null){
            fragmentFifth = new FifthFragment();
            transaction.add(R.id.fragment_container,fragmentFifth);
        }

        transaction.show(fragmentFirst);

        transaction.commit();

        btn_group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                if(news_btn.isChecked()){
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container,fragmentFirst)
                            .addToBackStack(null)
                            .commit();
                }
                if(player_btn.isChecked()){
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container,fragmentSecond)
                            .addToBackStack(null)
                            .commit();
                }
                if(learn_btn.isChecked()){
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container,fragmentThird)
                            .addToBackStack(null)
                            .commit();
                }
                if(tv_btn.isChecked()){
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container,fragmentFourth)
                            .addToBackStack(null)
                            .commit();
                }
                if(video_btn.isChecked()){
                    getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragment_container,fragmentFifth)
                            .addToBackStack(null)
                            .commit();
                }
            }
        });
    }
}

Fragment

fragment_first.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".fragment.FirstFragment">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp"
        android:src="@drawable/page01"
        android:scaleType="fitXY"/>

</FrameLayout>

fragment_second.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".fragment.SecondFragment">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp"
        android:src="@drawable/page02"
        android:scaleType="fitXY"/>

</FrameLayout>

fragment_third.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".fragment.ThirdFragment">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp"
        android:src="@drawable/page03"
        android:scaleType="fitXY"/>

</FrameLayout>

fragment_fourth.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".fragment.FourthFragment">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp"
        android:src="@drawable/page04"
        android:scaleType="fitXY"/>

</FrameLayout>

fragment_fifth.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".fragment.FifthFragment">

    <!-- TODO: Update blank fragment layout -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="50dp"
        android:src="@drawable/page05"
        android:scaleType="fitXY"/>

</FrameLayout>

AndroidManifest.xml

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

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Design.Light.NoActionBar"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="false">
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".learningsActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>

1.3 运行结果

实验六

课    程

移动应用程序设计

实验项目

Activity和Service组件

一、实验目的

  1. 熟悉Android Studio开发工具使用
  2. 理解事件监听方法
  3. 掌握Activity和Service的使用
  4. 能根据常用控件设计的APP应用程序

二、实验任务

  1. Activity跳转和数据传递应用
  2. Service服务应用

三、实验环境

PC机、Android Studio

四、实验内容

1 Activity跳转

1.1 编写程序,实现如下功能:

设计用户注册及登录App:

  1. 首页有登录和注册两个按钮,有两个文本框显示昵称和账号,初始化为“未登录”和“用户ID”。
  2. 点击注册,跳转到注册页面,包括昵称、账号、密码,点击注册按钮后,关闭注册页面,并返回昵称和账号到首页显示;
  3. 点击登录,跳转到登录页面,包括账号、密码,点击登录按钮后,进行校验,成功后关闭登录页面,并返回昵称和账号到首页显示;

提示: a.使用startActivityForResult()方法; b.下面图片仅供参考,实现相关功能即可

1.2 代码实现

更改主题样式

themes.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.Demo06" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/LightSeaGreen</item>
        <item name="colorPrimaryVariant">@color/teal_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/purple_200</item>
        <item name="colorSecondaryVariant">@color/purple_500</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
</resources>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#019c91</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="LightSeaGreen">#20B2AA</color>
    <color name="grey">#999999</color>
</resources>

AndroidManifest.xml

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

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Design.Light.NoActionBar"
        tools:targetApi="31">
        <service
            android:name=".MusicPlayerService"
            android:enabled="true"
            android:exported="false"/>

        <activity
            android:name=".details02Activity"
            android:exported="false">
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".details01Activity"
            android:exported="false">
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>

​

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:text="首页"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@color/LightSeaGreen"/>
    <ImageView
        android:id="@+id/tx_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="120dp"
        android:layout_marginBottom="10dp"
        android:src="@drawable/tx0" />
    <TextView
        android:id="@+id/tv1_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="未登录"
        android:textColor="@color/grey"
        android:textSize="16sp"/>
    <TextView
        android:id="@+id/tv2_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="用户ID"
        android:textColor="@color/grey"
        android:textSize="12sp"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="130dp">
        <Button
            android:id="@+id/btn_register_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="50dp"
            android:text="注 册"
            android:textSize="15sp"
            android:textColor="@color/white"
            android:background="@drawable/btn_shape"/>
        <Button
            android:id="@+id/btn_login_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="100dp"
            android:layout_marginEnd="50dp"
            android:text="登 录"
            android:textSize="15sp"
            android:textColor="@color/white"
            android:background="@drawable/btn_shape"/>
    </LinearLayout>


</LinearLayout>

activity_register.xml

?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".RegisterActivity"
    android:gravity="center_horizontal"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:text="注册"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@color/LightSeaGreen"/>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:src="@drawable/logo"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="昵称:"
            android:textSize="18sp"/>
        <EditText
            android:id="@+id/et_nn_register"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:inputType="text"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="账号:"
            android:textSize="18sp"/>
        <EditText
            android:id="@+id/et_an_register"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:inputType="text"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密码:"
            android:textSize="18sp"/>
        <EditText
            android:id="@+id/et_ps_register"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:inputType="textPassword"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    <Button
        android:id="@+id/btn_register_register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="注 册"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@drawable/btn_shape"/>

</LinearLayout>

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginActivity"
    android:gravity="center_horizontal"
    android:orientation="vertical">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:text="登录"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@color/LightSeaGreen"/>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/logo"
        android:layout_marginTop="80dp"
        android:layout_marginBottom="10dp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="账号:"
            android:textSize="18sp"/>
        <EditText
            android:id="@+id/et_an_login"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:inputType="text"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密码:"
            android:textSize="18sp"/>
        <EditText
            android:id="@+id/et_ps_login"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:inputType="textPassword"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    <Button
        android:id="@+id/btn_login_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="登 录"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@drawable/btn_shape"/>
</LinearLayout>

Shape

btn_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/LightSeaGreen" />
    <!-- 指定了形状轮廓的粗细与颜色 -->
    <corners android:radius="10dp"/>
</shape>

MainActivity.java

package com.example.demo06;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private String nickname;
    private TextView tv1_main;
    private TextView tv2_main;
    private ActivityResultLauncher<Intent> register;
    private ActivityResultLauncher<Intent> login;
    private ImageView tx_main;

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

        tv1_main = findViewById(R.id.tv1_main);
        tv2_main = findViewById(R.id.tv2_main);
        tx_main = findViewById(R.id.tx_main);

        Button btn_register_main = findViewById(R.id.btn_register_main);
        btn_register_main.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,RegisterActivity.class);
                register.launch(intent);
            }
        });
        register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
                new ActivityResultCallback<ActivityResult>() {
                    @Override
//                    从RegisterActivity回来后回调该方法
                    public void onActivityResult(ActivityResult result) {
                        if(result != null){
                            Intent intent = result.getData();
                            if(intent != null && result.getResultCode() == Activity.RESULT_OK){
                                nickname = intent.getStringExtra("nn");
                                tx_main.setImageResource(R.drawable.tx);
                                tv1_main.setText(intent.getStringExtra("nn"));
                                tv2_main.setText(intent.getStringExtra("an"));
                                Toast.makeText(MainActivity.this,"注册成功",Toast.LENGTH_SHORT).show();
                            }
                        }

                    }
                });


        Button btn_login_main = findViewById(R.id.btn_login_main);
        btn_login_main.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,LoginActivity.class);
                login.launch(intent);
            }
        });
        login = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if(result != null){
                    Intent intent = result.getData();
                    if(intent != null && result.getResultCode() == Activity.RESULT_OK){
                        tx_main.setImageResource(R.drawable.tx);
                        tv1_main.setText(nickname);
                        tv2_main.setText(intent.getStringExtra("an"));
                        Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }
}

RegisterActivity.java

package com.example.demo06;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class RegisterActivity extends AppCompatActivity {

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

        EditText et_nn_register = findViewById(R.id.et_nn_register);
        EditText et_an_register = findViewById(R.id.et_an_register);
        EditText et_ps_register = findViewById(R.id.et_ps_register);

        Button btn_register_register = findViewById(R.id.btn_register_register);
        btn_register_register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String nickname = et_nn_register.getText().toString();
                String accountNumber = et_an_register.getText().toString();
                String password = et_ps_register.getText().toString();

                if(MyDBA.register(nickname,accountNumber,password)){
                    Intent intent = new Intent();
                    intent.putExtra("nn",nickname);
                    intent.putExtra("an",accountNumber);
                    intent.putExtra("pw",password);
                    setResult(Activity.RESULT_OK,intent);
                    finish();
                }
                else {
                    Toast.makeText(RegisterActivity.this,"昵称或账号已存在",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

LoginActivity.java

package com.example.demo06;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends AppCompatActivity {

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

        EditText et_an_login = findViewById(R.id.et_an_login);
        EditText et_ps_login = findViewById(R.id.et_ps_login);

        Button btn_login_login = findViewById(R.id.btn_login_login);
        btn_login_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String account_number = et_an_login.getText().toString();
                String myPassword = et_ps_login.getText().toString();

                if(MyDBA.checkANCorrect(account_number,myPassword)){
                    Intent intent = new Intent();
                    intent.putExtra("an",account_number);
                    intent.putExtra("pw",myPassword);
                    setResult(Activity.RESULT_OK,intent);
                    finish();
                }
                else {
                    Toast.makeText(LoginActivity.this,"账号或密码错误",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

MyDBA.java

package com.example.demo06;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MyDBA {

    private static List<Map<String,String>> list = new ArrayList<>();

    public static boolean register (String nn,String an,String pw){
        for (Map<String,String> map : list){
            if(map.get("nn").equals(nn) || map.get("an").equals(an)){
                return false;
            }
        }
        Map<String,String> map = new HashMap<>();
        map.put("nn",nn);
        map.put("an",an);
        map.put("pw",pw);
        list.add(map);
        return true;
    }

    public  static  boolean checkANCorrect(String an,String pw){
        for (Map<String,String> map : list){
            if(map.get("an").equals(an) && map.get("pw").equals(pw)){
                return true;
            }
        }
        return false;
    }
}

1.3 运行结果

2 Service应用

2.1 编写程序,实现如下功能:

设计音乐播放列表:

  1. 设计一个歌单列表,使用ListView实现。
  2. 为ListView添加setOnItemClickListener事件,播放当前音乐,使用Service实现;
  3. 为ListView添加setOnItemLongClickListener事件,跳转到详情页面:显示歌名、歌手、歌词
  4. 增加播放、暂停、停止按钮,实现音乐播放。

提示: a.音乐播放用MediaPlayer; b.音乐文件存放在raw文件夹下

2.2 代码实现

布局里写了9首歌。导入了三首歌的资源,写了两个首歌的详情界面跳转

activity_music.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/top_style"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:text="歌单"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@color/green"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <LinearLayout
        android:id="@+id/layout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="5dp"
        app:layout_goneMarginTop="20dp"
        app:layout_constraintStart_toStartOf="@+id/top_style"
        app:layout_constraintTop_toBottomOf="@+id/top_style">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/pic1" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:src="@drawable/add_logo" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="create new playlist"
            android:textColor="@color/gray" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginTop="70dp"
        app:layout_constraintTop_toBottomOf="@id/layout1"
        app:layout_constraintStart_toStartOf="@+id/layout1">
        <Button
            android:id="@+id/btn_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:background="@drawable/btn_shape"
            android:text="   播 放"
            android:button="@null"
            android:textSize="15dp"
            android:textColor="@color/black2"
            android:drawableStart="@drawable/play"/>
        <Button
            android:id="@+id/btn_pause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:background="@drawable/btn_shape"
            android:text="   暂 停"
            android:button="@null"
            android:textSize="15dp"
            android:textColor="@color/black2"
            android:drawableStart="@drawable/pause"/>
        <Button
            android:id="@+id/btn_stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:background="@drawable/btn_shape"
            android:text="   停 止"
            android:button="@null"
            android:textSize="15dp"
            android:textColor="@color/black2"
            android:drawableStart="@drawable/stop"/>
        <Button
            android:id="@+id/btn_next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:background="@drawable/btn_shape"
            android:text="   下一首"
            android:button="@null"
            android:textSize="15dp"
            android:textColor="@color/black2"
            android:drawableStart="@drawable/next"/>
    </LinearLayout>
    <ListView
        android:id="@+id/musicList"
        android:layout_width="270dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="70dp"
        android:divider="@color/green2"
        android:dividerHeight="1dp"
        app:layout_constraintEnd_toEndOf="@+id/top_style"
        app:layout_constraintTop_toBottomOf="@+id/top_style" />

</androidx.constraintlayout.widget.ConstraintLayout>

item_song.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="270dp"
    android:layout_height="50dp"

    xmlns:app="http://schemas.android.com/apk/res-auto">
    <TextView
        android:id="@+id/tv_sn"
        android:layout_width="20dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:textColor="#666666"
        android:textSize="18sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>
    <TextView
        android:id="@+id/tv_songName"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:textSize="14sp"
        app:layout_constraintStart_toEndOf="@+id/tv_sn"
        app:layout_constraintBaseline_toBaselineOf="@id/tv_sn"/>
    <ImageView
        android:id="@+id/image_mvPlay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="35dp"
        android:src="@drawable/mplay"
        app:layout_constraintStart_toEndOf="@id/tv_songName"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>
    <ImageView
        android:id="@+id/image_more"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="15dp"
        android:src="@drawable/zk"
        app:layout_constraintStart_toEndOf="@id/image_mvPlay"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

activity_details01.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bj"
    tools:context=".details01Activity">
    <TextView
        android:id="@+id/top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:text="详情页"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@color/green"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    <ImageButton
        android:id="@+id/btn_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="2dp"
        android:layout_gravity="end"
        android:src="@drawable/back"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    <TextView
        android:id="@+id/tv_music01_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="20dp"
        android:text="@string/music01_name"
        android:textSize="18sp"
        android:textColor="@color/white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/top"/>
    <TextView
        android:id="@+id/tv_music01_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:padding="10dp"
        android:gravity="center"
        android:text="@string/music01_content"
        android:textSize="14sp"
        android:lineSpacingExtra="5dp"
        android:textColor="@color/white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_music01_name"/>
</androidx.constraintlayout.widget.ConstraintLayout>

activity_details02.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bj2"
    tools:context=".details02Activity">
    <TextView
        android:id="@+id/top2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:text="详情页"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:background="@color/green"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    <ImageButton
        android:id="@+id/btn_back2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="2dp"
        android:layout_gravity="end"
        android:src="@drawable/back"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
    <TextView
        android:id="@+id/tv_music02_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="20dp"
        android:text="@string/music02_name"
        android:textSize="18sp"
        android:textColor="@color/white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/top2"/>
    <TextView
        android:id="@+id/tv_music02_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:gravity="center"
        android:text="@string/music02_content"
        android:textSize="14sp"
        android:lineSpacingExtra="3dp"
        android:textColor="@color/white"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_music02_name"/>

</androidx.constraintlayout.widget.ConstraintLayout>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="black2">#666666</color>
    <color name="green">#abc5aa</color>
    <color name="SlateGray">#708090</color>
    <color name="gray">#6d7577</color>
    <color name="white">#FFFFF0</color>
    <color name="green2">#749e7a</color>
</resources>

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string-array name="musicNumb">
        <item>01</item>
        <item>02</item>
        <item>03</item>
        <item>04</item>
        <item>05</item>
        <item>06</item>
        <item>07</item>
        <item>08</item>
        <item>09</item>
    </string-array>
    <string-array name="musicName">
        <item>Drive You Home</item>
        <item>まちがいさがし</item>
        <item>At My Worst</item>
        <item>那些年</item>
        <item>กีดกัน</item>
        <item>LMLY</item>
        <item>You(=I)</item>
        <item>体面</item>
        <item>킬미힐미</item>
    </string-array>

</resources>

strings.xml

<resources>
    <string name="app_name">Demo06_music</string>
    <string name="music01_name">Drive You Home</string>
    <string name="music02_name">まちがいさがし</string>
    <string name="music01_content">作词 : David Stewart/王嘉尔/Nicholas Mira/Nija Charles/Ric Ocasek\n
        作曲 : David Stewart/王嘉尔/Nicholas Mira/Nija Charles/Ric Ocasek\n
        We fell in love on Geary Boulevard\n
        驾车行驶在盖瑞大道上 我们深陷爱河\n
        With the sun coming down on the front of my car\n
        望着远方 阳光倾洒而下\n
        Felt something like something like an 80’s movie\n
        此景就像 80年代的电影画面\n
        Felt something like something like you’d never lose me\n
        也似你不会弃我而去\n
        So why we gotta check into the heartbreak hotel,Oh hell\n
        但为何 我们的感情 被迫告终\n
        You know me better than myself\n
        我对自身的了解 都不及你\n
        I don’t wanna go home, no way,Without you\n
        我不愿孤身回家\n
        Ain’t gonna be good for my health\n
        毕竟没有你的陪伴 我会很心痛\n
        And every roadmap leads straight to your heart\n
        所有路标都指向你心间\n
        So I can’t leave you tonight,No not tonight\n
        今夜 我定不会离开你身旁\n
</string>
    <string name="music02_content">
        作词 : 米津玄師\n
        作曲 : 米津玄師\n
        まちがいさがしの間違いの方に\n
        好像生来就是\n
        生まれてきたような気でいたけど\n
        找不同里的错误\n
        まちがいさがしの正解の方じゃ\n
        如果是找不同中正解的话\n
        きっと出会えなかったと思う\n
        就一定不会有现在的相遇相知了吧\n
        ふさわしく 笑いあえること\n
        本该相视而笑\n
        何故だろうか 涙がでること\n
        我为什么 反而流下了眼泪\n
        君の目が貫いた 僕の胸を真っ直ぐ\n
        你的眼神直接触动了我的内心\n
        その日から何もかも 変わり果てた気がした\n
        从那一天起一切的一切 感觉都截然不同了\n
        風に飛ばされそうな 深い春の隅で\n
        在暮春将逝的角落里\n
        退屈なくらいに何気なく傍にいて\n
        寥寥孤寂中你就默默陪在身边\n
    </string>
</resources>

MainActivity.java

package com.example.demo06_music;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;


import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    private final int songs[] = {R.raw.music01,R.raw.music02,R.raw.music03};
    private int index = 0;


    private MusicPlayerService.MusicControl control;

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            control = (MusicPlayerService.MusicControl)service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

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

        initView();


    }

    private void initView(){

        Button btn_start = findViewById(R.id.btn_start);
        Button btn_pause = findViewById(R.id.btn_pause);
        Button btn_stop = findViewById(R.id.btn_stop);
        Button btn_next = findViewById(R.id.btn_next);

        OnClick onClick = new OnClick();
        btn_start.setOnClickListener(onClick);
        btn_pause.setOnClickListener(onClick);
        btn_stop.setOnClickListener(onClick);
        btn_next.setOnClickListener(onClick);



        initBindIntent(songs[0]);



        ArrayList<HashMap<String,Object>> ListItems = null;
        HashMap<String,Object> map = null;
        ListItems = new ArrayList<>();
        String[] sn = getResources().getStringArray(R.array.musicNumb);
        String[] songName = getResources().getStringArray(R.array.musicName);
        for(int i = 0;i < sn.length;i ++){
            map = new HashMap<>();
            map.put("sn",sn[i]);
            map.put("songName",songName[i]);
            ListItems.add(map);
        }

        ListView musicList = findViewById(R.id.musicList);
        SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,ListItems,R.layout.item_song,
                new String[]{"sn","songName"},
                new int[]{R.id.tv_sn,R.id.tv_songName});
        musicList.setAdapter(adapter);
        musicList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if(i == 0){
                    Intent intent = new Intent(MainActivity.this,details01Activity.class);
                    startActivity(intent);
                }
                if(i == 1){
                    Intent intent = new Intent(MainActivity.this,details02Activity.class);
                    startActivity(intent);
                }
            }
        });

    }
    private void initBindIntent(int songId){
        Intent intent = new Intent(getApplicationContext(),MusicPlayerService.class);
        intent.putExtra("songId",songId);
        bindService(intent,connection,BIND_AUTO_CREATE);
    }

    private class OnClick implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.btn_start:
                    control.playMusic();
                    Toast.makeText(MainActivity.this, "播放歌曲", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_pause:
                    control.pauseMusic();
                    Toast.makeText(MainActivity.this, "歌曲已暂停", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_stop:
                    control.stopMedia();
                    Toast.makeText(MainActivity.this, "终止播放", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.btn_next:
                    index = (index + 1) % 3;
                    control.nextMedia(index);
                    Toast.makeText(MainActivity.this, "播放下一首", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }

    @Override
    public void onDestroy() {
        control.stopMedia();
        unbindService(connection);
        super.onDestroy();
    }

}
}

MusicPlayerService.java

package com.example.demo06_music;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;

public class MusicPlayerService extends Service {

    private MediaPlayer mediaPlayer;
    private MusicControl binder = new MusicControl();

    private final int songs[] = {R.raw.music01,R.raw.music02,R.raw.music03};
    private int songId;

    public MusicPlayerService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        int songId = intent.getIntExtra("songId", R.raw.music01);
        mediaPlayer = MediaPlayer.create(this,songId);
        return binder;//绑定服务时把音乐控制类实例化
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mediaPlayer = new MediaPlayer();//实例化多媒体对象
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    public class MusicControl extends Binder {

        public void playMusic(){
            if(mediaPlayer != null && !mediaPlayer.isPlaying()){
                mediaPlayer.start();
            }
        }

        public void pauseMusic() {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
            }
        }

        public void stopMedia() {
            if (mediaPlayer != null) {
                /**
                 * 注意:直接调用stop方法后,不能再调用start方法。
                 * 如果要支持继续播放,则需要用pause
                 */
                mediaPlayer.pause();
                mediaPlayer.seekTo(0);//打带

            }
        }

        public void nextMedia(int index){
            stopMedia();
            int songId = songs[index];
            mediaPlayer = MediaPlayer.create(MusicPlayerService.this, songId);
            playMusic();
        }


    }
}

details01Activity.java

package com.example.demo06_music;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;

public class details01Activity extends AppCompatActivity {

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

        ImageButton btn_back = findViewById(R.id.btn_back);
        btn_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(details01Activity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

details02Activity.java

package com.example.demo06_music;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;

public class details02Activity extends AppCompatActivity {

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

        ImageButton btn_back = findViewById(R.id.btn_back2);
        btn_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(details02Activity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

2.3 运行结果

实验七

课    程

移动应用程序设计

实验项目

SQLite

一、实验目的

  1. 熟悉Android Studio开发工具使用
  2. 理解SQLite数据存储方式
  3. 掌握SQLite数据库创建,增删查基本操作
  4. 能根据常用控件设计的APP应用程序

二、实验任务

  1. 个人收支APP

三、实验环境

PC机、Android Studio

四、实验内容

个人收支

1.1 编写程序,实现如下功能:

设计个人收入的App:

  1. 首页有新增收入和收入明细两个图片按钮;
  2. 点击新增收入,可以添加收入明细;
  3. 点击收入明细按钮,跳转到收入列表页面,包括付款方、类别、时间、金额、备注;

提示: a.使用SQLite存储数据,创建收入数据表; b.使用ListView或者RecyclerView创建列表;c.下面图片仅供参考,实现相关功能即可;

1.2 代码实现

页面代码:略

逻辑代码:

MainActivity.java

package com.example.demo07;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

        ImageButton btn_income = findViewById(R.id.btn_income);
        ImageButton btn_details = findViewById(R.id.btn_details);
        btn_income.setOnClickListener(this);
        btn_details.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_income:
                Intent intent_income = new Intent(MainActivity.this,IncomeActivity.class);
                startActivity(intent_income);
                break;
            case R.id.btn_details:
                Intent intent_details = new Intent(MainActivity.this,DetailsActivity.class);
                startActivity(intent_details);
                break;
        }
    }
}

IncomeActivity.java

package com.example.demo07;

import androidx.appcompat.app.AppCompatActivity;


import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class IncomeActivity extends AppCompatActivity {

    private UserDBHelper helper1;
    private SQLiteDatabase dbWriter;
    private EditText et_money;
    private EditText et_time;
    private EditText et_type;
    private EditText et_source;
    private EditText et_remarks;

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

        et_money = findViewById(R.id.et_money);
        et_time = findViewById(R.id.et_time);
        et_type = findViewById(R.id.et_type);
        et_source = findViewById(R.id.et_source);
        et_remarks = findViewById(R.id.et_remarks);


        helper1 = UserDBHelper.getInstance(this);
        dbWriter = helper1.getWritableDatabase();
        Button btn_save = findViewById(R.id.btn_save);
        btn_save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String sql = "INSERT INTO income_info (type,time,source,money,remark) values(?,?,?,?,?)";
                dbWriter.execSQL(sql,new Object[]{
                        et_type.getText().toString(),
                        et_time.getText().toString(),
                        et_source.getText().toString(),
                        Integer.parseInt(et_money.getText().toString()),
                        et_remarks.getText().toString()});
                Intent intent = new Intent(IncomeActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
        Button btn_cancel = findViewById(R.id.btn_cancel);
        btn_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(IncomeActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }

}

DetailsActivity.java

package com.example.demo07;

import androidx.appcompat.app.AppCompatActivity;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;


public class DetailsActivity extends AppCompatActivity {

    private UserDBHelper helper2;
    private SQLiteDatabase dbReader;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);


        ListView income_list = findViewById(R.id.income_list);

        helper2 = UserDBHelper.getInstance(this);
        dbReader = helper2.getReadableDatabase();
        Cursor result = dbReader.query("income_info",null, null, null, null,
                null, "time", null);
        if (!result.moveToFirst()) { //判断游标是否为空
            Toast.makeText(getApplicationContext(), "尚未有收入", Toast.LENGTH_SHORT).show();
        }
        SimpleCursorAdapter ListAdapter = new SimpleCursorAdapter(getApplicationContext(),
                R.layout.item_list,
                result,
                new String[]{"_id", "type", "time", "source", "money", "remark"},
                new int[]{R.id.item_id, R.id.type_item, R.id.time_item, R.id.source_item, R.id.money_item, R.id.remarks_item},
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        income_list.setAdapter(ListAdapter);

    }

}

UserDBHelper.java

package com.example.demo07;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserDBHelper extends SQLiteOpenHelper {

    private static final String DB_NAME = "income.db";
    private static final int DB_VERSION = 1;

    private static UserDBHelper mHelper = null;

    private UserDBHelper (Context context){
        super(context,DB_NAME,null,DB_VERSION);
    }

    //利用单例模式获取数据库帮助器的唯一实例
    public static UserDBHelper getInstance(Context context){
        if(mHelper == null){
            mHelper = new UserDBHelper(context);
        }
        return mHelper;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String sql = "CREATE TABLE IF NOT EXISTS income_info("+
                "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
                "type TEXT NOT NULL,"+
                "time TEXT NOT NULL, "+
                "source TEXT NOT NULL,"+
                "money DOUBLE NOT NULL,"+
                "remark TEXT NOT NULL"+
                ");";
        sqLiteDatabase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        if(newVersion > oldVersion){
            sqLiteDatabase.execSQL("DROP TABLE IF EXISTS  income_info");
        }
        onCreate(sqLiteDatabase);
    }


}

1.3 运行结果

  • 49
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值