课件下载

详解 Hello World

Activity

一个可视化的界面,独立的窗口,继承来自AppCompatActivity

  • MainActivity
  • onCreate()
  • setContentView()
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {//重写了父类的方法 当这个界面别启动的时候 就开始执行 onCreate@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置内容视图 打开布局文件 layout//R 为每一个资源文件按类别分配一个索引setContentView(R.layout.activity_main);}
}

布局文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

清单文件

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.e.myapplication"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity">//指定启动界面<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

布局

布局是指对界面结构的全面规划与安排,通过api中提供的各种布局能够快速的完成对于界面的设计;

常用布局

线性布局(LinearLayout)

垂直线性布局(vertical);
水平线性布局(horizontal);

代码文件:

//chatting_layout.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"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"android:background="#333333"android:paddingLeft="15dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="<"android:textColor="#ffffff"android:textSize="50dp"android:layout_gravity="center_vertical"/><TextViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="耳朵"android:textSize="50dp"android:textColor="#ffffff"android:layout_gravity="center_vertical"/><ImageViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="0.5"android:layout_gravity="center_vertical"app:srcCompat="@mipmap/ic_launcher_round" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:orientation="horizontal"android:layout_weight="1"></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"android:background="#cccccc"><ImageViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1"app:srcCompat="@mipmap/yuyin" /><ImageViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center_vertical"app:srcCompat="@mipmap/xiaolian" /><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="4"/><ImageViewandroid:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center_vertical"app:srcCompat="@mipmap/jiahao" /></LinearLayout></LinearLayout>

运行效果:

相对布局(RelativeLayout)

相对布局不区分代码前后的关系,代码前后并不能决定组件的位置;

相对布局重要属性

1.相对于父容器(取值:true / false),如:android:layout_alignParentRight

2.相对于其他控件(取值:其他控件id),如:android:layout_toRightOf

在参照物的某一边:
layout_toRightOf
layout_toLeftOf
layout_above
layout_below
和参照物的某边线对齐:
layout_alignBottom
layout_alignTopTop
layout_alignTopLeft
layout_alignTopRight

代码文件:

//relative_test.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent" android:layout_height="match_parent"><TextViewandroid:id="@+id/center"android:layout_width="100dp"android:layout_height="100dp"android:textSize="30sp"android:text="屏幕正中间"android:background="#ff0000"android:layout_centerInParent="true"/><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:textSize="30sp"android:text="中偏左上"android:background="#00ff00"android:layout_toLeftOf="@+id/center"android:layout_above="@+id/center"/><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:textSize="30sp"android:text="中偏右上"android:background="#0000ff"android:layout_toRightOf="@+id/center"android:layout_above="@+id/center"/><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:textSize="30sp"android:text="中偏左下"android:background="#ccff00"android:layout_toLeftOf="@+id/center"android:layout_below="@+id/center"/><TextViewandroid:layout_width="100dp"android:layout_height="100dp"android:textSize="30sp"android:text="中偏右下"android:background="#eeff00"android:layout_toRightOf="@+id/center"android:layout_below="@+id/center"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="和中间上边线对齐"android:background="#cccccc"android:layout_alignBottom="@+id/center"/>
</RelativeLayout>

运行演示:

帧布局(FrameLayout)

FrameLayout

重要属性
android:layout_gravity//控件重力
android:foreground//前景
android:foregroundGravity//前景重力

代码文件:

//frame_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"android:background="#cccccc"android:foreground="@mipmap/t"android:foregroundGravity="center"><TextViewandroid:layout_width="400dp"android:layout_height="400dp"android:background="#ff0000"android:layout_gravity="center"/><TextViewandroid:layout_width="350dp"android:layout_height="350dp"android:background="#00ff00"android:layout_gravity="center"/><TextViewandroid:layout_width="300dp"android:layout_height="300dp"android:background="#0000ff"android:layout_gravity="center"/><TextViewandroid:layout_width="250dp"android:layout_height="250dp"android:background="#00ffff"android:layout_gravity="center"/><TextViewandroid:layout_width="200dp"android:layout_height="200dp"android:background="#ff00ff"android:layout_gravity="center"/><TextViewandroid:layout_width="150dp"android:layout_height="150dp"android:background="#ffff00"android:layout_gravity="center"/></FrameLayout>

运行演示:

表格布局(TableLayout)

网格布局(GridLayout)

约束布局(ConstraintLayout)

重要属性

app:layout_constraintBottom_toBottomOf//约束当前view的底部位置
app:layput_constraintVertical_bias//垂直偏移量

代码文件:

//constraint_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"android:background="#ff0000"><!--app:android:layout_constraint方位_to方位Of="?"? :1.方位    2.引用其他控件idapp:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintVertical_bias="0.5" 垂直偏移量 正中间app:layout_constraintHorizontal_bias="0.5" 水平偏移量 正中间--><TextViewandroid:id="@+id/textView6"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="红包"android:textColor="#f6d5a8"android:textSize="22sp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/textView3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="< 返回"android:textSize="22sp"android:textColor="#f6d5a8"android:layout_marginTop="20dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"/><TextViewandroid:id="@+id/textView5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="红包记录"android:textSize="22sp"android:textColor="#f6d5a8"android:layout_marginTop="20dp"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"/><Buttonandroid:id="@+id/button2"android:layout_width="330dp"android:layout_height="60dp"android:background="#ffff00"android:text="一字千金红包"android:textSize="20sp"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.53" /><Buttonandroid:id="@+id/button"android:layout_width="330dp"android:layout_height="60dp"android:background="#ffff00"android:text="普通红包"android:textSize="20sp"android:layout_marginBottom="15dp"app:layout_constraintBottom_toTopOf="@+id/button2"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent" /><Buttonandroid:id="@+id/button3"android:layout_width="330dp"android:layout_height="60dp"android:background="#ffff00"android:text="口令红包"android:textSize="20sp"android:layout_marginBottom="15dp"app:layout_constraintBottom_toTopOf="@+id/button"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent" /><LinearLayoutandroid:id="@+id/linearLayout"android:layout_width="330dp"android:layout_height="60dp"android:orientation="horizontal"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/button2"app:layout_constraintVertical_bias="0.3"><EditTextandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3"android:gravity="center"android:hint="输口令,领红包" /><Buttonandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_gravity="center"android:layout_weight="1"android:background="#ffff00"android:text="确定"android:textSize="26sp" /></LinearLayout><TextViewandroid:id="@+id/textView7"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="口令红包规则"android:textSize="18sp"android:textColor="#f6d5a8"android:layout_marginTop="15dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/linearLayout" /></androidx.constraintlayout.widget.ConstraintLayout>

运行演示:

添加布局

利用xml文件设计

布局重要属性

android:layout_width//宽度
android:layout_height//高度
android:layout_padding//内边距
android:layout_margin//外边距

代码文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="20dp"android:padding="20dp"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="TextView" />
</LinearLayout>

运行效果:

线性布局重要属性

android:orientation//方向
当 android:orientation=”vertical” 时, 只有水平方向的设置才起作用,垂直方向的设置不起作用。即:left,right,center_horizontal 是生效的。vertical为垂直布局。

当 android:orientation=”horizontal” 时, 只有垂直方向的设置才起作用,水平方向的设置不起作用。即:top,bottom,center_vertical 是生效的。horizontal为水平布局。

android:layout_weight//权重
有 android:layout_weight 的组件先不动,等剩余的组件分配完空间以后,占领剩余的所有空间,具有 android:layout_weight 的组件 layout_width 设置成 0dp;

代码文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="20dp"android:padding="20dp"><TextViewandroid:id="@+id/textView"android:layout_width="0dp"android:layout_height="wrap_content"android:text="TextView"android:background="#ff0000"android:layout_weight="1"/><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView"android:background="#00ff00" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="TextView"android:background="#0000ff" />
</LinearLayout>

运行效果:

同理,利用 layout_weight 这样的属性,可以设置组件按比例显示,比如按照比例 1:1:1 显示;

代码文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="20dp"android:padding="20dp"><TextViewandroid:id="@+id/textView"android:layout_width="0dp"android:layout_height="wrap_content"android:text="TextView"android:background="#ff0000"android:layout_weight="1"/><TextViewandroid:id="@+id/textView1"android:layout_width="0dp"android:layout_height="wrap_content"android:text="TextView"android:background="#00ff00" android:layout_weight="1"/><TextViewandroid:id="@+id/textView2"android:layout_width="0dp"android:layout_height="wrap_content"android:text="TextView"android:background="#0000ff" android:layout_weight="1"/>
</LinearLayout>

运行效果:

android:layout_gravity//重力
可以控制组件的位置,bottom、top、center、left、right 等;

代码文件:

//linearlayout_test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="20dp"android:padding="20dp"><TextViewandroid:id="@+id/textView"android:layout_width="0dp"android:layout_height="wrap_content"android:text="TextView"android:background="#ff0000"android:layout_weight="1"android:layout_gravity="bottom"/><TextViewandroid:id="@+id/textView1"android:layout_width="0dp"android:layout_height="wrap_content"android:text="TextView"android:background="#00ff00"android:layout_weight="1"android:layout_gravity="center"/><TextViewandroid:id="@+id/textView2"android:layout_width="0dp"android:layout_height="wrap_content"android:text="TextView"android:background="#0000ff"android:layout_weight="1"/>
</LinearLayout>

运行效果:

使用java代码添加

代码文件:

//MainActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.graphics.Color;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);//1.根布局为线性布局 对象为本 MainActivityLinearLayout linearLayout = new LinearLayout(this);//2,设置宽高 和窗口等宽等高 MATCH_PARENT MATCH=匹配 PARENT=父容器linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));//3.背景设置为红色linearLayout.setBackgroundColor(Color.RED);//4.指定此Activity的内容视图为该线性布局setContentView(linearLayout);}
}

运行效果:

UI基础控件

通用属性

小案例



代码文件:

//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/qk"android:gravity="center_horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Sign Up"android:layout_marginTop="70dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Nothing is the world is impossible if you set your mind to do it."android:layout_margin="20dp"/><ImageViewandroid:layout_width="69dp"android:layout_height="75dp"android:src="@mipmap/love"android:layout_margin="10dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"/><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"/><Buttonandroid:layout_width="match_parent"android:layout_height="50dp"android:layout_marginLeft="30dp"android:layout_marginTop="40dp"android:layout_marginRight="30dp"android:background="#00000000"android:text="Register" />
</LinearLayout>

运行效果:

View

  • 处理文本内容的View(TextView)
  • 被点击的View(Button)
  • 处理图片内容的View(ImageView)
  • 接收用户信息输入的View(EditView)
  • 进度条类的View(ProgressBar)

TextView的继承体系


ScrollView标签里只能设置一个组件,否则app异常出错。解决的方法是在ScrollView中假如布局,才可以加入更多组件;
代码文件:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><!--android:textSize="22sp"设置字体的大小android:textColor="#00ffff"设置字体的颜色android:lineSpacingMultiplier="1.5"设置倍距android:lineSpacingExtra="15sp"修改间距--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:text="@string/long_txt"android:textSize="22sp"android:textColor="#00ffff"android:lineSpacingExtra="15sp"/><ImageViewandroid:layout_width="50dp"android:layout_height="50dp"android:src="@mipmap/love"android:layout_gravity="center_horizontal"/></LinearLayout></ScrollView>

运行演示:

设置文字段落的单行模式,单行文字走动的效果,需要注意的是,一个界面只有一个焦点,所以只能设置一个跑马灯;
代码文件:

//activity_text2
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent" android:layout_height="match_parent"><!--android:singleLine="true"设置单行模式android:ellipsize="start"设置省略号的位置android:focusable="true"设置可以获取焦点android:focusableInTouchMode="true"设置在触摸时可以获取焦点android:marqueeRepeatLimit="marquee_forever"设置跑马灯时常--><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:singleLine="true"android:text="@string/long_txt"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:marqueeRepeatLimit="marquee_forever"/></LinearLayout>

运行效果:

EditView

android:inputType//输入类型
android:hint//提示文字输入
android: maxLength//输入位数限制

代码文件:

//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/qk"android:gravity="center_horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Sign Up"android:layout_marginTop="70dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Nothing is the world is impossible if you set your mind to do it."android:layout_margin="20dp"/><ImageViewandroid:layout_width="69dp"android:layout_height="75dp"android:src="@mipmap/love"android:layout_margin="10dp"/><!--android:inputType 输入类型textPassword 密码输入number 正数字输入numberSigned 整数numberDecimal 小数phone 电话号码输入| 可以连接多个属性 numberSigned | numberDecimalandroid:hint输入提示android:maxLength输入长度限制--><EditTextandroid:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"android:inputType="textPassword"android:hint="输入密码"android:gravity="center"android:textColorHint="#000000"android:maxLength="5"android:background="@mipmap/t"/><EditTextandroid:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"android:inputType="number"android:hint="输入正整数数字"android:gravity="center"android:textColorHint="#000000"android:maxLength="3"android:background="@mipmap/t"/><EditTextandroid:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"android:inputType="phone"android:hint="输入电话号码"android:gravity="center"android:textColorHint="#000000"android:maxLength="11"android:background="@mipmap/t"/><EditTextandroid:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"android:inputType="numberSigned"android:hint="输入整数"android:gravity="center"android:textColorHint="#000000"android:maxLength="3"android:background="@mipmap/t"/><Buttonandroid:layout_width="match_parent"android:layout_height="50dp"android:layout_marginLeft="30dp"android:layout_marginTop="40dp"android:layout_marginRight="30dp"android:background="#00000000"android:text="Register" />
</LinearLayout>

运行效果:

Button

Button注册点击事件的方法
  • 自定义内部类
//ButtonActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class ButtonActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_button);Button btn1 = findViewById(R.id.btn1);//点击事件 被点击时候触发的事件MyClickListener myClickListener = new MyClickListener();btn1.setOnClickListener(myClickListener);//为按钮注册点击事件监听器}class MyClickListener implements View.OnClickListener {@Overridepublic void onClick(View view) {Log.e("TAB", "刚刚点击的按钮是注册了内部类监听器对象的按钮");}}
}
  • 匿名内部类
//ButtonActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class ButtonActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_button);Button bt2 = findViewById(R.id.btn2);bt2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.e("TBB", "刚刚点击的按钮是注册了匿名内部类监听器对象的按钮");}});}}
  • 当前Activity去实现事件的接口
//ButtonActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class ButtonActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_button);Button bt3 = findViewById(R.id.btn3);bt3.setOnClickListener(this);}@Overridepublic void onClick(View view) {Log.e("POP", "刚刚点击的按钮是注册了当前Activity去实现接口监听器对象的按钮");}
}
  • 在布局文件中添加点击事件属性
//xml<Buttonandroid:id="@+id/btn4"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="在布局文件中添加点击事件属性"android:onClick="MyClick"/>//ButtonActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class ButtonActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_button);}public void MyClick(View view) {Log.e("RER", "通过xml绑定的事件");}
}

当俩个点击事件的实现方法相同的时候,可以使用v.getId来使用;

//xml<Buttonandroid:id="@+id/btn4"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="在布局文件中添加点击事件属性_1"android:onClick="MyClick"/><Buttonandroid:id="@+id/btn5"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="在布局文件中添加点击事件属性_2"android:onClick="MyClick"/>
//ButtonActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class ButtonActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_button);}//参数:被点击的控件对象public void MyClick(View view) {switch (view.getId()) {case R.id.btn4:Log.e("RER", "通过xml绑定的事件_1");break;case R.id.btn5:Log.e("RER", "通过xml绑定的事件_2");break;default:}}
}

ImageView

用来显示和控制图像的控件,可以对它进行放大、缩小、旋转等操作,常用的属性有:
android:src
android:background

<!--
android:src 指定前景的背景资源 能够保证图片不变形 按照原来的比例
android:background 设置背景 会按照组件的实际比例变形
-->
<ImageViewandroid:layout_width="69dp"android:layout_height="75dp"android:src="@mipmap/love"android:background="#ffffff"android:layout_margin="10dp"/>

带按钮的图片显示控件;

<ImageButtonandroid:layout_width="300dp"android:layout_height="300dp"android:background="@mipmap/love"/>

ProgressBar

进度条,默认情况下是圆形的,没有刻度,只是一个不断旋转的动画效果。通过设置 style ,可以显示传统的水平带刻度进度条;

静态进度条

代码文件:

//activity_progreaa_Bar.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=".ProgressBarActivity"android:orientation="vertical"><!---进度条,默认属性样式是转圈,修改样式需设计分格style设置风格 style="?android:attr/progressBarStyleHorizontal" 设置水平进度条的样式android:progress="30" 设置进度android:max="200" 设置最大值android:indeterminate="true" 设置进度条一直滚动--><ProgressBarandroid:layout_width="wrap_content"android:layout_height="wrap_content"/><ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"android:progress="30"android:max="200"/><ProgressBarandroid:layout_marginTop="100dp"android:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"android:indeterminate="true"/></LinearLayout>

效果演示:

动态进度条

动态显示的进度条需要在java中配合设置才可以正常的显示吗,使用了线程;

代码文件:

//activity_progreaa_Bar.xml
<ProgressBarandroid:id="@+id/progess"android:layout_marginTop="100dp"android:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"/>
//ProgressBarActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.widget.ProgressBar;public class ProgressBarActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_progress_bar);final ProgressBar progressBar = findViewById(R.id.progess);/** 在Android中,4.0以后是不能直接在线程中操作控件的* 进度条是个特例 所以对象命名必须为 progressBar* 1000代表的是毫秒* */new Thread() {public void run() {for(int i = 1; i <= 100; i ++) {progressBar.setProgress(i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}
}
小案例升级

增加了输入为空判断、进度条隐藏显示、进度条走动;

代码文件:

//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/qk"android:gravity="center_horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Sign Up"android:textSize="35dp"android:layout_marginTop="70dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Nothing is the world is impossible if you set your mind to do it."android:layout_margin="20dp"/><!--android:src 指定前景的背景资源 能够保证图片不变形 按照原来的比例android:background 设置背景 会按照组件的实际比例变形--><ImageViewandroid:layout_width="69dp"android:layout_height="75dp"android:src="@mipmap/love"android:background="#ffffff"android:layout_margin="10dp"/><!--<ImageButtonandroid:layout_width="300dp"android:layout_height="300dp"android:background="@mipmap/love"/>--><!--android:inputType 输入类型textPassword 密码输入number 正数字输入numberSigned 整数numberDecimal 小数phone 电话号码输入| 可以连接多个属性 numberSigned | numberDecimalandroid:hint输入提示android:maxLength输入长度限制--><EditTextandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"android:inputType="textPassword"android:hint="输入密码"android:gravity="center"android:textColorHint="#000000"android:maxLength="5"android:background="@mipmap/t"/><EditTextandroid:id="@+id/number"android:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"android:inputType="number"android:hint="输入正整数数字"android:gravity="center"android:textColorHint="#000000"android:maxLength="3"android:background="@mipmap/t"/><ProgressBarandroid:id="@+id/progess1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"style="?android:attr/progressBarStyleHorizontal"android:visibility="invisible"/><EditTextandroid:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="20dp"android:inputType="phone"android:hint="输入电话号码"android:gravity="center"android:textColorHint="#000000"android:maxLength="11"android:background="@mipmap/t"/><EditTextandroid:layout_width="match_parent"android:layout_height="40dp"android:layout_marginLeft="30dp"android:layout_marginRight="30dp"android:layout_marginTop="40dp"android:inputType="numberSigned"android:hint="输入整数"android:gravity="center"android:textColorHint="#000000"android:maxLength="3"android:background="@mipmap/t"/><Buttonandroid:layout_width="match_parent"android:layout_height="50dp"android:layout_marginLeft="30dp"android:layout_marginTop="40dp"android:layout_marginRight="30dp"android:background="#00000000"android:text="Register"android:onClick="register"/></LinearLayout>
//MainActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
//        //1.根布局为线性布局 对象为本 MainActivity
//        LinearLayout linearLayout = new LinearLayout(this);
//        //2,设置宽高 和窗口等宽等高 MATCH_PARENT MATCH=匹配 PARENT=父容器
//        linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
//        //3.背景设置为红色
//        linearLayout.setBackgroundColor(Color.RED);
//        //4.指定此Activity的内容视图为该线性布局
//        setContentView(linearLayout);}public void register(View view) {//1.判断输入是否为空EditText editText = findViewById(R.id.password);EditText editText1 = findViewById(R.id.number);String str = editText.getText().toString();String str1 = editText1.getText().toString();if(str.equals("") || str1.equals("")) {//2.如果为空则提示//无焦点提示//参数1 环境上下文(依赖的对象) 参数2 提示的文本 参数3 提示需要持续的时间Toast.makeText(this, "输入不能为空", Toast.LENGTH_SHORT).show();} else {//3.不为空则出示进度条final ProgressBar progressBar = findViewById(R.id.progess1);progressBar.setVisibility(View.VISIBLE);new Thread() {public void run() {for(int i = 1; i <= 100; i ++) {progressBar.setProgress(i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}}
}

运行演示:

CheckBox

  1. 系统封装的复选控件;
  2. 两种状态:选中及未选中 setChecked() isChecked()
  3. 监听状态变化:setOnCheckedChangeListener

代码文件:

//CheckBox.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CompoundButton;public class CheckBox extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_check_box);android.widget.CheckBox checkBox = findViewById(R.id.checkBox);//设置它的状态checkBox.setChecked(false);//获取它的状态boolean ischecked = checkBox.isChecked();checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {Log.d("TDD", "check : " + b);}});}
}
//activity_check_box.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=".CheckBox"android:orientation="vertical"><CheckBoxandroid:id="@+id/checkBox"android:layout_width="match_parent"android:layout_height="wrap_content"android:checked="true"android:text="CheckBox"/></LinearLayout>

运行演示:

RadioButton

  1. 单选控件;
  2. 可以和RadioGroup一起使用,只能选择一个;
  3. 和CheckBox的区别
    通过点击无法变为未选中;
    一组RadioButton只能同时选中一个;
    在大部分UI框架中默认都是圆形表示;

代码文件:

//activity_check_box.xml
<RadioGroupandroid:layout_width="match_parent"android:layout_height="match_parent" ><RadioButtonandroid:id="@+id/radioButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="RadioButton" /><RadioButtonandroid:id="@+id/radioButton2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="RadioButton" /><RadioButtonandroid:id="@+id/radioButton3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="RadioButton" />
</RadioGroup>

运行演示:

ToggleButton

  1. 切换程序中的状态;
  2. 两种状态:
    android:textOn
    android:textOff
    setChecked(boolean)
  3. setOnCheckedChangeListener

代码文件:

//CheckBox.java
ToggleButton toggleButton = findViewById(R.id.toggleButton);
//设置它的状态
toggleButton.setChecked(true);
//获取它的状态
boolean istoggle = toggleButton.isChecked();toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton compoundButton, boolean b) {Log.d("TDD", "toggcheck : " + b);}
});
//activity_check_box.xml
<ToggleButtonandroid:id="@+id/toggleButton"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="ToggleButton"android:textOn="Hello"android:textOff="Bye"android:checked="false" />

运行演示:

SeekBar

  1. 使用场景:音乐的进度条;
  2. 简单使用与事件监听:
    setProgress
    setOnSeekBarChangeListener
  3. 注意事项:
    onStartTrackingTouch//开始记录
    onStopTrackingTouch//结束记录

代码文件:

//CheckBox.java
//设置它的状态
SeekBar seekBar = findViewById(R.id.seekBar);
seekBar.setMax(100);
seekBar.setProgress(50);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {Log.d("TDD", "OnProgressChange" + i);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {Log.d("TDD", "onStartTrackingTouch" + seekBar.getProgress());}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {Log.d("TDD", "onStopTrackingTouch" + seekBar.getProgress());}
});
//activity_check_box.xml
<SeekBarandroid:id="@+id/seekBar"android:layout_width="match_parent"android:layout_height="wrap_content"android:max="100"android:progress="30"android:layout_marginLeft="20sp"android:layout_marginRight="20dp"/>

运行演示:

Activity

什么是Activity:

可以理解为是一个界面;

启动Activity:

android:label=""是给主界面起名字;

//AndroidManifest.xml
<activity android:name=".TestActivity"android:label=""><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>
//TestActivity.java
package com.e.myapplication;import androidx.appcompat.app.AppCompatActivity;public class TestActivity extends AppCompatActivity {}

Activity和layout的关系:

这里的Activity是上面创建的TestActivity,layout是创建的activity_text.xml,使用 setContentView联系起来;

//TestActivity.java
package com.e.myapplication;import android.os.Bundle;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class TestActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_text);}
}

Activity和View的关系:

在TestActivity.java文件中,通过findViewById可以把在layout中的View和Activity联系起来;

Activity之间的跳转(Intent)

  • Activity之间的跳转;

打开的界面将会以栈的形式保存下来,退回去的过程就是出栈的过程;

关键代码:

//TestActivity.java
Intent intent = new Intent(当前Activity.this, 目标Activity.class);
startActivity(intent);

四种启动模式

标准模式在 AndroidManifest.xml 中设置,可以在每个文件中使用android:launchMode=""来设置,默认使用的是standard;

//AndroidMaifest.xml
<activity android:name=".TestActivity"android:launchMode="singleTop"android:label=""><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>
  1. standard(代码默认的就是标准模式)

  1. singleTop


在标准模式下打开Activity会直接入栈叠加,相同的也不会做任何的处理,例如:ABCC,而singleTop不一样,会自动的处理顶层相同的Activity,例如:ABCC处理成ABC,相同的界面无论打开多少次,只保存一次,那么对应的,返回去的时候就只返回一次;

  1. singleTask

只有一个,一旦发现前面打开的Activity有当前这个的时候,就会清空之间的Activity;

  1. singlelnstance


独占性,例如:打电话;

四种启动模式的应用

不仅仅可以使用上述的四种模式在 AndroidManifest.xml 中设置,也可以在所对应的java文件Activity中设置;

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);对应singleTask
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);对应singleTop
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);对应singlelnstance

Menu

选项菜单(OptionMenu)

选项菜单是一个应用的主菜单用于放置对应用产生全局影响的操作,新建文件夹menu,在里面创建option.xml菜单资源,在菜单的嵌套中顶多能有一级嵌套;

代码文件:

//option.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><group /><item android:title="保存"/><item android:title="设置"/><item android:title="更多菜单"><menu><item android:title="下载"/><item android:title="更新"/><item android:title="反馈"/></menu></item>
</menu>

表示在activity_main界面上使用菜单资源menu.xml,重写方法onCreateOptionsMenu,利用getMenuInflater().inflate(R.menu.option, menu);进行设置;

//MenuActivity.java
package com.e.myapplication;import android.os.Bundle;
import android.view.Menu;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MenuActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.option, menu);return true;}
}

运行演示:


针对这个菜单选项还有一些可以设置的属性,在menu文件夹下的option.xml设置;

  • app:showAsAction="always"可以把一个菜单选项固定在上边框,直接溢出显示,never不显示,ifRoom有空间就显示;

代码文件:

//option.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><group /><item android:title="保存"app:showAsAction="always"/><item android:title="设置"/><item android:title="更多菜单"><menu><item android:title="下载"/><item android:title="更新"/><item android:title="反馈"/></menu></item>
</menu>

运行效果:

  • android:icon="@图片地址"也可以将上面对应的文字的地方换成图标来显示;

代码文件:

//option.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><group /><item android:title="保存"android:icon="@mipmap/love"app:showAsAction="always"/><item android:title="设置"/><item android:title="更多菜单"><menu><item android:title="下载"/><item android:title="更新"/><item android:title="反馈"/></menu></item>
</menu>

运行演示:

为了让设置的选项有实际的效果,不至于那么的冗余,在MenuActivity.java中重写方法``用来处理所设置的菜单选项,当然,前面的option.xml中的是需要设置id的;

特别需要知道的是Toast.makeText(this, "文本提示", Toast.LENGTH_SHORT).show();实在APP界面弹窗显示;

代码文件:

//option.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><group /><item android:title="保存"android:id="@+id/save"android:icon="@mipmap/love"app:showAsAction="ifRoom"/><item android:title="设置"android:id="@+id/setting"/><item android:title="更多菜单"><menu><item android:title="下载"/><item android:title="更新"/><item android:title="退出"android:id="@+id/exit"/></menu></item>
</menu>
//MenuActivity.java
package com.e.myapplication;import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MenuActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.option, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.save:Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show();break;case R.id.setting:Toast.makeText(this,"设置", Toast.LENGTH_SHORT).show();break;case R.id.exit:finish();break;default:}return super.onOptionsItemSelected(item);}
}

运行演示:

按下退出,因为在MenuActivity.java中设置了finish(),所以会自动地退出APP;

上下文菜单(ContextMenu)

ContexMenu实现

代码文件:

//context.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><item android:title="删除"android:id="@+id/delete"/><item android:title="重命名"android:id="@+id/over"/>
</menu>

//activity_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/ctx_btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="上下文菜单"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"/><Buttonandroid:id="@+id/ctx_btt"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="上下文菜单"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"/></LinearLayout>

//MenuActivity.java
package com.e.myapplication;import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MenuActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_menu);//ctx_btn: 演示 ContextMenu//1.注册registerForContextMenu(findViewById(R.id.ctx_btn));//2.创建、覆盖//3.菜单项的操作}//2.创建、覆盖@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {getMenuInflater().inflate(R.menu.context, menu);}//3.菜单项的操作@Overridepublic boolean onContextItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.delete:Toast.makeText(this, "已删除", Toast.LENGTH_SHORT).show();break;case R.id.over:Toast.makeText(this, "已重命名", Toast.LENGTH_SHORT).show();break;default:}return super.onContextItemSelected(item);}
}

运行演示:

为按钮设置上下文操作模式

第一小点 实现接口ActionMode CallBack
第二小点 在View的长按事件中启动上下文操作模式

代码文件:

//context.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><item android:title="删除"android:id="@+id/delete"/><item android:title="重命名"android:id="@+id/over"/>
</menu>

//activity_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/ctx_btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="上下文菜单"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"/><Buttonandroid:id="@+id/ctx_btt"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="上下文菜单"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"/></LinearLayout>

//Activity_Menu.java
package com.e.myapplication;import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MenuActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_menu);//4.为按钮设置上下文操作模式//第一小点 实现接口ActionMode CallBack//第二小点 在View的长按事件中启动上下文操作模式findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {startActionMode(cb);return false;}});}ActionMode.Callback cb = new ActionMode.Callback() {//创建 在启动上下文操作模式(startActionMode(Callback))时调用@Overridepublic boolean onCreateActionMode(ActionMode actionMode, Menu menu) {Log.e("TDD", "创建");getMenuInflater().inflate(R.menu.context, menu);return true;}//在创建方法后进行调用@Overridepublic boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {Log.e("TDD", "准备");return false;}@Overridepublic boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {Log.e("TDD", "点击");switch (item.getItemId()) {case R.id.delete:Toast.makeText(MenuActivity.this, "已删除", Toast.LENGTH_SHORT).show();break;case R.id.over:Toast.makeText(MenuActivity.this, "已重命名", Toast.LENGTH_SHORT).show();break;default:}return true;}//上下文操作结束时被调用@Overridepublic void onDestroyActionMode(ActionMode actionMode) {Log.e("TDD", "结束");}};
}

运行演示:


弹出菜单(PopupMenu)

一个模态形式展示的弹出风格的菜单绑在View上,一般出现咋被绑定的View的下方;

代码文件:

//context.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><item android:title="删除"android:id="@+id/delete"/><item android:title="重命名"android:id="@+id/over"/>
</menu>

//activity_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/ctx_btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="上下文菜单"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"/><Buttonandroid:id="@+id/ctx_btt"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="上下文菜单"android:layout_marginRight="20dp"android:layout_marginLeft="20dp"/></LinearLayout>

//MenuActivity.java
package com.e.myapplication;import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MenuActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_menu);//popup_btn: 演示PopupMenufinal Button btn = findViewById(R.id.popup_btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//实例化(参数二 是指出现在谁的下方)PopupMenu popupMenu = new PopupMenu(MenuActivity.this, btn);//加载菜单资源 利用MenuInflaterpopupMenu.getMenuInflater().inflate(R.menu.context, popupMenu.getMenu());//为PopupMenu设置点击监听器popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem menuItem) {switch (menuItem.getItemId()) {case R.id.delete:Toast.makeText(MenuActivity.this, "已删除", Toast.LENGTH_SHORT).show();break;case R.id.over:Toast.makeText(MenuActivity.this, "已重命名", Toast.LENGTH_SHORT).show();break;default:}return false;}});//显示PopupMenupopupMenu.show();}});}
}

运行演示:


Menu创建的方式

通过xml定义

getMenuInflater().inflate(R.menu.option, menu);
popupMenu.getMenuInflater().inflate(R.menu.context, popupMenu.getMenu());

通过Java定义

在点击事件中代替xml所处的位置进行设置;

代码文件:

//MenuActivity.java
package com.e.myapplication;import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MenuActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_menu);//popup_btn: 演示PopupMenufinal Button btn = findViewById(R.id.popup_btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//实例化(参数二 是指出现在谁的下方)PopupMenu popupMenu = new PopupMenu(MenuActivity.this, btn);//加载菜单资源 利用MenuInflater//popupMenu.getMenuInflater().inflate(R.menu.context, popupMenu.getMenu());popupMenu.getMenu().add(1, 1, 1, "删除");SubMenu sub =  popupMenu.getMenu().addSubMenu(1, 2, 2, "更多");sub.add(2, 3, 1, "保存");sub.add(2, 4, 2, "退出");//为PopupMenu设置点击监听器popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem menuItem) {switch (menuItem.getItemId()) {/*case R.id.delete:Toast.makeText(MenuActivity.this, "已删除", Toast.LENGTH_SHORT).show();break;case R.id.over:Toast.makeText(MenuActivity.this, "更多", Toast.LENGTH_SHORT).show();break;default:*/case 1:Toast.makeText(MenuActivity.this, "已删除", Toast.LENGTH_SHORT).show();break;case 3:Toast.makeText(MenuActivity.this, "已保存", Toast.LENGTH_SHORT).show();break;case 4:Toast.makeText(MenuActivity.this, "已退出", Toast.LENGTH_SHORT).show();finish();break;default:}return false;}});//显示PopupMenupopupMenu.show();}});}
}

演示效果:

xml定义的优势

  • 清晰的菜单结构;
  • 将菜单内容与应用的逻辑代码分离;
  • 资源适配更容易;

Menu显示总结

onCreateOptionsMenu方法必须返回true
onOptionsItemSelected方法必须返回true

AlertDialog

AlertDialog
自定义Dialog
pupWindow

AlertDialog

对话框: 消息提示机制,常用于向 用户传递信息,提示或警告用户的行为,通常的方法有:

setTitle
setMessage
create
show

第一种实现方法

不直接的使用AlertDialog,使用构建器;

代码文件:

//activity_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/but1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginRight="30dp"android:layout_marginLeft="30dp"android:layout_marginTop="20dp"android:text="显示一个普通对话框"android:onClick="MyClick"/><Buttonandroid:id="@+id/but2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginRight="30dp"android:layout_marginLeft="30dp"android:layout_marginTop="20dp"android:text="显示一个自定义对话框"android:onClick="MyClick"/></LinearLayout>
//DialogActivity.java
package com.e.myapplication;import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;public class DialogActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dialog);}public void MyClick(View view) {switch (view.getId()) {case R.id.but1://实例化一个构建器AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("提示");builder.setMessage("你需要退出嘛");builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {finish();}});builder.show();
//                AlertDialog dialog = builder.create();
//                dialog.show();break;case R.id.but2:break;default:}}
}

运行演示:

第二种实现方法

直接使用 AlertDialog;

代码文件:

//activity_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/but1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginRight="30dp"android:layout_marginLeft="30dp"android:layout_marginTop="20dp"android:text="显示一个普通对话框"android:onClick="MyClick"/><Buttonandroid:id="@+id/but2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginRight="30dp"android:layout_marginLeft="30dp"android:layout_marginTop="20dp"android:text="显示一个自定义对话框"android:onClick="MyClick"/></LinearLayout>
//DialogActivity.java
package com.e.myapplication;import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;public class DialogActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dialog);}public void showMormalDialog() {AlertDialog dialog = new AlertDialog.Builder(this).create();dialog.setTitle("提示");dialog.setMessage("你确定要退出程序嘛");dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {finish();}});dialog.show();}public void MyClick(View view) {switch (view.getId()) {case R.id.but1:break;case R.id.but2:showMormalDialog();break;default:}}
}

运行演示:

自定义Dialog

  1. 设置布局

代码文件:

//dialog_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:background="@mipmap/love"><TextViewandroid:layout_width="300dp"android:layout_height="wrap_content"android:text="您确定要退出嘛?"android:textStyle="bold"android:textSize="25sp"android:layout_marginTop="200dp" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginTop="30dp"><Buttonandroid:id="@+id/yes"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确定"/><Buttonandroid:id="@+id/no"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="取消"android:layout_marginLeft="30dp"/></LinearLayout></LinearLayout>

效果图:

  1. 设置Style

代码文件:

//styles.xml
<resources><!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style>//新增<style name="MyDialog" parent="android:style/Theme.Dialog"><item name="android:windowNoTitle">true</item><item name="android:windowBackground">@android:color/transparent</item></style></resources>
  1. 自定义Dialog

代码文件:

//MyDialog.java
package com.e.myapplication;import android.app.Dialog;
import android.content.Context;
import android.view.View;import androidx.annotation.NonNull;public class MyDialog extends Dialog {public MyDialog(@NonNull Context context, int themeResId) {super(context, themeResId);setContentView(R.layout.dialog_layout);findViewById(R.id.yes).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {System.exit(0);}});findViewById(R.id.no).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {dismiss();}});}
}
//DialogActivity.java
package com.e.myapplication;import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;public class DialogActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dialog);}public void MyClick(View view) {switch (view.getId()) {case R.id.but1:break;case R.id.but2:MyDialog dialog = new MyDialog(this, R.style.MyDialog);dialog.show();break;default:}}
}
  1. 显示

PopupWindow

设置弹窗

  1. 创建PopupWindow对象实例
  2. 设置背景,注册事件监听器和添加动画
  3. 显示PopupWindow

代码文件:

//popup_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="match_parent"android:layout_height="match_parent"android:padding="2dp"><TextViewandroid:id="@+id/choose"android:layout_width="60dp"android:layout_height="30dp"android:text="选择"android:textColor="#ffffff"android:gravity="center"android:background="#000000"/><TextViewandroid:id="@+id/chooseall"android:layout_width="60dp"android:layout_height="30dp"android:text="全选"android:textColor="#ffffff"android:gravity="center"android:background="#000000"/><TextViewandroid:id="@+id/copy"android:layout_width="60dp"android:layout_height="30dp"android:text="复制"android:textColor="#ffffff"android:gravity="center"android:background="#000000"/></LinearLayout>

效果:

//activity_  dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/but1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginRight="30dp"android:layout_marginLeft="30dp"android:layout_marginTop="20dp"android:text="显示一个普通对话框"android:onClick="MyClick"/><Buttonandroid:id="@+id/but2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginRight="30dp"android:layout_marginLeft="30dp"android:layout_marginTop="20dp"android:text="显示一个自定义对话框"android:onClick="MyClick"/><Buttonandroid:id="@+id/but3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="弹窗"android:layout_gravity="center_horizontal"android:layout_marginTop="20dp"android:onClick="MyClick"/></LinearLayout>

效果:

//DialogActivity.java
package com.e.myapplication;import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.PopupWindow;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;public class DialogActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dialog);}public void showPopupWindow(View view) {//1.实例化一个对象//参数1 :用在弹窗中的view 参数2和参数3 是弹窗的宽高 参数4 能否设置焦点View v = LayoutInflater.from(this).inflate(R.layout.popup_layout, null);//将整个布局当作一个视图处理final PopupWindow popupWindow = new PopupWindow(v, 490, 90, true);//2.设置背景(背景、动画)//设置背景popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//设置背景为透明色//设置能相应外部事件的点击事件popupWindow.setOutsideTouchable(true);//设置弹窗能相应点击事件popupWindow.setTouchable(true);//3.显示//参数1 锚//参数2 3 相对于锚在x,y方向的偏移量popupWindow.showAsDropDown(view, -100, 0);//为弹窗中的文本添加点击事件v.findViewById(R.id.choose).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(DialogActivity.this, "你点击了选择", Toast.LENGTH_SHORT).show();popupWindow.dismiss();//点击以后消失}});v.findViewById(R.id.chooseall).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(DialogActivity.this, "你点击了全选", Toast.LENGTH_SHORT).show();popupWindow.dismiss();}});v.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(DialogActivity.this, "你点击了复制", Toast.LENGTH_SHORT).show();popupWindow.dismiss();}});}public void MyClick(View view) {switch (view.getId()) {case R.id.but1:break;case R.id.but2:break;case R.id.but3:showPopupWindow(view);default:}}
}

效果:

设置弹窗动画

  1. 创建动画资源

//translate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translateandroid:fromXDelta="0"android:toXDelta="0"android:fromYDelta="300"android:toYDelta="0"android:duration="2000"></translate>
</set>
  1. 创建一个style应用刚刚的动画资源

//styles.xml
<resources><!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style><style name="MyDialog" parent="android:style/Theme.Dialog"><item name="android:windowNoTitle">true</item><item name="android:windowBackground">@android:color/transparent</item></style><style name="translate_anmi"><item name="android:windowEnterAnimation">@anim/translate</item></style></resources>
  1. 对当前弹窗的动画风格设置为第二步的资源索引
//DialogActivity.java
package com.e.myapplication;import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.PopupWindow;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;public class DialogActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dialog);}public void showPopupWindow(View view) {//1.实例化一个对象//参数1 :用在弹窗中的view 参数2和参数3 是弹窗的宽高 参数4 能否设置焦点View v = LayoutInflater.from(this).inflate(R.layout.popup_layout, null);//将整个布局当作一个视图处理final PopupWindow popupWindow = new PopupWindow(v, 490, 90, true);//2.设置背景(背景、动画)//设置背景popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//设置背景为透明色//设置能相应外部事件的点击事件popupWindow.setOutsideTouchable(true);//设置弹窗能相应点击事件popupWindow.setTouchable(true);//设置弹窗动画popupWindow.setAnimationStyle(R.style.translate_anmi);//3.显示//参数1 锚//参数2 3 相对于锚在x,y方向的偏移量popupWindow.showAsDropDown(view, -100, 0);//为弹窗中的文本添加点击事件v.findViewById(R.id.choose).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(DialogActivity.this, "你点击了选择", Toast.LENGTH_SHORT).show();popupWindow.dismiss();//点击以后消失}});v.findViewById(R.id.chooseall).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(DialogActivity.this, "你点击了全选", Toast.LENGTH_SHORT).show();popupWindow.dismiss();}});v.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(DialogActivity.this, "你点击了复制", Toast.LENGTH_SHORT).show();popupWindow.dismiss();}});}public void MyClick(View view) {switch (view.getId()) {case R.id.but1:break;case R.id.but2:break;case R.id.but3:showPopupWindow(view);default:}}
}

运行演示:

从下到上显示出来;

ArrayAdapter适配器

数组适配器,只能用来显示单一的文本。构造方法:
ArrayAdapter(Context context, int resource, int textviewld, List<T>objects)

代码文件:

//activity_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/but1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginRight="30dp"android:layout_marginLeft="30dp"android:layout_marginTop="20dp"android:text="显示一个普通对话框"android:onClick="MyClick"/><Buttonandroid:id="@+id/but2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginRight="30dp"android:layout_marginLeft="30dp"android:layout_marginTop="20dp"android:text="显示一个自定义对话框"android:onClick="MyClick"/><Buttonandroid:id="@+id/but3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="弹窗"android:layout_gravity="center_horizontal"android:layout_marginTop="20dp"android:onClick="MyClick"/><Buttonandroid:id="@+id/but4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Adapter"android:layout_gravity="center_horizontal"android:layout_marginTop="20dp"android:onClick="MyClick"/></LinearLayout>

效果:

//arrary_item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_vertical"android:padding="10dp"><ImageViewandroid:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/love"/><TextViewandroid:id="@+id/item_tx"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="测试"android:layout_marginLeft="15dp"/></LinearLayout>

效果:

//DialogActivity.java
package com.e.myapplication;import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.PopupWindow;
import android.widget.Toast;import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;public class DialogActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_dialog);}public void showArrayDialog() {final String[] items = {"Java", "C++", "C", "PHP"};//数组适配器//参数1 环境 参数2 布局资源索引 指的是每一项所呈现的样式 参数3 数据源
//        ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item, items);//参数3 int textviewId 指定文本需要放在布局中对应的Id文本空间的位置ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.arrary_item_layout,R.id.item_tx , items);AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle("请选择")//参数1 适配器对象(对数据显示样式的规则制定) 参数2 监听器.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {Toast.makeText(DialogActivity.this,items[i], Toast.LENGTH_SHORT).show();dialogInterface.dismiss();}});builder.show();}public void MyClick(View view) {switch (view.getId()) {case R.id.but1:break;case R.id.but2:break;case R.id.but3:break;case R.id.but4:showArrayDialog();default:}}
}

运行效果:


1小时学会Android基础相关推荐

  1. 零基础10小时学会3D基础建模,可能性有多大?现学现用现演示

    本期话题:10小时搞定零基础3D建模能实现么? 学习目标:分享3D建模思路,了解3D建模原理,10小时足够了. 工具软件: CimatronE13 UG NX12 Creo 6.0 SolidEdge ...

  2. 半小时学会Android软件版本更新

    各种平台软件更新做法差不多,大体做法如下: 1.服务器存放一个最新版本的xml文件,或者存在数据库,各种做法都可以. 1.1xml文件存储verCode verName updateUrl等信息 1. ...

  3. 1小时学会HTML5基础

    点击下载课件 初始HTML HTML(Hyper Text Markup Language)超文本标记语言 超文本包括:文字.图片.音频.视频.动画等 W3C(World Wide Web Conso ...

  4. 用几小时,零基础也能学会可视化大屏,这百张模板帮了大忙

    几小时,零基础,不会代码也能学会可视化大屏,是不是觉得活在梦里? 并不是,因为这100多张模板帮了大忙 可视化现在为什么可以这么火?甚至很多地方都能看见? 尤其是IT人的职场,工作展示.领导汇报,动不 ...

  5. android gpuimage 直播,1小时学会:最简单的iOS直播推流(四)如何使用GPUImage,如何美颜...

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 上 ...

  6. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第五章:中级控件

    第 5 章 中级控件 本章介绍App开发常见的几类中级控件的用法,主要包括:如何定制几种简单的图形.如何使用几种选择按钮.如何高效地输入文本.如何利用对话框获取交互信息等,然后结合本章所学的知识,演示 ...

  7. 1小时学会:最简单的iOS直播推流(八)h264/aac 软编码

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源 ...

  8. 1小时学会:最简单的iOS直播推流(七)h264/aac 硬编码

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源 ...

  9. 1小时学会:最简单的iOS直播推流(五)yuv、pcm数据的介绍和获取

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源 ...

最新文章

  1. a good way for improving my reading ability
  2. angularAMD快速入门
  3. 4、mybatis通过配置类Configuration 实现初始化
  4. primefaces_轻量级Web应用程序:PrimeFaces(JSF)+ Guice + MyBatis(第1部分)
  5. 【数据结构】二叉树的遍历及应用
  6. erlang一次线上问题解决
  7. python大法之二-一些基础(一)
  8. web前端数据可视化控件
  9. 计算机无法识别打印机usb,Windows7打印机usb无法识别如何解决
  10. 走进小作坊(九)----省时省力的二八法则
  11. 用python爬取3万多条评论,看韩国人如何评价韩国电影《寄生虫》?
  12. basic计算机编程基础,计算机编程基础(Visual Basic)
  13. HP LaserJet 1020打印机显示脱机,脱机使用打印机的勾去不掉
  14. DAY-20 GAN模式崩溃的理论解释
  15. 【苦练基本功1】三种方法实现约瑟夫环问题
  16. 抖音上超火的3D立体动态相册表白特效(29)
  17. 会声会影2022视频编辑软件专业版
  18. Linux之shell脚本循环语句for while until
  19. 本科计算机知识点,2018年电大本科计算机网考操作题题库重要知识点(6页)-原创力文档...
  20. 2022-2028全球与中国纳米沉淀碳酸钙市场现状及未来发展趋势

热门文章

  1. TensorFlow测试CPU、GPU
  2. linux重启命令 init,Linux 使用init命令实现关机,重启,切换模式
  3. miui 打开android目录,android – 如何在miui中打开权限弹出窗口?
  4. plt.grid()、plt.scatter()、plt.plot()、plt.arrow()、plt.text()函数讲解
  5. 3ds max fbx导入ue4 面是反的的解决方法
  6. java nan和infinity_正确使用NaN和Infinity
  7. 电信积分兑换话费的方法步骤
  8. Python爬虫实战之 爬取王者荣耀皮肤
  9. 华为全面屏鸿蒙,华为继续发力:2K全面屏+鸿蒙OS+屏下镜头 一款华为5G巅峰之作...
  10. Word一打开,目录、页码变成代码(Word2019)