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
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章