大家好,又见面了,我是你们的朋友全栈君。
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账号...