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 服务

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 三种主流芯片架构简单比较[通俗易懂]

    三种主流芯片架构简单比较[通俗易懂]来源:https://blog.csdn.net/weixin_39752599/article/details/78664055可以参照的信息:https://blog.csdn.net/shenghuaDay/article/details/78747561三种主流芯片架构  1. ARM ARM是高级精简指令集的简称(AdvancedRISCMachine),它是一个32位的精简…

  • 有源低通滤波器 vs. 有源带通滤波器 vs. LC滤波器「建议收藏」

    有源低通滤波器 vs. 有源带通滤波器 vs. LC滤波器「建议收藏」在做一个小东西,想省成本用F407内部的DAC生成Sin输出(100Hz,1kHz,10kHz,100kHz),但是407DAC能力有限,当要输出100kHz的Sin曲线的时候一个周期只能11个点左右,示波器上能看到明显的阶梯,需要一个滤波器。一直纠结有源低通,有源带通,无源LC滤波。滤波器可以通过TI的滤波器设计软件FilterPro来设计,非常简单,有一点就是运放的增益带宽积,同频率下…

  • windows开机自动执行bat脚本启动cmd命令窗口并执行命令,最后自动关闭cmd命令窗

    windows开机自动执行bat脚本启动cmd命令窗口并执行命令,最后自动关闭cmd命令窗windows开机自动执行bat脚本启动cmd命令窗口并执行命令,最后自动关闭cmd命令窗

  • idea激活码2021[在线序列号]

    idea激活码2021[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 一周信创舆情观察(12.7~12.13)

    一周信创舆情观察(12.7~12.13)一、一周舆情要点行业方面,2020年集成电路设计行业销售额预计为3819.4亿元,比2019年的3084.9亿元增长23.8%。日前,我国自主研发的一项物联网安全测试技术(TRAIS-PTEST)由国际标准化组织/国际电工委员会(ISO/IEC)发布成为国际标准。拉勾近日发布人才白皮书,至2020年底我国新基建相关核心技术人才缺口已达426万。国际方面,微软为ARM版本Win10推出64位模拟器。欧盟新法规定,超大型科技公司需监督互联网,否则罚款年营业额6%。近日,思科和英国云通信软件公司IMImo

  • 僵尸进程介绍_僵尸进程的危害

    僵尸进程介绍_僵尸进程的危害进程的生命周期进程在它被创建的时刻开始存活,在linux系统中,这通常是调用fork()系统调用的结果,该系统调用通过复制一个现有进程来创建一个全新的进程。调用fork()的进程被称为父进程,新产生的进程被称为子进程。在该调用结束时,在返回点这个相同位置上,父进程恢复执行,子进程开始执行。fork()系统调用从内核返回两次:一次回到父进程,另一次回到新诞生的子进程。通常,创建新的进程都是为了立即执行新的、不同的程序,而接着调用exec*()这族函数就可以创建新的地址空间,并把新的程序载

    2022年10月26日

发表回复

您的电子邮箱地址不会被公开。

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