基本布局
Java文件夹
Res文件夹
- 图片资源放drawable然后导入图片视图的时候就会自动提示
- 所有文字放常量,使用@string去引用内容,方便国际化和统一控制
- 文字处可以点击右边选择res-values内容常量也可以直接add new新建进去
基础操作
xml视图控件操作
ConstraintLayout说明
- 单个控件:
每个控件都需要水平竖直方向定位至少一个点,
可以选择 1. 右下角的上下左右 2. 直接拖拽控件 3. 上方魔法棒自动定位
- 多个控件【聚合、扩散、对齐方法】
圈选后右键[align、pack]或者
圈选后上方多出 Pack,选择模式[垂直聚合,水平聚合,垂直扩散,水平扩散]
快速自动布局多个控件;
旁边还有个align对齐按钮同样使用(但都是对于没有约束的控件)
layout_width的几种模式
使用辅助线百分比控制不同设备不溢出
用辅助线百分比 控件宽度填充设计自适应界面,I切出辅助线点击左边切换形式至百分比即可
多设备适配[横屏、竖排双布局]
点击左上角的旋转按钮,create new land就行了,activity_main下面会多一个(land)
其他
导入矢量图标 new vector asset即可
矢量图可以随便放大格式是xml
代码基础
MainActive事件
启动时:onCreate + onStart + onResume(正在运行)
返回主界面:onPause + onStop
重新进入:onRestart + onStart + onResume
杀死进程:onDestory
旋转屏幕会杀死重新进入
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("系统创建");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("刚刚开始");
}
等等
}
控件代码获取
R.id.$ 可以获取组件id的数值 配合 findViewById使用
R.string.$ 可以获取字符常量
//TextView获取操作
TextView texView;
Button button1,button2;
textView = findViewById(R.id.textView1);
button1 = findViewById(R.id.button1);
//添加按钮监听器
button1.setOnClickListener( new View. OnClickListener() {
@Override
public void onClick(View view) {
textView. setText ("左边") ;
}
});
本地化及多语言支持
strings.xml选择右上open Edit后选择地球图标直接选择语言就能多出以列去写新的语言翻译了
LivingData&&dataBinding
LivingData
创建对象继承viewModel然后里面的对象存放在MutableLiveData容器里面
public class MyViewModel extends ViewModel {
private MutableLiveData<Integer> count;
public MutableLiveData<Integer> getCount() {
if (count == null) {
count = new MutableLiveData<>();
count.setValue(0) ;
}
return count;
}
public void add(int p){
count.setValue(count.getValue() + p);
}
}
dataBinding
主要目的是让数据存储下来 以及双向绑定
首先再build.gradle(app)里面default下面添加
dataBinding {
enabled true
}
然后layout.xml里面添加ait + 回车 convert to dataBinding即可更改xml视图格式多出标签,其中填写LivingData对象就能完成数据的双向绑定,就不需要用java代码去根据id获取xml里面的控件然后再改内容,直接通过xml和LivingData(类)进行数据交互;
<data>
<variable
name= "data" type="com.example.viewmodelrestore.MyViewModet" />
</data>
主函数内将livingData 和 dataBinding进行绑定
public class MainActivity extends AppCompatActivity {
MyViewModel myViewModel; //LivingData对象
ActivityMainBinding binding; //dataBinding对象
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate( savedInstanceState);
//将layout绑定到dataBinding
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
//实体化livingData
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
//绑定
binding.setData(myViewModel);
//设置对象
binding.setLifecycleOwner(this);
}
}
然后通过xml控制控件数据就行,如下,就绑定了数据以及点击事件
android:text="@{String.valueOf(data.getCount())}"
android:onClick="@{()->data.add()}"
viewModelStateSave实现杀死进程数据仍然存在
先在build.grade(app)下dependencies里面添加
implementation ‘androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha01’
然后改造使用handle; key-value形式
public class MyViewModel extends ViewModel {
private SavedStateHandle handle;
public MyViewModel(SavedStateHandle handle){
this.handle = handle;
}
public MutableLiveData<Integer> getCount() {
if (!handle.contains("count")) {
handle.set("count",0);
}
return handle.getLiveData("count");
}
public void add(){
getCount().setValue(getCount().getValue() + 1);
}
}
创建的时候记得带上参数savedState,new SavedStateVMFactory(this))创建即可
myViewModel = ViewModelProviders.of(this,new SavedStateVMFactory(this)).get(MyViewModel.class);
SharedPreferences本地持久化存储
[基于前面两个配置实现]反正就是拿一个类基础AppCompatActivity直接控制存key-value到本地xml里面
data-data-找到包下面就能看到本地文件,存储使用onPause(),不适用destory或者stop它们经常被跳过
修改实体类直接实现实体类存储;其他不变
package com.example.myapplication;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.SavedStateHandle;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends AndroidViewModel {
private SavedStateHandle handle;
public MyViewModel(@NonNull Application application) {
super(application);
this.handle = handle;
if (!handle.contains("count")) {
load();
}
}
public LiveData<Integer> getCount() {
return handle.getLiveData("count");
}
private void load() {
SharedPreferences shp = getApplication().getSharedPreferences("file_name", Context.MODE_PRIVATE);
handle.set("count",shp.getInt("count",0));
}
public void save() {
SharedPreferences shp = getApplication().getSharedPreferences("file_name", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = shp.edit();
editor.putInt("count",getCount().getValue());
editor.apply();//提交
}
public void add(int x){
handle.set("count",getCount().getValue() + x);
}
}