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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java 文件上传与下载

    Java 文件上传与下载MultipartFile这个类一般是用来接受前台传过来的文件Part能获取所有的请求参数的参数名,而Parameter只能获取非文件类型的参数名Part不能获得普通参数的参数值,只能从getParameter(String)获取参数值想要上传文件到服务器,必须使用Part获得二进制的输入流Part能获得上传文件的文件大小、文件类型HttpServletRequestrequest@RequestPart…

    2022年5月14日
    42
  • Jedis配置,项目启动注入JedisPool

    Jedis配置,项目启动注入JedisPoolJedis配置,项目启动注入JedisPool@EnableAutoConfiguration@PropertySource(“classpath:config.properties”)@ConfigurationProperties(prefix=”redis”)publicclassJedisConfig{/***LOGGER*/…

    2022年9月3日
    5
  • linux 安装tinyxml,使用TinyXml「建议收藏」

    linux 安装tinyxml,使用TinyXml「建议收藏」使用TinyXml的两种方法。第一,导入所需的头文件和cpp文件TinyXml由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。这就是开源的好处,就跟你自己写的程序一样,想怎么用都行。…

    2022年6月11日
    230
  • 5G网络切片综述 — 1

    5G网络切片综述 — 1简介随着5G时代的来临,21年的SA在国内的全范围商用,现阶段人们对于5G的必要性认识还不足。主要是目前人们用的5G主要集中在eMBB(enhancedMobileBroadband)即增强型移动带宽的阶段,而大数据业务如在线直播、高清视频等在4G上都得到了很好的支持,所以带宽的继续增大对于用户体验的边际效应递减。5G所带来的真正改善并不仅仅是在于大带宽,而在于5G提供了在同一张物理5G网络的情况下,同时能够提供eMBB,URLLC(Ultra-ReliableLow-LatencyCommun

    2022年10月2日
    0
  • 动态库学习[通俗易懂]

    动态库学习[通俗易懂]总结一:动态库前言 我们知道程序编译链接经常使用动态,同时我们可能还知道,动态库时程序运行时加载的。但是动态库到底有什么作用,如何生成、如何加载等,我们却很少关注。接下来,我给大家做一个简单的介绍。1.1动态库和静态库的区别静态库特点(linux):命名上是以*.o结尾静态库在链接阶段直接就加入到可执行的文件中了,在执行过程中无需该静态库相对于动态库生成的文件,使用静态库生…

    2022年9月30日
    0
  • nodejs写入json文件_json文件可以删除吗

    nodejs写入json文件_json文件可以删除吗哈喽!nodejs的文件系统,接触过node的对node的文件系统肯定不会陌生,这两天我就在思考一个问题,我是否可以在本地操作我的本地json文件,这样一个本地的文本数据库就有了,如果是便签之类,记录的软件,我完全可以不用连后台的数据库,我可以自己操作本地的json文件,自己用node写后台,答案是肯定的,下面我们就一起来实现一下吧,对本地json文件的增、删、改、查1.增首先我们先看一下…

    2022年10月12日
    0

发表回复

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

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