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时,你可以设置多种属性来控制其显示效果,如文本内容、字体大小、颜色和样式等。

<TextView
    android: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非常简单。你可以设置多种属性来控制其显示效果,如文本内容、背景、字体大小和颜色等。

<Button
    android: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 {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        Button myButton = findViewById(R.id.myButton);
        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public 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的背景,包括边框颜色、圆角等,这里目前不做讲解!

<EditText
    android: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”。这样,当用户点击键盘上的“完成”按钮时,软键盘会关闭

<EditText
    android: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:

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

水平ProgressBar

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

<ProgressBar
    android: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() {
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            final int progress = i;
            runOnUiThread(new Runnable() {
                @Override
                public 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() {
    @Override
    public 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">

    <ListView
        android: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"};

    @Override
    protected 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">

    <ImageView
        android:id="@+id/fruit_image1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="@drawable/apple"/>

    <TextView
        android: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
    @Override
    public 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<>();

    @Override
    protected 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">
    <item
        android:id="@+id/item1"
        android:title="选项1"/>
    <item
        android: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;

    @Override
    protected 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);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

    class NetworkChangeReceiver extends BroadcastReceiver{

        @Override
        public 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"
    >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="按钮1"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:text="按钮2"
        />

    <Button
        android: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">

    <Button
        android:id="@+id/rel_btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮1"
        android:layout_alignParentRight="true"
        />

    <Button
        android: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"
        />

    <Button
        android: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"
        />

    <Button
        android: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.ConstraintLayout
    xmlns: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">
    <Button
        android:layout_width="10dp"
        android:layout_height="40dp"
        android:background="@drawable/back"
        android:layout_margin="10dp"
        android:layout_weight="1"
        android:layout_gravity="center"/>

    <TextView
        android: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"/>

    <Button
        android: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"/>

    <EditText
        android:id="@+id/edit_text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入内容"/>

    <Button
        android: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.mfbz.cn/a/772853.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战教程:如何用JavaScript构建一个功能强大的音乐播放器,兼容本地与在线资源

项目地址&#xff1a;Music Player App 作者&#xff1a;Reza Mehdikhanlou 视频地址&#xff1a;youtube 我将向您展示如何使用 javascript 编写音乐播放器。我们创建一个项目&#xff0c;您可以使用 javascript 从本地文件夹或任何 url 播放音频文件。 项目目录 assets 1…

图DFS遍历

DFS遍历图 伪代码 俩函数。 判断图有几个连通分支&#xff1f;就是图的遍历&#xff0c;dfs完了就给他 #include <iostream> #include <cstdlib> #include <bits/stdc.h> #include <vector> using namespace std; const int N102; int n,m,temp1,te…

Python学习笔记28:进阶篇(十七)常见标准库使用之质量控制中的代码质量与风格第二部分

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 质量控制…

面试篇-Redis-2+持久化+过期key删除+内存淘汰

文章目录 前言一、你知道Redis 数据是怎么持久化的1.1 Redis 持久化的方式Rdb&#xff1a;1.1.1 主动备份save 命令&#xff1a;1.1.2 Redis 中使用bgsave 进行Rdb 的持久化 &#xff1a; 1.2 Redis 持久化的方式Aof&#xff1a;1.2.1 使用AOF 模式进行数据存储&#xff1a;1.2…

数据库主从复制

目录 一.主从复制架构 二.主从复制原理 三.实现主从复制配置 1.新建主从复制 2.实战遇到问题 3.复制错误解决方法 4.级联 主从复制 5.半同步复制 MySQL数据库的主从复制&#xff08;Master-Slave Replication&#xff09;是一种常见的数据库复制架构&#xff0c;用于提…

越南宣称已成全球第二大手机出口国,富士康翻白眼,为啥限电?

日前越南媒体报道指越南今年前5个月的手机及零部件出口达到224亿美元&#xff0c;同比增长11%&#xff0c;超越印度&#xff0c;成为仅次于中国的全球第二大手机出口国&#xff0c;对此富士康、三星恐怕会有不同的意见。 为越南手机业务做出重要贡献的无疑是富士康、三星等企业…

2.2.1 ROS2案例以及案例分析

1.案例需求 需求1&#xff1a;编写话题通信实现&#xff0c;发布方以某个频率发布一段文本&#xff0c;订阅方订阅消息&#xff0c;并输出在终端。 需求2&#xff1a;编写话题通信实现&#xff0c;发布方以某个频率发布自定义接口消息&#xff0c;订阅方订阅消息&#xff0c;并…

1975react社区问答管理系统开发mysql数据库web结构node.js编程计算机网页源码

一、源码特点 react 社区问答管理系统是一套完善的完整信息管理类型系统&#xff0c;结合react.js框架和node.js后端完成本系统&#xff0c;对理解react node编程开发语言有帮助系统采用node框架&#xff08;前后端分离&#xff09;&#xff09;&#xff0c;系统具有完整的源…

什么是数字体验成熟度,以及数字成熟度的模型计算和实现方法

“开发成功的全渠道数字身份&#xff0c;并通过无缝的数字体验吸引广泛的受众。无论您身在何处&#xff0c;都可以加速数字化转型并促进业务增长。通过直观、全面的工具&#xff0c;并了解您个人的数字体验成熟度水平&#xff0c;超越不断增长的客户期望并超越竞争对手。今天就…

构建LangChain应用程序的示例代码:53、利用多模态大型语言模型在RAG应用中处理混合文档的示例

许多文档包含多种内容类型&#xff0c;包括文本和图像。 然而&#xff0c;在大多数 RAG 应用中&#xff0c;图像中捕获的信息都会丢失。 随着多模态LLMs的出现&#xff0c;比如GPT-4V&#xff0c;如何在RAG中利用图像是值得考虑的。 本篇指南的亮点是&#xff1a; 使用非结…

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

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

【高阶数据结构】B-数、B+树、B*树的原理

文章目录 B树的概念及其特点解析B树的基本操作插入数据插入数据模拟 分析分裂如何维护平衡性分析B树的性能 B树和B*树B树B树的分裂B树的优势 B*B*树的分裂 总结 B树的概念及其特点 B树是一颗多叉的平衡搜索树&#xff0c;广泛应用于数据库和 文件系统中&#xff0c;以保持数据…

Ubuntu20.04突然没网的一种解决办法

本来要学一下点云地图处理&#xff0c;用octomap库&#xff0c;但是提示少了octomap-server库&#xff0c;然后通过下面命令安装的时候&#xff1a; sudo apt install ros-noetic-octomap-server 提示&#xff1a;错误:7 https://mirrors.ustc.edu.cn/ubuntu focal-security …

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法 0. 引言1. 关于m_track2. 关于m_range_ring3. 关于m_ellipse4. 关于m_windrose5. 结语 0. 引言 本篇介绍下m_map中绘制航迹图函数&#xff08;m_track&#xff09;、绘…

HTTP与HTTPS协议区别及应用场景

HTTP&#xff08;超文本传输​​协议&#xff09;和 HTTPS&#xff08;安全超文本传输​​协议&#xff09;都是用于通过网络传输数据的协议。虽然它们有一些相似之处&#xff0c;但在安全性和数据保护方面也存在显著差异。 在这篇博文中&#xff0c;我们将探讨 HTTP 和 HTTPS…

Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作

章节内容 上一节我们完成了&#xff1a; MapReduce的介绍Hadoop序列化介绍Mapper编写规范Reducer编写规范Driver编写规范WordCount功能开发WordCount本地测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学…

利用YOLOv8识别自定义模型

一、背景介绍 最近项目需要识别自定义物品&#xff0c;于是学习利用YOLOv8算法&#xff0c;实现物品识别。由于物体类别不再常规模型中&#xff0c;因此需要自己训练相应的模型&#xff0c;特此记录模型训练的过程。 二、训练模型的步骤 1.拍照获取训练图片&#xff08;训练图…

【前端CSS3】CSS显示模式(黑马程序员)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、CSS元素显示模式&#xff1a;☀️☀️☀️2.1 什么是元素显示模式2.2 块元素2.3 行内元素2.4 行块元素2.5 元素显示模式的转换 三、总结&#x1f680;&#x1f680;&#x1f680; 一、前言&#x1f680;&#x1f…