android知识

viewHolder

viewHolder顾名思义就是view保持者,ViewHolder通常出现在适配器里,用于重新使用view来减少对象的创建,通常用于view为空的时候,就创建一个view,若view不为空,就复用这个view

ViewModel

存放着与界面有关的数据‘,

LiveData

LiveData为前台数据,负责暂时存储数据,可以跟它注册的观察者回调数据是否已经更新,LiveData还能知晓它绑定的Activity或者Fragment的生命周期,它只会给前台活动的activity回调

LiveData简单使用

创建LiveData

只要继承LiveData并且在泛型里写下你的实体类,唯一需要注意的,postValue(this);这个方法是用于回调数据更新的方法. 你可以在你需要被观察的数据里添加.

package com.example.livedatastudy;

import androidx.lifecycle.LiveData;

public class DemoData extends LiveData<DemoData> {
    private int tag1;
    private int tag2;

    public int getTag1() {
        return tag1;

    }
    public void setTag1(int tag1) {
        this.tag1 = tag1;
        postValue(this);
    }

    public int getTag2() {
        return tag2;
    }

    public void setTag2(int tag2) {
        this.tag2 = tag2;
        postValue(this);
    }
}

创建ViewModel

public class DemoViewModel extends ViewModel {
    // TODO: Implement the ViewModel
    private DemoData mDemoData = new DemoData();

    public DemoData getDemoData() {
        return mDemoData;
    }
}

在Activity或者Fragment绑定

public class Demo2Activity extends AppCompatActivity {
    private static final String TAG = "Demo2Activity";
    private Button mBtnAddData;
    private DemoViewModel mDemoViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo2);
        mBtnAddData = findViewById(R.id.btn_add_data);
        mDemoViewModel = ViewModelProviders.of(this).get(DemoViewModel.class);//获取ViewModel,让ViewModel与此activity绑定
        mDemoViewModel.getDemoData().observe(this, new Observer<DemoData>() { //注册观察者,观察数据的变化
            @Override
            public void onChanged(DemoData demoData) {
                Log.e(TAG, "onChanged: 数据有更新");
            }
        });
        
        mBtnAddData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(TAG, "onClick: 已经点击");
                mDemoViewModel.getDemoData().setTag1(123); //这里手动用按键点击更新数据

            }
        });
    }
}

activity_main.xml

<?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/btn_add_data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="176dp"
        android:layout_marginLeft="176dp"
        android:layout_marginTop="204dp"
        android:text="Button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

LiveData与MutableLiveData区别

1.MutableLiveData的父类是LiveData
2.LiveData在实体类里可以通知指定某个字段的数据更新.
3.MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段

AS的xml中blueprint的作用

显示出了控件的大小呀 能很好的看到遮挡关系

在这里插入图片描述

AndroidStudio操作技巧

取消Compact Middle Packages选项能够看每一个包下面的子包,而不是凑在一起
在这里插入图片描述


可用@BindView的用法来获取布局的组件
https://blog.csdn.net/qq_41063141/article/details/82828047


创建menu文件

创建menu文件

添加依赖

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

显示详细信息

鼠标停留在报错的位置,按ctrl+F1就能查看详细报错原因

下载ptg插件能够一键生成构造器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

转为字符串

x.charAt(0)

导jar包

在src文件夹中创建一个lib文件夹,然后将jar包复制进去
在这里插入图片描述

然后右键。选择Add to Library
在这里插入图片描述

android一些技巧

  • 1.如果资源识别不了,代码识别不了,可以删除重写代码。代码不用全敲,依照软件的检索来完成,肯定能识别
  • 2.在logcat能检查代码错误在哪
  • 3.在报错的单词上按alt+enter就能快速修复错误
  • 4.若要让图像水平排列就设置水平线性Horizontal
  • 5.在左侧android-manifests-AndrioidManifest.xml中可修改Android 主题-android:theme=“”
  • 6.如果没有处理异常而报错,可以在左边红色灯泡那边。点击 选择 Surround with try/catch,添加try catch语句捕获异常
  • 7.左侧manifests AndroidManifest.xml android:theme=“@style/Theme.AppCompat”//可修改为灰色主题
  • 8.在左侧imageview-mainfests-AndroidManifest.xml中。添加android:screenOrientation=“landscape”//可设置屏幕为横屏模式
  • 9.当文本框组件TextView的字数过多就设置为布局高度与布局宽度都是与父容器相同
  • 10.可以定义字符串资源:string.xml,在布局管理器再进行引用,在xml中 内容;在布局管理器中android:text=“@string/content”//引用字符串资源
  • 11.new关键字能实例化对象
  • 12.不设置边距,删除布局管理器的android:padding属性
  • 13.Android Studio有什么奇技淫巧?
  • 14.android代码的分析顺序:先分析布局,再分析其他函数,最后分析调用的函数与主函数

最强 Android Studio 使用小技巧和快捷键

https://www.cnblogs.com/Seachal/p/5591600.html

修改包名结构

参考:https://www.jianshu.com/p/a7e832af49dc
要将

要将包名结构从折叠改成
在这里插入图片描述
可拆分 。只需要设置中去掉compact middle packages即可,如下图
在这里插入图片描述
在这里插入图片描述

修改项目名称

改项目名称还要改settings.gradle、java目录下的文件夹名称,build.gradle(:app)、string.xml

复用Toast

定义

package com.example.news.util

import android.widget.Toast
import com.example.news.MyApplication


fun String.showToast(){
        Toast.makeText(MyApplication.context,this,Toast.LENGTH_SHORT).show()
    }

调用

"你好".showToast()

定义全局的context

定义

package com.example.news

import android.app.Application
import android.content.Context
//创建应用于全局的context
class MyApplication :Application() {
    //创建静态变量
    companion object{
        //延迟初始化。创建context变量
        lateinit var context: Context
    }

    override fun onCreate() {
        super.onCreate()//重写父类的onCreate方法
        //把basecontext的返回值赋值给context
        context=baseContext
    }
}

调用

MyApplication.context

Android 开发之:Tools 属性

Android 开发之:Tools 属性

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值