Android学习--04(打地鼠小游戏App源码+提示框Toast+提示窗口Dialog+菜单Menu+下拉框Spinner)

1Toast 提示

Android的提示机制

在这里插入图片描述

1.1Toast提示

Toast(消息提示框)是轻量级信息提醒机制,显示在应用程序界面的最上层。一般用于提示一些不那么引人注目,但是又希望用户看见的消息,无需用户自己维护它的消失。

  • 没有对应的控件
  • 没有控制按钮
  • 不会获得焦点
  • 自动消失
  • 用于显示快速提示信息

1.1.1 使用Toast步骤

1.创建Toast对象
①通过构造方法 new Toast()
②通过makeText方法;设置显示内容,显示时长

2.设置消息提示的样式
①自定义位置:setGravity()方法
②自定义图片
③…
3.显示消息
①通过show()方法

1.1.2 Toast重要方法

方法public static Toast makeText(Context context ,CharSequence text,int duration)
作用创建一个Toast
说明第一个参数:当前的上下文环境
第二个参数:要显示的字符串。也可是R.string中字符串ID
第三个参数:显示时间的长短。LENFTH_LONG(长5秒左右)和LENGTH_SHORT(短3秒左右)
示例Toast t = Toast.makeText(MainActivity.this,“这是我的第一条Toast!”,Toast.LENGTH_SHORT);
Toast t = Toast.makeText(this,R.string.hello_world,Toast.LENGTH_LONG);
方法public void show()
作用显示Toast
示例Toast t = Toast.makeText(MainActivity.this,“这是我的第一片面包”,Toast.LENGTH_SHORT);
方法public void setGravity(int gravity,int xOffset,int yOfffset)
作用设置Toast的位置
说明第一个参数:设置toast在屏幕中显示的位置
第二个参数:相对于第一个参数设置toast位置的横向X轴的偏移量,正数向右偏移,负数向左偏移
示例toast.setGravity(Gravity.CENTER,0,0);

1.1.3 Toast操作演示

1.在页面创建时显示一条短的Toast
2.通过点击按钮显示一条长的Toast
3.通过点击按钮显示一条居中的带图片的Toast
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
点击按钮显示(显示的时间更长)
在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.1.4 示例源码

//avtivity_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"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击"
        android:textSize="30dp"
        android:layout_gravity="center"
        android:layout_marginTop="300dp"
        />

    <Button
        android:id="@+id/button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击有图片"
        android:textSize="30dp"
        android:layout_gravity="center"
        android:layout_marginTop="50dp"
        />

</LinearLayout>

在这里插入图片描述

//MainActivity.java
package com.example.toastqixue;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
    //2.1创建对象
    Button btn_1 ;
    Button btn_2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.创建一条短的Toast
        Toast.makeText(MainActivity.this,"这是一条短的Toast",Toast.LENGTH_SHORT).show();
        //2.点按钮显示长Toast
        btn_1 =findViewById(R.id.button_1);
        btn_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建长
                Toast.makeText(MainActivity.this,"这是一条长的Toast",Toast.LENGTH_LONG).show();
            }
        });
        //3.通过点击按钮显示一条居中的带图片的Toast
        btn_2=findViewById(R.id.button_2);
        btn_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建一条居中的带图片的toast并显示
                Toast toast= Toast.makeText(MainActivity.this,"这是一条带图片的Toast",Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER,0,0);
                ImageView image1 = new ImageView(MainActivity.this); //定义图片控件
                image1.setImageResource(R.mipmap.ic_launcher_round);// 设置图片
                LinearLayout toastview=(LinearLayout)toast.getView(); //定义toast的布局视图为线性布局
                toastview.addView(image1); //将图片加载到toast布局中
                toast.show();
            }
        });
    }
}

1.1.5 在类文件创建控件

重点:完全不在布局界面activity_main.xml上创建控件,直接在MainActivity.java里创建控件的方法

ImageView image1 = new ImageView(MainActivity.this); 
//定义图片控件    
image1.setImageResource(R.mipmap.ic_launcher_round);
// 设置图片

2 Dialog对话框

  • 对话框是程序与用户交互的一种方式,通常用于显示当前程序提示信息以及相关说明,以小窗口形式展现。
  • 通常需要用户做出决定后才会执行。
    在这里插入图片描述

2.1 AlertDialog 的构建

在这里插入图片描述

2.1.1 AlertDialog.Builder 重要方法

方法AlertDialog.Builder setlcon (int iconld)
作用设定对话框的图标,其中参数为图标的资源ID,返回值为AlertDialog.Builder类的对象。
说明AlertDialog类的子类,它可以在对话框上提供一些按钮供用户选择。Builder类是AlertDialog类的内部类,它的主要作用是用来创建AlertDialog类的对象的,可以把它理解为AlertDialog的构造器。下同
方法AlertDialog.Builder setTitle(CharSequence title)
作用设定对话框的标题。其中参数为对话框的标题字符串,返回值为AlertDialog.Builder类的对象。
方法AlertDialog.Builder setMessage(CharSequence message)
作用设定对话框的内容。其中参数为对话框的提示内容字符串,返回值为AlertDialog.Builder类的对象。
方法AlertDialog.Builder setPositiveButton(CharSequence text,DialogInterface.OnClickListener listener)
作用设定对话框上的“确定(肯定)”按钮。其中参数text为按钮上显示的文本,listener为该按钮的单击事件监听器,返回值为AlertDialog.Builder类的对象。
方法AlertDialog.Builder setNegativeButton(CharSequence text,DialogInterface.OnClickListener listener)
作用设定对话框上的“取消(否定)”按钮。其中参数text为按钮上显示的文本,listener为该按钮的单击事件监听器,返回值为AlertDialog.Builder类的对象。
方法AlertDialog.Builder setNeutralButton(CharSequence text,DialogInterface.OnClickListener listener)
作用设定对话框上的“忽视(中立)”按钮。其中参数text为按钮上显示的文本,listener为该按钮的单击事件监听器,返回值为AlertDialog.Builder类的对象
方法AlertDialog create()
作用创建一个对话框,返回值为AlertDialog类的对象。
方法AlertDialog show()
作用显示一个对话框,返回值为AlertDialog类的对象。
方法public AlertDialog.Bulider setSingleChoiceltems(CharSequence[] items,int checkedltem,android.content.DialogInterface.OnClickListener listener
作用设定单选列表
1.第一个参数指定我们要显示的一组下拉单选框的数据集合
2.第二个参数代表索引,指定默认哪一个单选框被勾选上
3.第三个参数给每一个单选项绑定一个监听器
方法public AlertDialog.Builder setMultiChoiceItems(CharSequence[] items,boolean[] checkedltems,android.content.DialogInterface.OnMultiChoiceClickListener listener)
作用设定多选列表。
1.第一个参数指定我们要显示的一组下拉多选框的数据集合
2.第二个参数代表哪几个选项被选择,如果是null,则表示一个都不选择,如果希望指定哪一个多选选择框被选择,需要传递一个boolean[]数组进来,其长度要和第一个参数的长度相同,例如{true,false,false,true}
3.第三个参数给每一个多选项绑定一个监听器

2.1.2操作演示

  • 1. 通过点击按钮显示一个普通Dialog
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 2. 通过点击按钮显示一个单选Dialog

在这里插入图片描述
在这里插入图片描述

2.1.3 效果演示(普通对话框+单选对话框)

  • 1. 通过点击按钮显示一个普通Dialog

在这里插入图片描述点击普通对话框按钮
在这里插入图片描述选择取消,返回原界面
在这里插入图片描述选择确定,退出程序

在这里插入图片描述

  • 2. 通过点击按钮显示一个单选Dialog,AlertDialog.Bulider setSingleChoiceltems方法第二个参数为 0,所以默认单选在第一个“北京”

在这里插入图片描述

2.1.4 示例源码

//MainActivity.java
package com.example.dialog;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    //第一步:定义对象
    Button btn_1;
    Button btn_2;

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

        //第二步:绑定控件
        btn_1 =findViewById(R.id.button_1);
        btn_2 =findViewById(R.id.button_2);

        //第三步,按钮单击事件
        /***********************按钮1**********************/
        btn_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);//创建一个AlertDialog的构造器
                builder.setIcon(R.mipmap.ic_launcher_round);   //设置图标
                builder.setTitle("温馨提示");    //设置标题
                builder.setMessage("确定要退出吗?"); //设置消息内容
                //设置确定按钮
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        //添加确定按钮后的功能代码
                        finish();//程序页面关闭
                    }
                });
                //设置取消按钮
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        //添加取消按钮后的功能代码

                    }
                });

                //把这些功能组合起来
                builder.create().show();
            }
        });
        /**********************************按钮2************************************/

        btn_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //创建一个AlertDialog的构造器
                builder.setIcon(R.mipmap.ic_launcher_round); //设置图标
                builder.setTitle("请选择城市");  //设置标题
                final String[] cities={"北京","上海","广州","深圳"}; //设置选项内容
                builder.setSingleChoiceItems(cities, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //添加选项被点击后的功能代码

                    }
                });
                //添加确定按钮后的功能代码
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                //添加取消按钮后的功能代码
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                builder.create().show();

            }
        });
    }
}

//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"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="普通对话框"
        android:textAllCaps="false"
        android:layout_gravity="center"
        android:layout_marginTop="100dp"
        android:textSize="40dp"/>
    <Button
        android:id="@+id/button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="单选对话框"
        android:textAllCaps="false"
        android:layout_gravity="center"
        android:layout_marginTop="100dp"
        android:textSize="40dp"/>

</LinearLayout>

2.2 课后思考(多选对话框+Toast提示单选对话框用户所选择的选项)

2.2.1 操作

  • 1.增加功能,在单选框选择城市后,在点击“确定”后显示一条Toast,内容为:您选择了***
    难点在于如何获取用户选择的选项信息,在单选框监听事件中,自动生成的代码段里的形参 int which为用户选择的选项下标
    在这里插入图片描述效果
    在这里插入图片描述
    在这里插入图片描述
  • 2.通过点击按钮显示一个多选Dialog
    使用方法setMultiChoiceItems
    在这里插入图片描述
    效果:因为初始boolean[]数组初始值为{true,false,false,true};所以默认选择了前两位
    在这里插入图片描述

2.2.2 作业源码

//MainActivity.java
package com.example.dialog;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    //第一步:定义对象
    Button btn_1;
    Button btn_2;
    int index;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //第二步:绑定控件
        btn_1 =findViewById(R.id.button_1);
        btn_2 =findViewById(R.id.button_2);

        //第三步,按钮单击事件
        /***********************按钮1**********************/
        btn_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);//创建一个AlertDialog的构造器
                builder.setIcon(R.mipmap.ic_launcher_round);   //设置图标
                builder.setTitle("请选择动物");    //设置标题
               // builder.setMessage("确定要退出吗?"); //设置消息内容
                final String[] animals={"兔子","小狗","小猫","小熊"}; //设置选项内容
                boolean[] right={true,false,false,true};
                builder.setMultiChoiceItems(animals, right, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {

                    }
                });
                //设置确定按钮
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        //添加确定按钮后的功能代码
                        //finish();//程序页面关闭
                        Toast.makeText(MainActivity.this,"选择成功",Toast.LENGTH_LONG).show();
                    }
                });
                //设置取消按钮
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        //添加取消按钮后的功能代码

                    }
                });

                //把这些功能组合起来
                builder.create().show();
            }
        });
        /**********************************按钮2************************************/

        btn_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str1;
                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //创建一个AlertDialog的构造器
                builder.setIcon(R.mipmap.ic_launcher_round); //设置图标
                builder.setTitle("请选择城市");  //设置标题
                final String[] cities={"北京","上海","广州","深圳"}; //设置选项内容
                builder.setSingleChoiceItems(cities, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //添加选项被点击后的功能代码
                        index = which;
                    }
                });
                //添加确定按钮后的功能代码
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        Toast.makeText(MainActivity.this,"你选择的城市为"+cities[index],Toast.LENGTH_LONG).show();
                    }
                });
                //添加取消按钮后的功能代码
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                builder.create().show();

            }
        });
    }
}

//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"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="多选对话框"
        android:textAllCaps="false"
        android:layout_gravity="center"
        android:layout_marginTop="100dp"
        android:textSize="40dp"/>
    <Button
        android:id="@+id/button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="单选对话框"
        android:textAllCaps="false"
        android:layout_gravity="center"
        android:layout_marginTop="100dp"
        android:textSize="40dp"/>

</LinearLayout>

3 Menu菜单

3.1简介

在这里插入图片描述

3.2 Menu步骤

1.创建布局界面
2.创建菜单资源文件
3.添加选项菜单
4.指定选项被选择时应做的处理

1.创建布局界面
创建新项目,将布局改为线性布局
在这里插入图片描述2.创建菜单资源文件
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述做菜单的第一个项,起名为“添加”
在这里插入图片描述第二种方法
在这里插入图片描述用同样的方法添加剩下的
在这里插入图片描述
最终结果如图
在这里插入图片描述
目前是运行起来无法显示效果,因为没有添加显示
在这里插入图片描述3.添加选项菜单
需要用到这个方法

方法Activity类:public boolean onCreateOptionsMenu(Menu menu)
作用系统创建选项菜单时调用的方法,参数menu就是Activity 的选项菜单对象,返回值为true表示需要显示菜单,否则菜单不显示
说明要创建选项菜单,就需要重写该方法,在方法中对menu对象进行操作

在MainActivity.java中
在这里插入图片描述在这里插入图片描述在这里插入图片描述
效果
在这里插入图片描述
4.指定选择项被选择时应做的处理

方法Activity类:public boolean onOptionsltemSelected(Menultem item)
作用单击菜单项后会自动触发该方法
说明参数说明:item参数是被单击的菜单项,返回值:
- 如果任务全部已经处理完,则返回true
-如果希望将菜单项点击的事件传递下去,继续触发其他处理,则返回false
-如果采用return super.onOptionsltemSelected(item);则返回值为false,即系统缺省返回false

在这里插入图片描述效果
在这里插入图片描述分别点击菜单项
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.3 示例源码

//MainActivity.java
package com.example.menuqixue;

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

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    //1.添加选项菜单,让创建的菜单显示出来,重写onCreateOptionsMenu()方法
    @Override
    public boolean onCreatePanelMenu(int featureId, @NonNull Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);//获取当前菜单对象,加载菜单布局文件

        return true;  //显示菜单
    }


    //2.给菜单添加选中时的响应事件,重写onOptionsItemSelected()方法
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        //给菜单添加选中时的响应事件
        switch(item.getItemId()){
            case R.id.add_item:
                Toast.makeText(MainActivity.this,"你单击了添加菜单",Toast.LENGTH_LONG).show();
                break;
            case R.id.delete_item:
                Toast.makeText(MainActivity.this,"你单击了删除菜单",Toast.LENGTH_LONG).show();
                break;
            case R.id.exit_item:
                finish();
                break;
            case R.id.modify_item:
                Toast.makeText(MainActivity.this,"你单击了修改菜单",Toast.LENGTH_LONG).show();
                break;
            default:
        }
        return true;
    }
}

//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"
    tools:context=".MainActivity">
</LinearLayout>
//main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:id="@+id/add_item"
    android:title="添加"/>
    <item
        android:id="@+id/delete_item"
        android:title="删除" />
    <item
        android:id="@+id/modify_item"
        android:title="修改" />
    <item
        android:id="@+id/exit_item"
        android:title="退出" />
</menu>

在这里插入图片描述

3.4 作业

  • 在点击删除菜单项后,显示一个对话框
    效果在这里插入图片描述
    在上述代码的case R.id.exit_item: finish();处改为
case R.id.exit_item:
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);//创建一个AlertDialog的构造器
                builder.setIcon(R.mipmap.ic_launcher_round);   //设置图标
                builder.setTitle("温馨提示");    //设置标题
                builder.setMessage("确定要退出吗?"); //设置消息内容
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });
                //设置取消按钮
                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        //添加取消按钮后的功能代码
                    }
                });
                builder.create().show();
                break;

4 Spinner下拉列表框

在这里插入图片描述

4.1 Spinner 步骤

1.定义对象
2.绑定控件
3.设置下拉列表项
4.创建适配器
5.让控件显示数据

4.2 Adapter适配器

4.2.1 简介

适配器是连接控件与数据的桥梁,几种常用的Adapter:

  • 1.ArrayAdapter:数组适配器.是最简单的Adapter,适用于列表项中单一文本的情况;
  • 2.SimpleAdapter:每一个列表项中可以含有不同的子控件
  • 3.SimpleCursorAdapter:数据源为数据库
    在这里插入图片描述

4.2.2 重要方法

方法ArrayAdapter构造方法:ArrayAdapter(Context context,int textViewResourceld,T[] object)
作用ArrayAdapter构造方法
说明参数:
1.context:当前Activity 的环境
2.textViewResourceld:以什么样的方式(布局)显示数据;
3.Objects:要显示的数据,即为适配器需要连接的数组数据。
方法Spinner类的方法:public void setAdapter(SpinnerAdater adapter)
作用设定控件所使用的适配器
说明adapter 为提供给控件的适配器
方法public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener)
作用用于监听Spinner选项被选中的事物,该方法是Spinner控件从其父类AdapterView中继承得到的
说明Listener是监听器

4.2 操作演示

4.2.1 步骤

1.activity_main.xml中拖动Spinner控件
在这里插入图片描述2.运行一下,因为没有内容,所以只有一个下拉框的下角
在这里插入图片描述3.在MainActivity.java文件中编写Spinner的内容

在这里插入图片描述效果
在这里插入图片描述
4.编辑Spinner下拉框内容被单击后的触发事件,修改参数为arg0,arg1,arg2,arg3
在这里插入图片描述效果如图,选择哪个项,则出现该项对应的提示消息
在这里插入图片描述

4.2.2 总结

1.定义对象Spinner spin1;
2.绑定控件spin1=findViewById(R.id.spinner1);
3.设置下拉列表项String [] arr1={"全部","纪录片","漫画","音乐","舞蹈","游戏"};
4.创建适配器

 ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_spinner_item,arr1);

5.让控件Spinner显示数据 spin1.setAdapter(adapter1);
6.添加触发事件setOnItemSelectedListener()方法

4.2.3 示例源码

//MainActivity.java
package com.example.spinnerqixue;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    //1.定义对象
    Spinner spin1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //2.绑定控件
        spin1=findViewById(R.id.spinner1);
        //3.设置控件Spinner的下拉列表项
        String [] arr1={"全部","纪录片","漫画","音乐","舞蹈","游戏"};
        //4.定义适配器(连接控件与数据的桥梁),告诉控件以什么样的方式显示数据
        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_spinner_item,arr1);
        //5.让控件Spinner显示数据
        spin1.setAdapter(adapter1);
        //6.添加选项下拉选项后出发的事件
        spin1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                    //选项被选中时执行的方法,arg0:Spinner控件 arg1:选中的列表项 arg2:选中项的位置 arg3:选中项ID
                    TextView text1 = (TextView) arg1;//定义选中项,TextView是View的一个子类
                    String str1 = text1.getText().toString();  //获取选中项的文本内容
                    Toast.makeText(MainActivity.this,str1,Toast.LENGTH_LONG).show(); //用Toast将文本显示出来
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                    //选项未被选中时执行该方法
            }
        });
    }
}

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


    <Spinner
        android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />


</LinearLayout>

5 打地鼠小游戏App的设计与实现

5.1 功能简介

  • 在窗体上放置一张有多个“洞穴”的背景图片,然后在每个洞穴处随机显示地鼠
  • 用户用鼠标点击出现的地鼠,如果点击到了,则该地鼠不再显示在该洞穴,显示在其他洞穴,同时在屏幕上通过消息提示框显示打到了几只地鼠。

5.2 设计思路

在这里插入图片描述

5.2.1 Thread线程和Handler消息处理机制(处理地鼠随机出现)

复习线程概念。 区分线程和进程:
在安卓中,一个安卓应用就是一个进程,每个应用在各自的进程中运行。线程是比进程更小的独立运行的基本单位,一个进程可以包含多个线程。

  • 在Android中子线程不允许操作主线程中的组件
  • 必须在子线程中更新UI组件,应该怎么办?
    (通过Handler消息处理机制)
    在这里插入图片描述Android中线程之间的消息传递也称异步消息处理机制,主要由Message、Handler、MessageQueue和Looper来完成。
  • Message:消息
    • Message用于封装消息,它的arg1和arg2是用来存放整型数据的;what是用来保存消息标示的;obj是Object类型的任意对象;
  • Handler:消息处理器
    • Handler主要用于发送和处理消息。通常,在子线程中调用sendMessage()方法发送消息。在主线程中执行handleMessage()方法处理消息。消息的发送和处理是异步执行的,不能期望消息发送之后,Handler能立即处理消息。
  • MessageQueue:消息队列
    • 通过Handler发送的消息都保存在消息队列中,等待被处理。
  • Looper:消息循环
    • Looper主要完成消息派遣任务。

5.2.2 步骤细化

在这里插入图片描述

5.3 操作演示

在布局文件中进行下列操作
在这里插入图片描述1.将所需图片,地鼠和背景图粘贴进drawable目录中
在这里插入图片描述在activity_main.xml中
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
可以看到,目前敲的情况,有一些问题1.竖版不匹配,2.地鼠位置也有些问题3.不想要上边框
在这里插入图片描述手动旋转屏幕后
在这里插入图片描述解决方法1.去掉顶部栏
在这里插入图片描述展示为全屏,但还有时间栏
在这里插入图片描述通过点击洞穴位置来定位数值
在这里插入图片描述在这里插入图片描述在这里插入图片描述
如图所示,地鼠位置正常
在这里插入图片描述

5.4 示例源码

//MainActivity.java
package com.example.mouseqixue;

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

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Random;

import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

public class MainActivity extends AppCompatActivity {

    /******************************1.定义变量、对象、洞穴坐标***********************/
    private int i = 0; //记录打到的地鼠个数
    private ImageView mouse;//定义mouse对象
    private TextView info1; //定义info1对象(用于查看洞穴坐标)
    private  Handler handler;//声明一个Handler对象
    public int[][] position=new int[][]{
            {336,252},{704,239},{1103,252},
            {268,414},{720,400},{1106,419},
            {265,600},{710,603},{1160,614}   //数值定位,因为不同的模拟器尺寸不一样,所以定位数据不同
    };//创建一个表示地鼠位置的数组
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置不显示顶部栏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 设置横屏

        /***********************2.绑定控件******************************************/
        mouse = (ImageView) findViewById(R.id.imageView_1);
        info1 = findViewById(R.id.info);
        /***********************************最终附加,获得洞穴位置**************************************/
     /*   info1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()){          //获取到动作
                    case MotionEvent.ACTION_DOWN:            //点击洞穴上方偏左一点点,因为坐标不是洞穴的中心,而是左上角
                        float x = event.getRawX();            //点击设置x轴坐标,如果上方有程序栏,会包括那一段距离
                        float y = event.getRawY();            //设置y轴坐标(不包括程序栏名称)
                        Log.i("x:"+x,"y"+y);
                        break;
                    default:
                        break;
                }
                return false;
            }
        });*/
        /**************************3.实现地鼠随机出现*******************************/
        //创建Handler消息处理机制
        //创建线程
        handler = new Handler() {
            @Override
            public void handleMessage(@NonNull Message msg) {
                //写需要处理的消息
                int index;
                if (msg.what == 0x101) {
                    index = msg.arg1; //获取位置索引值
                    mouse.setX(position[index][0]); //设置x轴坐标
                    mouse.setY(position[index][1]); //设置y轴坐标
                    mouse.setVisibility(View.VISIBLE);//设置地鼠显示
                }
                super.handleMessage(msg);
            }
        };
        //创建线程
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                int index = 0; //定义一个记录地鼠位置的索引值
                while (!Thread.currentThread().isInterrupted()) {//当前进程不中断的时候
                    index = new Random().nextInt(position.length);  //产生一个随机整数(范围:0《=index<数组长度)
                    Message m = handler.obtainMessage();//创建消息对象
                    m.what = 0x101;//设置消息标志
                    m.arg1 = index; //保存地鼠位置的索引值
                    handler.sendMessage(m); //发送消息通知Handler处理
                    try {
                        Thread.sleep(new Random().nextInt(500) + 500);//休眠一段时间

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }

            }
        });
        t.start();
        /*****************************4.实现点击地鼠后的事件,让地鼠不显示&显示**************************************/
        //添加点击mouse后的事件
        mouse.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                v.setVisibility(View.INVISIBLE);//设置地鼠不显示
                i++;
                Toast.makeText(MainActivity.this,"打到"+i+"只地鼠!",Toast.LENGTH_LONG).show(); //显示消息提示框
                return false;
            }
        });
    }
}

//activity_main.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"
    android:background="@drawable/didong"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView_1"
        android:layout_width="72dp"
        android:layout_height="72dp"
        android:src="@drawable/dishu"/>
    <TextView
        android:id="@+id/info"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>

</FrameLayout>

图片didong
在这里插入图片描述
图片dishu
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值