Android studio开发入门教程详解(复习)

在这里插入图片描述

引言

本文为个人总结Android基础知识复习笔记。如有不妥之处,敬请指正。后续将持续更新更多知识点。

文章目录

  • 引言
  • UI
    • TextView文本
      • 基本用法
      • 实际应用
      • 常用属性和方法
    • Button按钮
      • 处理点击事件
    • EditText输入框
      • 基本属性
      • 高级特性
    • ImageView图片
      • ImageView的缩放模式
    • ProgressBar进度
      • 圆形ProgressBar
      • 水平ProgressBar
      • 处理ProgressBar的行为
      • 常用属性和方法
      • 实际应用场景
    • ListView滚动菜单
      • 常用的属性
      • ListView中的点击事件
      • 简单用法
      • 定制ListView的Item
      • 效果演示
  • 组件
    • Intent跳转
      • 显式Intent
      • 隐式Intent
      • 传递数据
    • Toast提示
      • 参数说明
      • 自定义Toast的位置
    • Menu菜单
    • Dialog对话框
      • 创建 AlertDialog.Builder 对象
      • 更多方法
      • 效果预览
    • ProgressDialog模态对话框
      • ProgressDialog的基本用法
      • 更新ProgressDialog的进度
      • 更多方法
      • 效果预览
    • Broadcast Receiver动态广播
      • 效果预览
    • SharedPreferences数据操作
      • 如何使用SharedPreferences?
  • 布局
    • LinearLayout线性布局
      • LinearLayout 常用属性
      • 效果演示
    • RelativeLayout相对布局
      • 根据父容器定位
      • 根据兄弟控件定位
      • 效果演示
    • ConstraintLayout约束布局
      • 根据父容器定位
      • 根据兄弟控件定位
    • 自定义布局
      • 注意(取消显示系统自带的标题栏)
  • 适配器
    • BaseAdapter
    • SimpleAdapter
    • ArrayAdapter
    • nflate方法

UI

TextView文本

TextView是一个基本的用户界面组件,用于在应用中显示文本。它是显示信息的一种简单而有效的方式,可以展示从简单的一行文本到复杂的数据。

基本用法

TextView可以通过XML布局文件或者Java/Kotlin代码来创建和管理。在XML中定义TextView时,你可以设置多种属性来控制其显示效果,如文本内容、字体大小、颜色和样式等。

<TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello, World!"android:textSize="18sp"android:textColor="#FF0000"android:gravity="center"/>

在上述代码中,我们创建了一个TextView,设置了文本内容、字体大小、字体颜色,并使文本在TextView中居中显示。

实际应用

在实际应用中,TextView经常用于显示应用的标题、用户的输入信息、提示信息等。它也可以与其他组件如Button、EditText等结合使用,以提供更丰富的用户交互体验。

TextView userNameTextView = findViewById(R.id.textView);
userNameTextView.setText("Welcome, John Doe!");

通过TextView控件的ID进行逻辑控制
TextView是Android中用于显示文本的基础控件,它拥有许多属性和方法来定制文本的显示方式。以下是一些常用的TextView属性和方法的讲解:

常用属性和方法

常用属性

  • android:text: 设置TextView显示的文本内容。
  • android:textSize: 设置文本的大小,通常使用sp作为单位,以保证不同屏幕密度下的可读性。
  • android:textColor: 设置文本的颜色,可以是直接的颜色值或者引用颜色资源。
  • android:gravity: 设置文本在TextView内的对齐方式,如center、left、right等。
  • android:textStyle: 设置文本的样式,如bold(加粗)、italic(斜体)或normal(正常)。
  • android:fontFamily: 设置文本的字体。
  • android:lineSpacingExtra: 设置行间距。
  • android:drawableLeft: 在文本左侧添加一个图标。
  • android:drawablePadding: 设置文本与图标之间的间距。

常用方法

  • setText(CharSequence text): 通过代码设置TextView的文本内容。
  • getText(): 获取TextView当前显示的文本内容。
  • setTextSize(float size): 通过代码设置文本的大小。
  • setTextColor(int color): 通过代码设置文本的颜色。
  • setTypeface(Typeface tf, int style): 设置文本的字体和样式。
  • setGravity(int gravity): 通过代码设置文本的对齐方式。

高级特性

  • android:ellipsize: 当文本过长无法完全显示时,设置文本的省略方式,如end(末尾省略)、start(开头省略)等。
  • android:maxLines: 设置TextView可以显示的最大行数。
  • android:autoLink: 自动将文本中的网址、电话号码、邮件地址等转换为可点击的链接。
  • android:shadowColor 和 android:shadowDx/android:shadowDy/android:shadowRadius: 设置文本的阴影颜色和阴影偏移量,以及模糊半径。

Button按钮

Button继承自TextView,因此它不仅包含了TextView的所有功能,还增加了可点击的交互能力。在界面上,Button通常表示为一个可以按压的区域,显示文本或图标,提示用户可以进行操作。

在XML布局文件中定义Button非常简单。你可以设置多种属性来控制其显示效果,如文本内容、背景、字体大小和颜色等。

<Buttonandroid:id="@+id/myButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button_label"android:background="@drawable/button_background"/>

在上述代码中,我们创建了一个Button,为其设置了ID、尺寸、文本和背景。

处理点击事件

Button最重要的功能是响应用户的点击事件。你可以通过在Activity中重写onClick方法来处理点击事件。

public class MyActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my);Button myButton = findViewById(R.id.myButton);myButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 处理点击事件}});}
}

或者通过当前类继承于View.OnClickListener,此时需要重写onClick方法,后续此Activity有点击事件响应时,都会执行此方法。

public class MainActivity extends AppCompatActivity implements View.OnClickListener

通过v.getId()获取当前点击的控件,用case进行比较

@Override
public void onClick(View v) {switch (v.getId()){case R.id.Button_1:break;}
}

EditText输入框

在Android开发中,EditText是一个基础且功能丰富的用户界面组件,用于获取用户输入的文本。它不仅可以接收键盘输入,还可以通过各种样式和属性来增强用户体验。

基本属性

EditText继承自TextView,因此它包含了TextView的所有属性,同时增加了文本编辑的功能。以下是一些基本的属性:

  • android:hint: 提供给用户的输入提示。
  • android:inputType: 定义了输入的类型,如文本、密码或数字。
  • android:maxLines: 设置最大行数。
  • android:textSize: 设置文本大小。
  • android:textColor: 设置文本颜色。
  • android:drawableLeft: 在输入框左侧添加图标,常用于搜索框或带图标的输入框。
  • android:maxLength: 限制输入的最大字符数。
  • android:textAllCaps: 设置文本全部大写。

注意:可以进行自定义EditText样式,创建shape XML文件来定义EditText的背景,包括边框颜色、圆角等,这里目前不做讲解!

<EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@null"android:drawableBottom="@drawable/shape_edittext_bottom_line"android:hint="请输入用户名"android:inputType="text"android:padding="10dp"android:textSize="14sp" />

在上述代码中,@drawable/shape_edittext_bottom_line是一个自定义的shape,用于显示下划线。

高级特性

android:focusable和android:imeOptions是两个重要的属性,它们用于控制EditText输入框的焦点行为和软键盘的交互。

android:focusable
android:focusable属性决定了组件是否能够获取焦点。当设置为true时,用户可以通过触摸或导航键(如方向键)来使组件获得焦点。通常,EditText默认是可获取焦点的,以便用户可以输入文本。

android:imeOptions
android:imeOptions属性用于控制软键盘上的动作按钮,这个按钮通常位于键盘的右下角。通过设置不同的值,你可以改变这个按钮的行为和外观,例如:

  • actionDone: 显示“完成”按钮,用户点击后可以关闭键盘。
  • actionGo: 显示“前往”按钮,通常用于导航到另一个视图或执行搜索操作。
  • actionNext: 显示“下一项”按钮,用户点击后焦点会跳转到布局中的下一个EditText。
  • actionSearch: 显示“搜索”按钮,用于提交搜索请求。

例如,如果你想要在用户完成输入后关闭软键盘,你可以在EditText的XML定义中设置android:imeOptions=“actionDone”。这样,当用户点击键盘上的“完成”按钮时,软键盘会关闭

<EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:imeOptions="actionDone"android:inputType="text" />

在编程中,你也可以通过调用setImeOptions()方法来动态设置这个属性。例如,设置IME_ACTION_DONE会在软键盘上显示“完成”按钮,并且在用户点击后关闭键盘:

EditText editText = findViewById(R.id.editText);
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

ImageView图片

在Android应用开发中,ImageView是一个用于展示图片的基础控件。它不仅能够显示本地资源图片,还能够通过网络加载图片。

ImageView的基本属性

  • android:src: 设置ImageView要展示的图片。
  • android:background: 设置ImageView的背景样式。
  • android:scaleType: 控制图片的缩放模式。
  • android:maxHeight 和 android:maxWidth: 设置ImageView的最大高度和宽度。
  • android:tint: 设置图片的色彩过滤。

其中,android:src和android:background的区别尤为重要。android:background表示背景样式,可以设置成图片文件或者背景资源;而android:src是ImageView特有的属性,用来设置要展示的图片。

ImageView的缩放模式

android:scaleType是一个关键属性,它定义了当图片尺寸和ImageView尺寸不一致时,图片应该如何调整。以下是一些常用的scaleType值:

  • fitCenter: 保持图片的宽高比,缩放图片使得整个图片都能够显示出来。
  • centerCrop: 保持图片的宽高比,缩放图片使得它完全覆盖ImageView,并且居中显示。
  • fitXY: 不保持图片的宽高比,拉伸图片使得它完全符合ImageView的大小。

在实际应用中,ImageView可以用于显示用户头像、商品图片、广告宣传图等。你可以通过以下方式在代码中设置图片:

ImageView imageView = findViewById(R.id.myImageView);
imageView.setImageResource(R.drawable.my_image);

ProgressBar进度

在Android应用开发中,ProgressBar是一个用于展示操作进度的控件,如数据加载或文件下载。它可以通过多种样式来满足不同的设计需求。ProgressBar有两种基本样式:圆形和水平。圆形ProgressBar通常用于表示等待,而水平ProgressBar用于展示具体的进度信息。

圆形ProgressBar

圆形ProgressBar是默认的样式,它会不断旋转,表示一个操作正在进行中。在XML布局文件中,你可以这样定义一个圆形ProgressBar:

<ProgressBarandroid:layout_width="wrap_content"android:layout_height="wrap_content" />

水平ProgressBar

水平ProgressBar通过一个长条形状展示进度,可以显示具体的进度值。你可以通过设置style属性来使用这种样式:

<ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal" />

处理ProgressBar的行为

你可以通过代码来控制ProgressBar的行为,如设置当前进度、显示或隐藏进度条等。

ProgressBar progressBar = findViewById(R.id.myProgressBar);
progressBar.setProgress(50); // 设置进度为50%
progressBar.setVisibility(View.VISIBLE); // 显示进度条

常用属性和方法

  • android:max:设置进度条的最大值。默认值是100。
  • android:progress:设置当前进度值。
  • android:secondaryProgress:设置次要进度值,通常用于显示缓冲进度。
  • android:indeterminate:如果设置为true,进度条将显示一个不确定的进度(通常是一个循环动画),而不是具体的进度值。
  • android:progressDrawable:设置进度条的Drawable对象,可以自定义进度条的外观。
  • getMax():返回进度条的最大值。(同时可以进行set)
  • getProgress():返回当前的进度值。
  • getSecondaryProgress():返回次要进度值。
  • setProgress(int progress):设置当前的进度值。
  • setSecondaryProgress(int secondaryProgress):设置次要进度值。
  • incrementProgressBy(int diff):增加当前进度值。
  • setIndeterminate(boolean indeterminate):设置进度条是否为不确定模式。
  • setVisibility(View.VISIBLE):当你调用setVisibility(View.VISIBLE)时,视图将变得可见。如果视图之前是不可见的(INVISIBLE或GONE),它将重新显示在用户界面上。
    • View.VISIBLE:视图可见。
    • View.INVISIBLE:视图不可见,但仍然占据布局空间。
    • View.GONE:视图不可见,并且不占据布局空间。

实际应用场景

在实际应用中,ProgressBar可以用于显示文件下载进度、数据加载进度等。例如,在文件下载过程中,你可以动态更新进度条的进度:

ProgressBar progressBar = findViewById(R.id.progressBar);
progressBar.setMax(100);new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i <= 100; i++) {final int progress = i;runOnUiThread(new Runnable() {@Overridepublic void run() {progressBar.setProgress(progress);}});try {Thread.sleep(100); // 模拟下载过程} catch (InterruptedException e) {e.printStackTrace();}}}
}).start();

在这个示例中,我们创建了一个线程来模拟文件下载过程,并在主线程中更新进度条的进度。

ListView滚动菜单

ListView 是 Android 开发中最常用的组件之一,基本上每一个 Android 应用都会使用到它。在使用 ListView 时,我们通常会涉及到适配器(Adapter)。ListView 中常用的适配器有三种:BaseAdapter、SimpleAdapter 和 ArrayAdapter。这些适配器充当了数据与 ListView 之间的中介,将数据映射到列表视图上。

常用的属性

在使用 ListView 时,我们可以设置一些常用的属性,例如:

  • android:cacheColorHint:设置拖动时的背景色。
  • android:divider:设置分割线的样式。
  • android:dividerHeight:设置分割线的高度。
  • android:listSelector:设置选中时的颜色。
  • android:scrollbars:设置滚动条的显示。
  • android:fadeScrollbars:设置为 true 可实现滚动条的自动隐藏和显示。

ListView中的点击事件

其中每个item元素点击事件使用setOnItemClickListener方法,position参数是点击的元素在整个数据集合中的下标

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Toast.makeText(listActivity.this,position+"",Toast.LENGTH_SHORT).show();}
});

简单用法

首先,在布局文件中添加一个 ListView:

<?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"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="wrap_content" />
</LinearLayout>

接下来,在 MainActivity 中设置数据并创建适配器:

public class MainActivity extends AppCompatActivity {private String[] data = {"Apple", "Banana", "Orange", "Apple", "Banana", "Orange","Apple", "Banana", "Orange","Apple", "Banana", "Orange","Apple", "Banana", "Orange","Apple", "Banana", "Orange","Apple", "Banana", "Orange"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ArrayAdapter<String> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, data);ListView listView = findViewById(R.id.list_view);listView.setAdapter(adapter);}
}

在这里,我们使用了 ArrayAdapter,将字符串数组作为数据源,并将其与 ListView 关联起来。android.R.layout.simple_list_item_1 是一个内置的布局文件,其中只包含一个 TextView,用于简单地显示文本。

android.R.layout.simple_list_item_1 是 Android 框架中内置的一个布局资源文件,用于在 ListView 中显示简单的文本项。这个布局只包含一个 TextView,用于显示文本内容。

需要适配器讲解,请跳转适配器查看讲解。

定制ListView的Item

  1. 创建子项布局文件:
    • 在 res/layout 目录下创建一个 XML 文件,例如 list_item_fruit.xml。
    • 在这个文件中定义子项的布局,例如包含一个 ImageView 和一个 TextView。
<?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"><ImageViewandroid:id="@+id/fruit_image1"android:layout_width="100dp"android:layout_height="100dp"android:background="@drawable/apple"/><TextViewandroid:id="@+id/fruit_name1"android:layout_width="wrap_content"android:layout_height="100dp"android:gravity="center_vertical"android:layout_marginLeft="18dp"android:text="123"/>
</LinearLayout>
  1. 在自定义适配器中引用子项布局:
    • 在你的适配器类中,使用 LayoutInflater 来加载子项布局文件。
    • 在 getView() 方法中,将数据绑定到布局中的视图。
public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public FruitAdapter(@NonNull Context context, int resource, List<Fruit> object) {super(context, resource, object);resourceId = resource;}@NonNull@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {Fruit fruit = getItem(position);convertView = LayoutInflater.from(parent.getContext()).inflate(resourceId, parent, false);ImageView image = convertView.findViewById(R.id.fruit_image1);TextView text = convertView.findViewById(R.id.fruit_name1);image.setImageResource(fruit.getImgAgeId());text.setText(fruit.getName());return convertView;}
}

FruitAdapter构造函数需要传入当前上下文,子列项模板ID(自定义的XML)以及需要加载的数据元素。

注意:其中Fruit是自定义的,需要将子列项的元素值声明一个类,具体值与子列项的XML文件相同

public class Fruit {private String name;private int imgAgeId;public Fruit(String name, int imAgeId) {this.name = name;this.imgAgeId = imAgeId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getImgAgeId() {return imgAgeId;}public void setImgAgeId(int imAgeId) {this.imgAgeId = imAgeId;}
}
  1. 使用适配器:
public class listActivity extends AppCompatActivity {private ListView listView;private List<Fruit> fruitList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_listview);listView = findViewById(R.id.list_view);initFruits();FruitAdapter fruitAdapter = new FruitAdapter(listActivity.this,R.layout.fruit_item,fruitList);listView.setAdapter(fruitAdapter);}public void initFruits(){for (int i = 0; i < 8; i++) {Fruit fruit = new Fruit("Apple",R.drawable.apple);fruitList.add(fruit);}}
}

效果演示

在这里插入图片描述

组件

Intent跳转

在Android开发中,Intent是一个非常重要的组件,用于在应用程序的不同组件之间进行通信和数据传递。它可以启动活动(Activity)、服务(Service)以及发送广播(Broadcast)

什么是Intent?
Intent是一种消息传递机制,用于在应用程序的不同组件之间进行通信。它可以启动新的活动、服务,或者发送广播。Intent分为两种类型:显式Intent和隐式Intent。

显式Intent

显式Intent明确指定要启动的目标组件(如Activity或Service)。这种方式通常用于启动同一个应用程序中的组件。

示例代码
以下是一个使用显式Intent从一个Activity跳转到另一个Activity的示例:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);

在这个示例中,我们创建了一个Intent对象,指定当前Activity为MainActivity,目标Activity为SecondActivity,然后调用startActivity(intent)方法来启动目标Activity。

隐式Intent

隐式Intent不指定目标组件,而是通过Intent的action、category和data等属性来描述要执行的操作。系统会根据这些属性匹配合适的组件来处理Intent。

示例代码
以下是一个使用隐式Intent打开网页的示例:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com"));
startActivity(intent);

在这个示例中,我们创建了一个Intent对象,设置其action为Intent.ACTION_VIEW,并通过setData方法指定要打开的网址。系统会根据这个Intent找到合适的应用(如浏览器)来处理它。

Intent.ACTION_VIEW是Android中的一个常用操作,它用于显示用户的数据。这个操作非常通用,会根据用户的数据类型打开相应的应用程序。例如,如果数据是一个网址,Intent.ACTION_VIEW会打开浏览器;如果数据是一个电话号码,它会打开拨号程序;如果数据是一个地理位置,它会打开地图应用。

传递数据

Intent不仅可以启动组件,还可以在组件之间传递数据。你可以使用putExtra方法将数据添加到Intent中,并在目标组件中使用getIntent().getExtras()方法获取这些数据。

示例代码
以下是一个从一个Activity向另一个Activity传递字符串数据的示例:

// 在源Activity中
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("message", "Hello, SecondActivity!");
startActivity(intent);// 在目标Activity中
String message = getIntent().getStringExtra("message");
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();

在这个示例中,我们在源Activity中使用putExtra方法将字符串数据添加到Intent中,并在目标Activity中使用getStringExtra方法获取并显示这条消息。

Toast提示

Toast的使用非常简单。你可以通过调用Toast.makeText()方法来创建一个Toast对象,并使用show()方法来显示它。以下是一个基本的示例:

Toast.makeText(getApplicationContext(), "Hello, World!", Toast.LENGTH_SHORT).show();

在这个示例中,我们创建了一个Toast对象,显示文本“Hello, World!”并设置显示时间为短时间(Toast.LENGTH_SHORT)。

Toast有两种显示时间:

  • Toast.LENGTH_SHORT:短时间显示,一般为2秒。
  • Toast.LENGTH_LONG:长时间显示,一般为3.5秒。

你可以根据需要选择合适的显示时间。

参数说明

参数1:Context
第一个参数是Context,它表示当前的上下文环境。Context提供了访问应用资源和类的接口。常见的用法包括:

  • getApplicationContext():获取应用的上下文,适用于需要在整个应用中使用的Toast。
  • this:在Activity中使用当前Activity的上下文。
  • getContext():在Fragment中使用当前Fragment的上下文。

参数2:CharSequence或int
第二个参数是要显示的文本内容,可以是一个字符串(CharSequence)或字符串资源ID(int)。这就是Toast消息中显示的内容。

  • 字符串:直接传递要显示的文本。
  • 资源ID:传递字符串资源的ID,如R.string.message。

参数3:int
第三个参数是显示的时长,表示Toast消息在屏幕上显示的时间。Android提供了两个常量:

  • Toast.LENGTH_SHORT:短时间显示,一般为2秒。
  • Toast.LENGTH_LONG:长时间显示,一般为3.5秒。

自定义Toast的位置

默认情况下,Toast会显示在屏幕的底部中央。如果你想改变Toast的位置,可以使用setGravity()方法。例如,将Toast显示在屏幕中央。

Toast toast = Toast.makeText(getApplicationContext(), "Centered Toast", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();

Menu菜单

在Android开发中,菜单(Menu)是一个非常重要的组件,它为用户提供了一个直观的方式来与应用程序的各种功能进行交互。

使用步骤

  1. 使用XML定义菜单:首先在res资源目录下,新建一个xml,Menu resource file
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/item1"android:title="选项1"/><itemandroid:id="@+id/item2"android:title="选项2"/>
</menu>

注意:菜单资源文件(例如main_menu.xml)通常放在项目的res/menu/目录下(自定义

  1. 在Activity中加载菜单:要在Activity中使用这个菜单,你需要重写onCreateOptionsMenu方法,并使用MenuInflater来加载XML文件:
@Override
public boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.main_menu, menu);return true;
}

onCreateOptionsMenu方法是Android中Activity类的一个重要回调方法,它用于创建活动的选项菜单。当用户首次点击菜单按钮时,系统会调用这个方法来加载菜单项。这个方法只会在菜单首次需要显示时被调用一次,除非活动被销毁后重新创建。

在这个例子中,getMenuInflater().inflate()方法用于加载名为main_menu的菜单资源文件,并将菜单项添加到传入的Menu对象中。返回true表示菜单应该显示;如果你返回false,则菜单不会显示。

  1. 响应菜单项点击:当用户点击菜单项时,onOptionsItemSelected方法会被调用。你可以在这个方法中处理每个菜单项的点击事件:
@Override
public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.item1:// 菜单1操作return true;case R.id.item2:// 菜单2操作return true;default:return super.onOptionsItemSelected(item);}
}

Dialog对话框

可在当前界面弹出一共对话框,这个对话框是置顶于所有界面元素之上,可以屏蔽掉其他控件交互的能力,一般用于提示非常重要的内容或者警告信息

创建 AlertDialog.Builder 对象

AlertDialog.Builder builder = new AlertDialog.Builder(this);

创建一个AlertDialog.Builder对象。AlertDialog.Builder是一个辅助类,用于构建一个AlertDialog对话框。你可以通过这个构建器设置对话框的标题、消息内容、按钮以及其他自定义的视图。这里的this关键字是一个对当前Activity的引用,它告诉AlertDialog.Builder,新创建的对话框应该与当前的Activity相关联。也可以传入具体的Activity.this

// Step 1: 创建 AlertDialog.Builder 对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);// Step 2: 设置对话框的属性,如图标、标题和消息
builder.setIcon(R.drawable.ic_dialog_alert);
builder.setTitle("对话框标题");
builder.setMessage("这是对话框的内容。");// Step 3: 添加按钮和它们的点击事件处理器
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {// 用户点击了确认按钮的事件处理}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {// 用户点击了取消按钮的事件处理}
});// Step 4: 创建 AlertDialog 对象
AlertDialog dialog = builder.create();// Step 5: 显示对话框
dialog.show();

DialogInterface.OnClickListener是一个回调接口,用于定义当对话框中的按钮被点击时应该执行的操作。当你为对话框的按钮设置了OnClickListener,你需要重写onClick方法来处理按钮点击事件。这里是onClick方法的参数讲解:

  • DialogInterface dialog: 这个参数是一个DialogInterface对象,代表触发点击事件的对话框。通过这个参数,你可以控制对话框的显示和隐藏,或者查询对话框的状态。
  • int id: 这个参数是一个整型标识符,表示被点击的按钮。它通常用于区分对话框中的不同按钮。例如,如果你的对话框有多个按钮,你可以使用这个id来识别哪个按钮被点击了。

更多方法

方法描述
setIcon(int iconId)设置对话框的图标。
setTitle(CharSequence title)设置对话框的标题。
setMessage(CharSequence message)设置对话框显示的消息内容。
setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)设置一个正面的按钮(通常用作“确认”)和它的点击事件监听器。
setNegativeButton(CharSequence text, DialogInterface.OnClickListener listener)设置一个负面的按钮(通常用作“取消”)和它的点击事件监听器。
setNeutralButton(CharSequence text, DialogInterface.OnClickListener listener)设置一个中立的按钮(例如“忽略”)和它的点击事件监听器。
setItems(CharSequence[] items, DialogInterface.OnClickListener listener)设置对话框要显示的列表项。
setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener)设置对话框显示一系列的复选框。
setSingleChoiceItems(CharSequence[] items, int checkedItem, DialogInterface.OnClickListener listener)设置对话框显示一系列的单选按钮,并指定默认选中项。
setView(View view)设置对话框的自定义视图。
setCancelable(boolean cancelable)设置对话框是否可以通过点击外部区域或者按返回键来取消。
setOnDismissListener(DialogInterface.OnDismissListener listener)设置对话框被取消时的监听器。
setOnCancelListener(DialogInterface.OnCancelListener listener)设置对话框取消时的监听器。
setOnKeyListener(DialogInterface.OnKeyListener onKeyListener)设置对话框的按键监听器。

效果预览

在这里插入图片描述

ProgressDialog模态对话框

ProgressDialog是Android提供的一个UI组件,用于在屏幕上显示一个模态对话框,其中包含一个进度条和一些可选的文字信息。这个对话框可以是圆形的,也可以是水平的,并且可以显示确定或不确定的进度。ProgressDialog和AlertDialog有点类似,都可以弹出对话框,都可以屏蔽其他控件的交互能力,不同的是ProgressDialog会在对话框中显示一个进度条,一般用于显示当前操作比较耗时,让用户耐心的等待。

ProgressDialog的基本用法

要使用ProgressDialog,你需要创建一个ProgressDialog实例,并设置一些参数,然后调用show()方法来显示它。以下是一个简单的例子:

ProgressDialog progressDialog = new ProgressDialog(MyActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // 设置为圆形
progressDialog.setMessage("加载中..."); // 设置加载信息
progressDialog.setIndeterminate(true); // 设置进度条是否为不确定模式
progressDialog.setCancelable(false); // 设置是否可以通过点击Back键取消
progressDialog.show(); // 显示ProgressDialog

在上面的代码中,我设置了进度条的样式为圆形(旋转的),并且是不确定模式,这意味着进度条会一直旋转,直到任务完成。我们还设置了一个消息来告诉用户正在加载,并且禁止用户取消对话框。

更新ProgressDialog的进度

如果你的任务有确定的进度,你可以使用水平样式的ProgressDialog,并更新进度条的值:

ProgressDialog progressDialog = new ProgressDialog(MyActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100); // 设置最大进度
progressDialog.setProgress(0); // 设置当前进度
progressDialog.show();// 在你的任务中更新进度
progressDialog.setProgress(50); // 假设任务完成了一半

后续可以启用线程进行更新进度条!

注意:虽然ProgressDialog是一个非常有用的组件,但自Android API 26开始,它已被标记为过时。Google建议开发者使用其他方式来显示进度,比如使用ProgressBar组件或者自定义对话框。

更多方法

方法描述
setProgressStyle(int style)设置进度条的样式。ProgressDialog.STYLE_SPINNER为圆形旋转样式,ProgressDialog.STYLE_HORIZONTAL为水平进度条样式。
setMessage(CharSequence message)设置在进度条中显示的消息。
setIndeterminate(boolean indeterminate)设置进度条是否为不确定模式。如果为true,进度条将持续旋转,否则显示具体进度。
setCancelable(boolean flag)设置对话框是否可以被取消。如果为false,则不能通过按返回键取消对话框。
setMax(int max)设置水平进度条的最大值。
setProgress(int value)设置水平进度条的当前进度值。
setSecondaryProgress(int secondaryProgress)设置水平进度条的第二进度值,通常用于显示次要进度,如缓冲进度。
setProgressNumberFormat(String format)设置水平进度条中显示的数字格式。
setProgressPercentFormat(NumberFormat format)设置水平进度条中百分比的格式。
setButton(int whichButton, CharSequence text, DialogInterface.OnClickListener listener)设置对话框上的按钮和它们的点击事件处理器。
show()创建并显示ProgressDialog。

效果预览

Broadcast Receiver动态广播

在Android开发中,BroadcastReceiver是用于响应系统或应用程序发出的广播消息的组件。动态注册BroadcastReceiver意味着在代码中注册接收器,而不是在AndroidManifest.xml文件中静态注册。这样做的好处是可以更灵活地控制广播接收器的注册和注销,使其能够在运行时根据需要监听广播。

public class broadActivity extends AppCompatActivity {private NetworkChangeReceiver networkChangeReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_broad);IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver();registerReceiver(networkChangeReceiver,intentFilter);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(networkChangeReceiver);}class NetworkChangeReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();}}
}

在broadActivity类中,我们首先定义了一个名为networkChangeReceiver的NetworkChangeReceiver实例。这个内部类继承自BroadcastReceiver,并重写了onReceive方法,以便在接收到广播时执行特定的操作。

在onCreate方法中,我们创建了一个IntentFilter对象,并为其添加了一个作"android.net.conn.CONNECTIVITY_CHANGE"。这个动作是系统在网络状态发生变化时发送的广播。

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

然后,我们实例化了NetworkChangeReceiver并通过registerReceiver方法注册它。这意味着,只要网络状态发生变化,我们的NetworkChangeReceiver就会被通知。

NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);

最后,在onDestroy方法中,我们通过unregisterReceiver方法注销了networkChangeReceiver。这是一个很好的实践,因为它可以防止潜在的内存泄漏。

unregisterReceiver(networkChangeReceiver);

NetworkChangeReceiver类是我们自定义的BroadcastReceiver。在onReceive方法中,我们使用Toast消息通知用户网络状态的变化。

注意:因为使用的系统网络相关的广播,所以这里需要开启Android应用的系统网络权限,在AndroidManifest.xml文件中,添加此代码即可<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

之后,当系统网络发送变化,会默认弹出此提示network changes

效果预览

在这里插入图片描述

SharedPreferences数据操作

SharedPreferences提供了一种方便的方法来存储和检索键值对数据。与数据库相比,它更适合存储少量的数据,如登录状态、用户设置等。

如何使用SharedPreferences?

使用SharedPreferences非常简单。以下是基本的步骤:

  1. 获取SharedPreferences对象: 你可以通过调用Context的getSharedPreferences方法来获取SharedPreferences对象。这个方法需要两个参数:文件名和模式。
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);

在Android开发中,MODE_PRIVATE是SharedPreferences文件的一个操作模式。当你使用这个模式创建SharedPreferences文件时,它意味着这个文件是私有的,只能被创建它的应用程序访问。换句话说,其他应用程序无法读取或写入这个文件。

除了MODE_PRIVATE,在Android的SharedPreferences中还有其他几种操作模式,但请注意,其中一些模式已经被弃用,因为它们可能导致安全问题。以下是所有的模式:

  • MODE_PRIVATE:这是最常用的模式,它设置文件为私有数据,只能被调用的应用程序访问。如果文件已存在,写入的内容将覆盖原文件的内容1。
  • MODE_APPEND:在这个模式下,如果文件存在,就会检查文件并在文件末尾追加内容;如果文件不存在,就会创建新文件2。

弃用的模式不过多说明

  1. 读写数据: 要写入数据,你需要使用SharedPreferences.Editor对象。通过调用edit()方法来获取它,然后使用put系列方法来添加或更新键值对。
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("key", "value");
editor.commit();

要读取数据,直接使用SharedPreferences对象的get系列方法。当你调用.edit()方法时,你会进入编辑模式,可以添加、更新或删除SharedPreferences中的键值对。

String value = sharedPreferences.getString("key", "default_value");
  1. 提交更改: 当你完成了更改,需要调用commit()或apply()方法来保存。请注意,所有的更改都是在调用commit()或apply()之后才会被持久化保存的。在此之前,所有的更改都只存在于内存中。

布局

LinearLayout线性布局

LinearLayout 是 Android 开发中一种非常常用的布局方式,它将包含的控件按照水平或垂直方向依次排列。如果是水平排列,垂直方向上只能有一个控件;如果是垂直排列,则水平方向上只能有一个控件。这个布局会将它所包含的控件,在线性的方向上依次排列,可以通过orientation属性指定方向:

  • vertical:垂直布局
  • horizontal:水平布局

LinearLayout 常用属性

  • android:orientation:设置线性布局的排列方向,vertical 为垂直排列,horizontal 为水平排列。
  • android:gravity:控制子控件的对齐方式。可以让子控件对齐右边缘或底部边缘。
  • android:layout_gravity:设置子控件在父控件中的摆放位置,优先级高于父控件的 gravity。
  • android:layout_weight:按比例分配控件占用父控件的大小。

效果演示

LinearLayout 又称作线性布局,是 Android 开发中最常见的布局之一。下面是一个简单的示例,展示了如何在布局文件中使用 LinearLayout 来垂直排列三个按钮:

<?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:orientation="horizontal"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="按钮1"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1"android:text="按钮2"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom"android:layout_weight="1"android:text="按钮3"/>
</LinearLayout>

在这里插入图片描述

RelativeLayout相对布局

RelativeLayout 是 Android 开发中最常用的布局之一,它允许您根据父容器和兄弟控件的位置来确定控件的位置。在 RelativeLayout 中,您可以使用各种属性来精确控制子视图的排列。可以通过相对定位的方式,让控件出现在布局的任何位置。

RelativeLayout 是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。要使用相对布局,您需要将布局节点改成 RelativeLayout,基本格式如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 在这里添加子视图 --></RelativeLayout>

根据父容器定位

在相对布局中,您可以使用以下属性将控件放置在父容器的不同位置:

  • android:layout_alignParentLeft=“true”:控件左对齐父容器。
  • android:layout_alignParentRight=“true”:控件右对齐父容器。
  • android:layout_alignParentTop=“true”:控件顶部对齐父容器。
  • android:layout_alignParentBottom=“true”:控件底部对齐父容器。
  • android:layout_centerHorizontal=“true”:水平方向居中。
  • android:layout_centerVertical=“true”:垂直方向居中。
  • android:layout_centerInParent=“true”:水平和垂直都居中。

根据兄弟控件定位

在相对布局中,还可以使用已确定位置的控件作为参考来确定其他控件的位置。以下是一些常用的属性:

  • android:layout_toLeftOf=“@+id/button1”:在 button1 控件的左侧。
  • android:layout_toRightOf=“@+id/button1”:在 button1 控件的右侧。
  • android:layout_above=“@+id/button1”:在 button1 控件的上方。
  • android:layout_below=“@+id/button1”:在 button1 控件的下方。
  • android:layout_alignLeft=“@+id/button1”:与 button1 控件的左边平齐。
  • android:layout_alignRight=“@+id/button1”:与 button1 控件的右边平齐。
  • android:layout_alignTop=“@+id/button1”:与 button1 控件的上边平齐。
  • android:layout_alignBottom=“@+id/button1”:与 button1 控件的下边平齐。

效果演示

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"tools:context=".relativeActivity"><Buttonandroid:id="@+id/rel_btn1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮1"android:layout_alignParentRight="true"/><Buttonandroid:id="@+id/rel_btn2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮2"android:layout_centerHorizontal="true"android:layout_centerVertical="true"/><Buttonandroid:id="@+id/rel_btn3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮3"android:layout_alignParentLeft="true"android:layout_alignParentBottom="true"/><Buttonandroid:id="@+id/rel_btn4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按钮4"android:layout_below="@id/rel_btn2"android:layout_alignRight="@id/rel_btn2"/>
</RelativeLayout>

在这里插入图片描述

ConstraintLayout约束布局

ConstraintLayout 是 Android 开发中最常用的布局之一,它允许您根据父容器和兄弟控件的位置来确定控件的位置。在 ConstraintLayout 中,您可以使用各种属性来精确控制子视图的排列。

ConstraintLayout 是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。要使用约束布局,您需要将布局节点改成 ConstraintLayout,基本格式如下:

<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><!-- 在这里添加子视图 --></androidx.constraintlayout.widget.ConstraintLayout>

根据父容器定位

在约束布局中,您可以使用以下属性将控件放置在父容器的不同位置:

  • app:layout_constraintStart_toStartOf=“parent”:控件左对齐父容器。
  • app:layout_constraintEnd_toEndOf=“parent”:控件右对齐父容器。
  • app:layout_constraintTop_toTopOf=“parent”:控件顶部对齐父容器。
  • app:layout_constraintBottom_toBottomOf=“parent”:控件底部对齐父容器。
  • app:layout_constraintHorizontal_bias=“0.5”:水平方向偏移量,0.5 表示居中。
  • app:layout_constraintVertical_bias=“0.5”:垂直方向偏移量,0.5 表示居中。

根据兄弟控件定位

在约束布局中,您还可以使用已确定位置的控件作为参考来确定其他控件的位置。以下是一些常用的属性:

  • app:layout_constraintStart_toEndOf=“@+id/button1”:在 button1 控件的右侧。
  • app:layout_constraintEnd_toStartOf=“@+id/button1”:在 button1 控件的左侧。
  • app:layout_constraintTop_toBottomOf=“@+id/button1”:在 button1 控件的下方。
  • app:layout_constraintBottom_toTopOf=“@+id/button1”:在 button1 控件的上方。

自定义布局

使用步骤

  1. 创建新的XML布局文件
  2. 设计自定义视图
  3. 加载自定义布局

这里以定义一个标题栏布局,方便其他页面引用作为讲解,首先在res.layout目录下,新建一个xml文件

<?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="wrap_content"android:background="#000000"><Buttonandroid:layout_width="10dp"android:layout_height="40dp"android:background="@drawable/back"android:layout_margin="10dp"android:layout_weight="1"android:layout_gravity="center"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="标题栏"android:textColor="#ffffff"android:textSize="30dp"android:layout_weight="3"android:layout_gravity="center"android:gravity="center"/><Buttonandroid:layout_width="10dp"android:layout_height="40dp"android:background="@drawable/edit"android:layout_margin="10dp"android:layout_weight="1"android:layout_gravity="center"/>
</LinearLayout>

效果预览
在这里插入图片描述

注意:图片素材需要自己寻找

之后,在需要引入的页面使用<include>标签引入此标题栏

<include>标签在 Android Studio 中用于实现布局的复用,特别适合在界面布局复杂、不同界面有共用布局的应用中。例如,一个应用的顶部布局、侧边栏布局、底部 Tab 栏布局、ListView 和 GridView 每一项的布局等,可以通过 标签引用这些共用布局,从而降低布局的复杂度并实现布局重用。下面是使用 标签的方法和注意事项:

在布局文件中需要引用其他布局的地方,使用 layout=“@layout/child_layout” 即可。例如,如果你有一个名为 titlebar.xml 的共用布局,可以在其他布局中这样引用它:

<include layout="@layout/titlebar" />

注意:在 Android 布局文件中使用 标签引用其他布局时,实际上是将被引用的布局的 XML 内容插入到当前布局中。这意味着,被引用布局的属性会与包裹 的父布局的属性进行合并。如果在 中设置了 layout 属性,它会覆盖父布局的相应属性,可能导致布局效果不如预期。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"tools:context=".MainActivity"android:orientation="vertical"><include layout="@layout/title"/><EditTextandroid:id="@+id/edit_text1"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入内容"/><Buttonandroid:id="@+id/Button_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:textSize="20sp"android:text="登录"/>
</LinearLayout>

注意(取消显示系统自带的标题栏)

此时加载,默认还有系统自带的标题栏,这里需要在对应的页面进行取消。复制下列代码!

//取消系统默认的标题栏
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar != null){supportActionBar.hide();
}

获取当前活动(Activity)的 ActionBar 对象,然后检查它是否为 null。如果不为 null,就调用 hide() 方法来隐藏整个 ActionBar,包括其中的选项卡。

或者将style文件中的parent属性的值切换为:Theme.AppCompat.Light.NoActionBar,默认的是:Theme.AppCompat.Light.DarkActionBar

  • Theme.AppCompat.Light.NoActionBar:这个主题用于设置整个应用程序的全局主题。它适用于不需要显示顶部标题栏(ActionBar)的情况。如果你的应用程序不需要默认的 ActionBar,你可以选择这个主题。
  • Theme.AppCompat.Light.DarkActionBar:这个主题也用于设置整个应用程序的全局主题。它适用于需要显示顶部标题栏(ActionBar)的情况。如果你的应用程序需要默认的 ActionBar,并且你希望它的文本颜色为深色,你可以选择这个主题。

适配器

BaseAdapter

BaseAdapter 是一个抽象类,它提供了适配器的基本功能。当我们自定义适配器时,通常会继承这个类并实现其中的抽象方法。因此,BaseAdapter 具有较高的灵活性,但需要我们自己实现一些方法。

用法
继承 BaseAdapter 类。实现以下抽象方法:

  • getCount():返回数据集中的项数。
  • getItem(int position):返回指定位置的数据项。
  • getItemId(int position):返回指定位置的数据项的 ID。
  • getView(int position, View convertView, ViewGroup parent):返回一个视图,用于显示指定位置的数据项。
    • convertView是一个可复用的视图,用于显示子项的内容。当滚动列表时,旧的子项会被回收并传递给 getView() 方法作为 convertView。如果 convertView 不为空,我们可以直接使用它,避免重复创建视图,提高性能。如果 convertView 为空,我们需要创建一个新的视图。
    • parent是子项视图的父容器,通常是 ListView 或其他列表视图。我们可以使用这个参数来获取上下文、资源等信息。在创建新的子项视图时,我们需要将其添加到 parent 中。

SimpleAdapter

SimpleAdapter 是一个简单适配器,它可以显示复杂的信息。它的数据源形式是 List<Map<String, ?>>,适用于显示多个字段的数据。
用法
准备好数据源,通常是一个 List<Map<String, ?>>。创建一个 SimpleAdapter 对象,传入上下文、数据源、条目布局和数据源数据的键数组以及对应的条目布局控件 ID 数组。

ArrayAdapter

ArrayAdapter 是数组适配器,它只能显示一条文本信息。它支持泛型操作,最为简单,适用于展示单一文本的数据。
用法
准备好数据源,通常是一个数组。创建一个 ArrayAdapter 对象,传入上下文、数据源和一个内置的布局资源文件(例如 android.R.layout.simple_list_item_1)。

// 准备数据源
String[] dataArray = {"Apple", "Banana", "Orange"};// 创建 ArrayAdapter
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1, dataArray);// 设置适配器
ListView listView = findViewById(R.id.list_view);
listView.setAdapter(arrayAdapter);

nflate方法

nflate() 方法是 Android 中的一个重要方法,用于将 XML 布局文件转换为视图对象。它通常在适配器中的 getView() 方法中使用,用于创建或复用子项的视图。
参数:

  • resource:要加载的布局资源的 ID。
  • root:父容器,即要将布局添加到哪个容器中。如果为 null,则不添加到任何容器中。
  • attachToRoot:是否将布局添加到父容器中。如果为 true,则添加;如果为 false,则只加载布局但不添加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt中udp指令,大小端,帧头帧尾实际示例

前言 虽然QT中&#xff0c;udp发送和接收&#xff0c;其实非常简单&#xff0c;但是实际工作中&#xff0c;其实涉及到帧头帧尾&#xff0c;字节对齐&#xff0c;以及大小端序的问题。比如网络中&#xff0c;正规的一般都是大端序&#xff0c;而不是小端序&#xff0c;大多数的…

不到 5 元的随身 WiFi 刷 Debian 系统 做轻量家庭服务器

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 前不久在某宝均价 5 元买了两个随身 WiFi,拆机看了看丝印都是 MSM8916 ,正好是红米 2 同款的骁龙 410 的芯片,可以刷个 Debian 当作家庭服务器来跑一些轻量的服务。 不过手气不是很好,两个都是 512M + 4G 的配置…

单机安装基于LNMP结构的WordPress网站 web与数据库服务分离

网站的类型&#xff1a; Jave:LNMT PHP:LNMP Python: LNMU 项目部署&#xff1a; 1.项目的类型&#xff08;项目的开发语言&#xff09; 2.项目运营平台的技术选择 3.尽快让项目运行起来 all in one部署 4. 架构的优化 配置ansible管理环境 配置nginx 配置数据库服务…

day11_homework_need2submit

Homework 编写—个将ts或mp4中视频文件解码到yuv的程序 yuv数据可以使用如下命令播放: ffplay -i output yuv-pix_fmt yuv420p-s 1024x436 要求: ffmpeg解析到avpacket并打印出pts和dts字段完成解码到avframe并打印任意字段完成yuv数据保存 // teminal orders on bash cd ex…

11.SQL注入-盲注基于(base on boolian)

SQL注入-盲注基于boolian案例利用 首先总结一下sql语句中的函数意思 #查看当前所在的数据库 mysql> select database(); ------------ | database() | ------------ | pikachu | ------------ 1 row in set (0.00 sec)#函数substr里1是从第几位开始取字符&#xff0c;2…

油猴Safari浏览器插件:Tampermonkey for Mac 下载

Tampermonkey 是一个强大的浏览器扩展&#xff0c;用于运行用户脚本&#xff0c;这些脚本可以自定义和增强网页的功能。它允许用户在网页上执行各种自动化任务&#xff0c;比如自动填写表单、移除广告、改变页面布局等。适用浏览器&#xff1a; Tampermonkey 适用于多数主流浏览…

Java的进程和线程

一Java的进程 二Java的线程 多线程 ◆如果在一个进程中同时运行了多个线程&#xff0c;用来完成不同的工作&#xff0c;则称之为“多线程”。 ◆多个线程交替占用CPU资源&#xff0c;而非真正的并行执行。 ◆多线程好处。 ◆充分利用CPU的资源。 ◆简化编程模型。 ◆良好的用…

3-1 激活函数和神经网络思想

3-1 激活函数和神经网络思想 主目录点这里

【抽代复习笔记】26-群(二十):子群的定义以及第一、第二判定定理

子群 定义1&#xff1a;(G,o)是一个群&#xff0c;H是G的非空子集&#xff0c;若H关于G的乘法o也能作成群&#xff08;满足群的判定定理&#xff1a;封闭性、结合律、单位元、逆元&#xff09;&#xff0c;则称H为G的子群&#xff0c;记作H ≤ G&#xff1b;若H是G的真子集&am…

【启明智显分享】手持遥控器HMI解决方案:2.8寸触摸串口屏助力实现智能化

现代生活不少家居不断智能化&#xff0c;但是遥控器却并没有随之升级。在遥控交互上&#xff0c;传统遥控器明显功能不足&#xff1a;特别是大屏智能电视&#xff0c;其功能主要由各种APP程序实现。在电脑上鼠标轻轻点击、在手机上触摸屏丝滑滑动&#xff0c;但是在电视上这些A…

SpringBoot 启动流程二

SpringBoot启动流程二 我们首先查看构造方法 SpringApplication 我们发现这个构造方法还是在SpringApplication类里面 这个构造方法还是调用了自身的构造方法 传入了两个参数 第一个参数叫resourceLoader 传入的是一个资源加载器 要从外部读入东西 这个方法通过this关键字…

c++纵横字谜

1.实现一个纵横字谜 2.支持14x14的网格 3.可以查看答案 4.猜测错误会提示答案信息 5.从txt读取词汇 6.每次游戏开始 随机生成纵横字谜 n’h

leetcode216.组合总和III、40.组合总和II、39.组合总和

216.组合总和III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输出…

deepin UOS AI 如何配置自定义模型

科技飞速发展的今天&#xff0c;操作系统作为计算机系统的灵魂&#xff0c;其每一次的更新与变革都牵动着无数用户的心弦。近日&#xff0c;开源操作系统 deepin 迎来了一次重大更新&#xff0c;这次更新不仅在性能上进行了全面优化&#xff0c;更在 AI 智能化方面迈出了划时代…

【解决方案】笔记本电脑屏幕亮度调节失效(Dell G15 5510 使用Fn调节)

目前解决方案&#xff1a;使用驱动总裁&#xff08;其他的驱动安装软件应该也可以&#xff0c;个人觉得这个好用&#xff09;&#xff0c;更新显卡驱动即可。如图所示本人更新了Intel UHD Graphics核显驱动&#xff0c;功能回复正常。 使用Fn快捷键调节亮度如图所示&#xff0…

ARIES,数据恢复算法,万变不离其宗...

今天来聊两个问题&#xff1a; 1. 如果缓冲池&#xff08;buffer pool&#xff09;满了&#xff0c;哪些数据页&#xff08;page&#xff09;要刷盘&#xff0c;哪些数据页不刷盘&#xff1f; 2. 数据库崩了&#xff0c;怎么利用检查点&#xff08;checkpoint&#xff09;与预写…

Django 定义模型执行迁移

1&#xff0c;创建应用 Test/app8 python manage.py startapp app8 2&#xff0c;注册应用 Test/Test/settings.py 3&#xff0c;配置路由 Test/Test/urls.py from django.contrib import admin from django.urls import path, includeurlpatterns [path(app8/, include(a…

硅纪元视角 | AI纳米机器人突破癌症治疗,精准打击肿瘤细胞

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

Ubuntu24.04之安装KVM(二百五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

QT+OpenCV在Android上实现人脸实时检测与目标检测

一、功能介绍 在当今的移动应用领域&#xff0c;随着技术的飞速发展和智能设备的普及&#xff0c;将先进的计算机视觉技术集成到移动平台&#xff0c;特别是Android系统中&#xff0c;已成为提升用户体验、拓展应用功能的关键。其中&#xff0c;目标检测与人脸识别作为计算机视…