Android 从零开始(一)[通俗易懂]

Android 从零开始(一)[通俗易懂]Activity在我以网页web角度来认为的:Activity就是界面Layout就是html布局java就是js进行各种dom数据操作style就是cssAndroidManifest.xml-清单文件也可以简称为「manifest文件」。清单文件非常重要,它告诉系统我们的app有哪些activity,用到了什么权限等等信息。如果要新建activity,需要在清单中注册。<applicationandroid:allowBackup=”true” and

大家好,又见面了,我是你们的朋友全栈君。

Activity

在我以网页web角度来认为的:

  • Activity就是界面
  • Layout就是html 布局
  • java就是js 进行各种 dom数据操作
  • style 就是css

AndroidManifest.xml – 清单文件

也可以简称为「manifest文件」。清单文件非常重要,它告诉系统我们的app有哪些activity,用到了什
么权限等等信息。
如果要新建activity,需要在清单中注册。

<application android: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">  // MainActivity -Java 文件
	 	<intent-filter> 
	 		//app 进入的第一个界面
	 		<action android:name="android.intent.action.MAIN" />
	 		//app 的icon
	  		<category android:name="android.intent.category.LAUNCHER" />
	 	</intent-filter> 
	 </activity> 
</application>

Activity生命周期

其实就是一个栈

在这里插入图片描述

java

四种状态

在这里插入图片描述

四种状态对应的周期方法

在这里插入图片描述

java 流程图

在这里插入图片描述

个人总结:

  • 点开 app 进入 a页面: onCreate (创建)=>onStart(准备可见中)=>onResume(准备好了 立刻可见)
  • 离开 app: onPause(未完全消失)=>onStop(完全不可见)=>onDestroy(销毁)
  • 出现弹窗: onPause(未完全消失)
  • 弹窗消失: onResume(恢复立刻可见)
  • 切到b页面: onPause(未完全消失)=>onStop(完全不可见)
  • 返回: onRestart (重新启动)=>onStart(准备可见中)=>onResume(准备好了 立刻可见)

activity启动模式

  • standard

会重复添加 activity

在这里插入图片描述

  • singleTop

当前不处于栈顶就会被重复创建

在这里插入图片描述

  • singleTask

不会添加重复activity

在这里插入图片描述

  • singleInstance

不同的activity栈唯一

在这里插入图片描述

常用控件

  • TextView
web网页 就是div吧

属性比较简单 但注意:sp用来文字,dp布局

  • Button
    注意:
//先继承 点击原始事件
class MainActivity : AppCompatActivity(),View.OnClickListener
 // 多个button 点击事件
    override fun onClick(v: View?){ 
   
        when(v?.id){ 
   
            R.id.click_btn->{ 
   
                xxxxxxxxx
            }
        }
    }
  • EidtText

编辑框:有很多类型但是都很基础就不写了
注意:
获取文本内容:
.text.toString()

  • ImageView

图片容器

  • progress

进度条
默认加载圆形状
添加style:Horizontal 变长条进度条
max=“100”

  • AlertDialog

对话框
代码:

 AlertDialog.Builder(this).apply { 
   
                setTitle("这是一个对话框")
                setMessage("this is message")
                setPositiveButton("确定") { 
    _, _ ->
                    Toast.makeText(this@MainActivity, "确定被点击",Toast.LENGTH_LONG).show()
                }
                setNegativeButton("取消") { 
    _, _ ->
                    Toast.makeText(this@MainActivity, "取消被点击",Toast.LENGTH_LONG).show()
                }
				show()
            }

布局

  • 约束布局
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    案列:
    在这里插入图片描述
    重点:权重 均分
  • 线性布局

在这里插入图片描述

在这里插入图片描述

  • 相对布局
    在这里插入图片描述
  • 帧布局:FrameLayout

从左上角开始绘制 依次覆盖

在这里插入图片描述

  • TableLayout

在这里插入图片描述

  • 网格布局GridLayout
    在这里插入图片描述

在这里插入图片描述

其他布局内容:转载:Android——六大基本布局总结

组合控件 继承控件 自绘控件(高阶)

  • 组合控件
    创建一个新的layout xml文件 —

在这里插入图片描述
其内容代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:background="@color/pink"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@+id/back_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="返回"
        android:textColor="@color/black"
        android:textSize="30sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"></TextView>


    <TextView
        android:id="@+id/title_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是标题"
        android:textColor="@color/black"
        android:textSize="40sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </TextView>
</androidx.constraintlayout.widget.ConstraintLayout>

将common_title引入其他xml文件中

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

就形成了公共的导航栏
在这里插入图片描述

  • 继承组件
    创建一个java控件类
    在这里插入图片描述
    代码:
package com.example.learn002

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout

/** * 继承控件 */
class CommonTitleView(context: Context, attrs: AttributeSet?) : ConstraintLayout(context, attrs),
    View.OnClickListener { 
   
    private var mBackOnClickListener: OnClickListener? = null
    private var title_text: TextView
    private var back_text: TextView

    init { 
   
        //加载布局
        LayoutInflater.from(context).inflate(R.layout.common_title, this)
        //找到控件
        title_text = findViewById(R.id.title_text)
        back_text = findViewById(R.id.back_text)
        back_text.setOnClickListener(this)
    }

    //设置点击事件
    override fun onClick(p0: View?) { 
   
        when (p0?.id) { 
   
            R.id.back_text -> { 
   
                //监听器
                mBackOnClickListener?.onClick(p0)
            }
        }

    }

    //设置监听器 返回
    fun setBackOnClickListener(backOnClickListener: OnClickListener) { 
   
        mBackOnClickListener = backOnClickListener
    }

    //设置标题
    fun setTitle(text: String) { 
   
        title_text.text = text
    }


}

使用:
layout文件中:

 <com.example.learn002.CommonTitleView
        android:id="@+id/common_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

java文件中:

 //继承控件
        val common_title = findViewById<CommonTitleView>(R.id.common_title)
        common_title.setTitle("这是标题")
        common_title.setBackOnClickListener{ 
   
            Log.d(TAG, "MainActivity==被点击")
            finish()
        }
  • 自绘控件(高阶)
    创建文件MyTextView
    在这里插入图片描述
    代码如下:
package com.example.learn002

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.widget.TextView

@SuppressLint("AppCompatCustomView")
class MyTextView(context: Context?, attrs: AttributeSet?) : TextView(context, attrs) { 
   
    //默认在文字下方有条下划线

    override fun onDraw(canvas: Canvas?) { 
   
        super.onDraw(canvas)
        // 笔 画布
        val paint = Paint()
        paint.setColor(Color.RED)
        paint.strokeWidth =5F
        canvas?.drawLine(0F,height.toFloat(),width.toFloat(),height.toFloat(),paint)
    }
}

直接使用:

  <com.example.learn002.MyTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="自定义控件"
        android:textSize="47sp"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toBottomOf="@+id/common_title"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/text1"
        />

效果:
在这里插入图片描述

  • RecyclerView
    引入依赖:
    在这里插入图片描述

动画

  • 帧动画
    直接上代码:
    drawable 文件
    在这里插入图片描述
    layout:
    在这里插入图片描述
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl"
    android:layout_width="match_parent"
    android:background="@drawable/frame"
    android:layout_height="match_parent">

</RelativeLayout>

activity文件使用:

package com.example.my_notification;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;

import androidx.annotation.Nullable;

public class FrameActivity extends Activity { 
   
    private boolean flag = true;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.animation_frame);
        RelativeLayout relativeLayout = findViewById(R.id.rl);
        AnimationDrawable anim = (AnimationDrawable) relativeLayout.getBackground();
        relativeLayout.setOnClickListener(new View.OnClickListener() { 
   
            @Override
            public void onClick(View view) { 
   
                if (flag == true) { 
   
                    anim.start();
                    flag = false;
                }else{ 
   
                    anim.stop();
                    flag = true;
                }
            }
        });
    }
}

  • 补间动画

在这里插入图片描述
详细看文档

Fragment

Fragment 与 activity 通信

BUNDLE 方案

  public void onClick(View v) { 
   
        switch (v.getId()) { 
   
            case R.id.btn1:
                //Bundle 保存数据的类
                Bundle bundle = new Bundle();
                bundle.putString("message", "我喜欢android");
                ItemFragment tfg = new ItemFragment();
                tfg.setArguments(bundle);
                replaceFragment(tfg);
                break;
            case R.id.btn2:
                replaceFragment(new MapsFragment());
        }
    }

    // 动态切换Fragment
    private void replaceFragment(Fragment fragment) { 
   

        // fragmentManager 管理类
        FragmentManager fragmentManager = getSupportFragmentManager();
        // 管理类 动作
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.framelayout, fragment);
        // fragment 添加到同一个栈中
        fragmentTransaction.addToBackStack(null);
        // 执行
        fragmentTransaction.commit();
    }

java中类与类通信方案 接口

其他方案:eventBus LiveData 观察者模式 发布订阅模式

  • Fragment 生命周期

Service 服务

  • 生命周期
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148581.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 每天一个linux命令(43):killall命令

    每天一个linux命令(43):killall命令

    2021年9月16日
    57
  • python对csv文件的读写

    python对csv文件的读写首先先简单说一下csv文件,csv的全称是Comma-SeparatedValues,意思是逗号分隔值,通俗点说就是一组用逗号分隔的数据。CSV文件可以用excel打开,会显示如下图所示:这个文件用notepad打开显示是这样的,这是它原始的样子:好了,下班我们来用python对csv文件进行读写操作1.读文件如何用Python像操作Excel一样提取其中的一列,即一个字段,利用Py…

    2022年7月21日
    15
  • 图像处理-激光测距技术&工业相机基本原理概述「建议收藏」

    图像处理-激光测距技术&工业相机基本原理概述「建议收藏」激光测距技术与一般光学测距技术相比,具有操作方便、系统简单及白天和夜晚都可以工作的优点.与雷达测距相比,激光测距具有良好的抗干扰性和很高的精度,而且激光具有良好的抵抗电磁波干扰的能力,尤其在探测距离较长时,激光测距的优越性更为明显.激光测距技术是指利用射向目标的激光脉冲或连续波激光束测量目标距离的距离测量技术.比较常用的激光测距方法有脉冲法、相位法、三角法和干涉法激光测距.本文主要探讨下激光三角法的基本原理和工业相机原理:1.1激光三角法的基本原理光电技术的快速发展,以及计算.

    2022年5月30日
    40
  • 矩阵分析:向量范数,矩阵范数,范数应用[通俗易懂]

    矩阵分析:向量范数,矩阵范数,范数应用[通俗易懂]1,向量范数1.1,向量范数的定义和例子设是复数域上的维向量空间,称函数为向量范数,是指对所有,有下列性质:(1)非负性:,并且当且仅当。(2)齐次性:对任何,。(3)三角不等式:若对任意,有:(1)(2)(3)证明(3):根据三角不等式,有:两式分别相减可得:设,则下列实值函数都是上的向量范数:(1)2范数:(2)1范数:(3)范数:(4)p范数:,当时,分别得到向量1范数和2范数,并且可以证明…

    2022年9月19日
    3
  • CACL联赛第一赛季第一轮比赛排名公布!

    CACL联赛第一赛季第一轮比赛排名公布!亲爱的同学们,CACL联赛第一赛季第一轮,“波士顿房价预测”比赛结束啦!本轮比赛共计31支队伍提交了有效结果。一、比赛结果第一名:浙江大学AI俱乐部第二名:中国海洋大学智能数据分析俱乐部第三名:重庆邮电大学人工智能协会恭喜同学们获得好名次,也非常感谢同学们的热情参与。排名前五的结果代码已在T-CCP社区公布。点击查看>>>另外排名前五的战队会颁发获奖证书,第六名及以后…

    2025年6月26日
    1
  • 视频编码格式不支持_缺少编码解码器

    视频编码格式不支持_缺少编码解码器AVI格式视频文件编码格式缺少编码解释器且该项目的编码格式不受支持产生0xc00d5212错误(见下图)解决方案:将AVI格式视频转换为MP4格式视频文件。方式:通过格式工厂软件(见下图)。下载链接:点击下载格式工厂4.8.0.0官方免费版操作:一、下载好软件(格式工厂)之后,点击启动软件进去,点击红色箭头指向的红色框的内容(->MP4)。二、点击红色箭头指向的红色框的…

    2022年9月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号