Android编程基础
注:以下内容来自第三章
本篇用到的布局代码
<?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/msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.592" /> <Button android:id="@+id/btn_test" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.28" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.405" /> <Button android:id="@+id/btn_exit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="退出" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.75" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.405" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/constraintLayout" android:layout_width="412dp" android:layout_height="65dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="1.0"> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
一、匿名内部类和普通内部类
以按钮编程为例展示匿名内部类和普通内部类的写法
- 匿名内部类
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //退出 Button btn1 = (Button) findViewById(R.id.btn_exit); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); //测试 Button btn2 = (Button) findViewById(R.id.btn_test); btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TextView tv = (TextView) findViewById(R.id.msg); tv.setText("Hello"); } }); } }
- 普通内部类
public class MainActivity extends AppCompatActivity { class BtnClickListener implements View.OnClickListener{ @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_test: TextView tv = (TextView) findViewById(R.id.msg); tv.setText("Hello"); break; case R.id.btn_exit: finish(); break; } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn1 = (Button) findViewById(R.id.btn_test); Button btn2 = (Button) findViewById(R.id.btn_exit); BtnClickListener listener = new BtnClickListener(); btn1.setOnClickListener(listener); btn2.setOnClickListener(listener); } }
二、常见的提示框、对话框写法
- Toast消息提示框
- Snackbar对话框
- AlertDialog对话框
Toast消息提示框

写法Toast.makeText(context, text, duration ),show()
解释:
1.context代表上下文参数,比如Activity,this
2.text填入你要显示的信息
3.duration表示显示时长
实例:
btn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TextView tv = (TextView) findViewById(R.id.msg); tv.setText("Hello"); Toast.makeText(MainActivity.this,"测试成功",Toast.LENGTH_LONG).show(); } });
Snackbar对话框

注意:写之前要在布局中添加“ConstraintLayout”这个组件
写法:链式写法
Snackbar.make(view, text, duration ) .setAction("按钮文字", new View. OnClickListener(){ @Override public void onClick(View v){ //操作 } }) .show();
解释:
1.“view”常用findViewById(R.id.xx)
示例:
btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(findViewById(R.id.constraintLayout),"确定退出吗",Snackbar.LENGTH_LONG).setAction("确定",new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }) .setActionTextColor(Color.RED) .setBackgroundTint(Color.BLUE) .show(); } });
AlertDialog对话框

示例:
btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new AlertDialog.Builder(MainActivity.this) .setIcon(R.drawable.alert) .setTitle("提示") .setMessage("确定退出吗?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .setNegativeButton("取消",null) .show(); } });
高级AlertDialog
- 带列表项的对话框
- 带单选列表项的对话框
- 带多选列表项的对话框
- 自定义布局的对话框
以上的内容在具体的项目实践中会提到,此处不详细说明
三、基于回调的事件处理机制
背景:如果按的是返回键,如何弹出退出提示
使用的方法:onKeyDown回调方法
两种常见的应用场景:
1.点击返回键,弹出对话框,询问是否退出
2.点击返回键,2秒内再次按返回键进行退出
四、对代码进行封装
借鉴下这种规范的写法
package com.dzh.review; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.content.DialogInterface; import android.graphics.Color; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.google.android.material.snackbar.Snackbar; public class MainActivity extends AppCompatActivity { private Button btn1; private Button btn2; private TextView tv; private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_test: test(); break; case R.id.btn_exit: alert(); break; } } }; public void test() { tv.setText("武汉科技大学"); Toast.makeText(MainActivity.this, "设置完成", Toast.LENGTH_SHORT).show(); } public void alert() { new AlertDialog.Builder(MainActivity.this) .setIcon(R.drawable.alert) .setTitle("提示") .setMessage("确定退出吗?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }) .setNegativeButton("取消", null) .show(); } public void init() { btn1 = (Button) findViewById(R.id.btn_test); btn2 = (Button) findViewById(R.id.btn_exit); tv = (TextView) findViewById(R.id.msg); btn1.setOnClickListener(listener); btn2.setOnClickListener(listener); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == event.KEYCODE_BACK) { alert(); } return true; } }

浙公网安备 33010602011771号