安卓开发需要依赖于 android studio

下载地址:https://developer.android.google.cn/studio/

快速导航

ListView

入手Demo

1、创建空模板工程

2、找到布局,修改hello world

3、配置虚拟机器的同时,给虚拟设备添加安卓系统

4、启动须虚拟手机,并开机

5、本地App,安装到虚拟手机

安卓项目结构分析

.gradle

.idea

app 核心目录

gradle 项目构建器

.gitignore 版本控制的文件,忽略一些文件

build.gradle 项目构建程序

gradle.properties gradle的全局配置文件

gradlew Linux Mac运行

gradle.bat Windows运行

local.properties 指定SDK的路径,一般不用管

setting.gradle 指定所有引入的模块(等价于Maven的pom.xml 文件)

app文件夹分析

build 构建的文件,不用管!

libs

src

.gitignore

build.gradle

AndroidManifest.xml放置内容

图标、四大组件注册、权限

TextView 控件

控件的长宽是dp

字体大小是sp

字符串内容 要写在 app/src/main/values 的strings.xml

颜色内容要定义在 app/src/main/values 的colors.xml

Button 控件

分为三层:前景色、文字、背景

Button事件处理

EditText 文本输入

ImageView 图片控件

ProgressBar 进度条控件

NotificationManager 系统通知管理

Toolbar

AlertDialog

    // 打开App内部弹窗
    public void openAlert(View view) {
        AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
        alertBuilder.setIcon(R.mipmap.ic_launcher)
                .setTitle("我是对话框标题")
                .setMessage("我是消息主体")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Log.e(Tag, "点击了确定");
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Log.e(Tag, "点击了取消");
                    }
                })
                .setNeutralButton("中间", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Log.e(Tag, "点击了中间");
                    }
                })
                .create()
                .show();

    }

PopupWindow

布局

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="vertical">

    ...

</LinearLayout>

更重要的是权重 android:layout_weight="1" 其含义是占用剩余空间,容易受到到 match_parent 相应。建议使用权重的时候,不使用match_parent,并替换为0dp

RelativeLayout 相对定位

<?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">

    <!-- 依据"父容器"定位 -->
    <RelativeLayout
        android:id="@+id/red"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:background="#ff0000"></RelativeLayout>

    <!-- 依据"平级容器"定位-->
    <RelativeLayout
        android:id="@+id/green"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_above="@id/red"
        android:background="#00ff00"></RelativeLayout>

</RelativeLayout>

FrameLayout 真布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/red"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#ff0000"></FrameLayout>

    <FrameLayout
        android:id="@+id/green"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:foreground="@drawable/bg"
        android:background="#00ff00"></FrameLayout>

    <FrameLayout
        android:id="@+id/blue"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#0000ff"></FrameLayout>

</FrameLayout>

TableLayout 表格布局

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TableRow>
        <Button
            android:id="@+id/red"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#FF0000"
            android:text="第一个"></Button>

        <Button
            android:id="@+id/green"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#00ff00"
            android:text="第二个"></Button>

        <Button
            android:id="@+id/blue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#0000ff"
            android:text="第三个"></Button>
    </TableRow>
    
</TableLayout>

GridLayout 网格布局

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnCount="2">

    <Button
        android:id="@+id/red"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FF0000"
        android:text="第一个"></Button>

    <Button
        android:id="@+id/green"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#00ff00"
        android:text="第二个"></Button>

    <Button
        android:id="@+id/blue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#0000ff"
        android:text="第三个"></Button>

</GridLayout>

ConstraintLayout 约束布局,手动拖拽进行布局。

<?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">


    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:ignore="MissingConstraints"
        tools:layout_editor_absoluteX="57dp"
        tools:layout_editor_absoluteY="41dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

ListView渲染数据

编码思路

第一个是主布局 下有一个ListView,第二个是子布局(我们用来渲染数据) 下有个TextView,(子布局是我们实际的数据渲染展示的内容。)组件的渲染需要依赖于适配器Adapter,我们在适配器获取控件并渲染即可!

具体的使用是

主布局的的Java代码获取了ListView对象,调用了适配器给传入了数据并指定渲染了TextView。然后ListView就有了TextView了

布局 activity_main、activity_list_item

<?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="vertical">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

</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="vertical">


    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp" />

</LinearLayout>

java Bean

// 这是一个普通的自定义JavaBean对象
public class Bean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

适配器

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;

// 我是适配器 继承于BaseAdapter,用于接收、渲染数据给视图组件
public class MyAdapter extends BaseAdapter {

    // 定义两个属性 第一个 要渲染的数据,未来由别人传参
    private List<Bean> data;
    // 第二个对象是:(源码翻译是:它允许访问特定于应用程序的资源和类,以及调用应用程序级操作,如启动活动、广播和接收意图等)
    public Context context;

    // 本适配器的全参构造方法
    public MyAdapter(List<Bean> data, Context context) {
        this.data = data;
        this.context = context;
    }

    /**
     * 此适配器表示的数据集中有多少项 (继承BaseAdapter重写)。
     * @return 物品计数
     */
    @Override
    public int getCount() {
        return data.size();
    }

    /**
     * 获取与数据集中指定位置关联的数据项。 (继承BaseAdapter重写)
     * @param position 我们希望其数据位于适配器数据集中的项目的位置
     * @return 指定位置的数据
     */
    @Override
    public Object getItem(int position) {
        return null;
    }

    /**
     * 获取与列表中指定位置关联的行id (继承BaseAdapter重写)
     * @param position 我们需要其行id的适配器数据集中项目的位置
     * @return 位于指定位置的项的id
     */
    @Override
    public long getItemId(int position) {
        return position;
    }

    // 定义一个内部类,仅做减少从原始图获取子组件的调用过程
    private final class ViewHolder{
        TextView textView;
    }

    /**
     * 重新获取视图 (继承BaseAdapter重写)
     * @param position 第几列
     * @param contextView  视图对象
     * @param viewGroup 视图组是一种特殊视图,可以包含其他视图(称为子视图)。视图组是布局和视图容器的基类。
     * @return
     */
    @Override
    public View getView(int position, View contextView, ViewGroup viewGroup) {
        ViewHolder viewHolder;
        if (contextView == null) {
            // 视图为空,则构建ViewHolder对象
            viewHolder = new ViewHolder();
            // 如果原视图是空,重新获取要渲染的对象(context)的视图结构
            contextView = LayoutInflater.from(context).inflate(R.layout.activity_list_item, viewGroup, false);
            // 依据视图结构 获取某个组件
            viewHolder.textView = contextView.findViewById(R.id.tv);
            contextView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) contextView.getTag();
        }
        // 给组件赋值
        viewHolder.textView.setText(data.get(position).getName());
        // 常规日志打印
        Log.e("leo","getView: "+position);
        // 返回视图
        return contextView;
    }
}

主类 MainActivity

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    // 定义一个Java Bean的List集合
    private List<Bean> data = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 给定义的集合塞入数据
        for (int i = 0; i < 100; i++) {
            Bean bean = new Bean();
            bean.setName("张三" + i);
            data.add(bean);
        }
        // 获取视图对象
        ListView listView = findViewById(R.id.lv);
        // 绑定适配器,适配器的作用似乎是渲染视图了
        listView.setAdapter(new MyAdapter(data, this));
        // 给每个视图格子绑定点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Log.e("点击事件", "我被点击了," + "位置:"+ position +",行Id:"+ id);
            }
        });
    }
}

RecyclerView

导包

    implementation 'androidx.recyclerview:recyclerview:1.1.0'
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤