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文件
添加依赖
显示详细信息
鼠标停留在报错的位置,按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