打地鼠小遊戲
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