0. 项目构建
1. 文件布局介绍
res —> layout: 放置布局文件
res —> drawable-xhdpi: 放置图标、图片文件
res —> values: 放置style、字符串、颜色等资源
2. 仿真机需要电脑开启虚拟技术
3. layout
3.1 LinearLayout: 线性布局
配合布局方向:水平or竖直
3.2 RelativeLayout:相对布局
通过指定id之间的相对关系明确布局分布
3.3 布局相关设置:padding 、background
4. TextView:展示文本
android:layout_height = wrap_content —> 适配内容大小调整布局的高度 / match_parent —>适配父对象
android:textSize = “30sp” —> 字体大小用sp,布局尺寸用dp
android:maxEms=“12” —> 单行最多展示字体个数
android:maxLines=“2” —>最多展示多少行
android:ellipsize=“end” —>对于没展示完的字体以省略号结尾
android:gravity=“center” —> 设置对象内字体的对齐方式,居中对齐
android:layout_gravity=“center” —>—> 设置对象框体本身的对齐方式
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="@string/tips"
android:textColor="#FF9800"
android:textSize="30sp"
android:maxEms="12"
android:maxLines="2"
android:ellipsize="end"
android:gravity="center"
android:layout_marginTop="200dp"
/>
5. editText:编辑文本
android:hint=“用户名” —>以提示形式显示的内容
android:background=“@drawable/bg_username” —> 自定义的背景形状
6. Button
android:layout_width=“0dp”
android:layout_weight=“1” —> 两者结合使用,可以通过权重决定宽度占比
7. 自定义背景边框
drawable 下新建.xml文件 bg_username.xml
实现一个带圆弧的矩形边框形状
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="@color/white"
/>
<corners
android:topLeftRadius="10dp"
android:bottomLeftRadius="10dp"
/>
</shape>
8. 点击跳转
实现点击按钮,两个activity的跳转
(1)MainActivity 实现View类的监听接口View.OnClickListener ,并实现onClick()方法;后续监听到对应事件后便执行该函数。
(2)声明控件,并通过setOnClickListener(this)函数开启监听。
(3)在onClick函数中,通过Intent对象表明要跳转的页面,通过startActivity()执行该意图
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et_user;
private EditText et_psw;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//2 找到控件
// 1 声明控件
Button mbtn_login = findViewById(R.id.bt_login);
et_user = findViewById(R.id.et_user);
et_psw = findViewById(R.id.et_pwd);
//3.实现跳转
mbtn_login.setOnClickListener(this); //设置开启监听,发生触发事件后执行的就是onclick函数
}
@Override
public void onClick(View view) {
String user = et_user.getText().toString();
String pwd = et_psw.getText().toString();
Intent intent = null;
if (user.equals("wwb") && pwd.equals("123"))
{
intent = new Intent(this,FunctionActivity.class);
startActivity(intent);
}
else
{
}
}
}
8.Toast使用
创建Toast工具类
package com.example.demo1.util;
import android.content.Context;
import android.widget.Toast;
public class ToastUtil {
private static Toast mToast;
public static void showMsg(Context context,String msg){
if (mToast == null){
mToast = Toast.makeText(context,msg,Toast.LENGTH_SHORT);
}else {
mToast.setText(msg);
}
mToast.show();
}
}
使用Toast
ToastUtil.showMsg(MainActivity.this,"登录成功");
9. 侧滑实现
添加侧滑容器
SlideMenu.java
package com.example.demo1;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.Scroller;
public class SlideMenu extends FrameLayout {
private View menuView,mainView;
private int menuWidth;
private Scroller scroller;
public SlideMenu(Context context) {
super(context);
init();
}
public SlideMenu(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init(){
scroller = new Scroller(getContext());
}
/**
* 当1级子view全部加载完调用,可以用初始化子view引用
* 注意这里无法获取子view的宽高
*/
@Override
protected void onFinishInflate() {
super.onFinishInflate();
menuView = getChildAt(0);
mainView = getChildAt(1);
menuWidth = menuView.getLayoutParams().width;
}
//使Menu也具有滑动功能
public boolean onInterceptTouchEvent(MotionEvent ev){
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getX();
break;
case MotionEvent.ACTION_MOVE:
int deltaX = (int) (ev.getX() - downX);
if (Math.abs(deltaX) > 8){
return true;
}
break;
}
return super.onInterceptTouchEvent(ev);
}
/**
* s设置两个子view在页面上的布局
* @param l:当前子view的左边在父view的坐标系的x坐标
* @param t:当前子view的顶边在父view的坐标系的y坐标
* @param r:当前子view的宽
* @param b:当前子view的高
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
menuView.layout(-menuWidth, 0, 0, b);
mainView.layout(0, 0, r, b);
}
/**
* 处理屏幕滑动事件
*/
private int downX;
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getX();
int deltaX = moveX - downX;
int newScrollX = getScrollX() - deltaX;
if (newScrollX < -menuWidth) newScrollX = -menuWidth;
if (newScrollX > 0) newScrollX = 0;
scrollTo(newScrollX, 0);
downX = moveX;
break;
case MotionEvent.ACTION_UP:
//当滑动距离小于Menu宽度的一半时,平滑滑动到主页面
if(getScrollX()>-menuWidth/2){
closeMenu();
}else {
//当滑动距离大于Menu宽度的一半时,平滑滑动到Menu页面
openMenu();
}
break;
}
return true;
}
//关闭menu
private void closeMenu(){
scroller.startScroll(getScrollX(),0,0-getScrollX(),0,400);
invalidate();
}
//打开menu
private void openMenu(){
scroller.startScroll(getScrollX(),0,-menuWidth-getScrollX(),0,400);
invalidate();
}
/**
* Scroller不主动去调用这个方法
* 而invalidate()可以调用这个方法
* invalidate->draw->computeScroll
*/
public void computeScroll(){
super.computeScroll();
if(scroller.computeScrollOffset()){
//返回true,表示动画没结束
scrollTo(scroller.getCurrX(),0);
invalidate();
}
}
/**
* 切换菜单的开和关
*/
public void switchMenu(){
if(getScrollX()==0){
openMenu();
}else {
closeMenu();
}
}
}
样式中使用侧滑容器
<com.example.demo1.SlideMenu
android:id="@+id/slide_menu"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 包含菜单界面-->
<include layout="@layout/slide_menu"/>
<!-- 包含主界面-->
<include layout="@layout/slide_main" />
</com.example.demo1.SlideMenu>
java文件中调用侧滑函数
//对头像设置监听
mIvHead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
slideMenu.switchMenu(); //监测到动作,执行侧滑
}
});
10. 多按钮跳转
//对多个按钮同时开启监听
private void setListener(){
OnClick onClick = new OnClick();
//对每个按钮设置监听
mBtnScan.setOnClickListener(onClick); //参数是一个OnClickListener对象,执行的是对象里的onClick函数
mBtnCheck.setOnClickListener(onClick);
mBtnExit.setOnClickListener(onClick);
}
//创建实现了View.OnClickListener接口的类
private class OnClick implements View.OnClickListener {
//在类中重写onClick函数,根据不同的控件id,装载不同的跳转动作
@Override
public void onClick(View v) {
Intent intent = null;
int id = v.getId();
if (id == R.id.btn_scan) {
intent = new Intent(SlideActivity.this, Scan.class);
} else if (id == R.id.btn_check) {
intent = new Intent(SlideActivity.this, Check.class);
} else if (id == R.id.btn_exit) {
intent = new Intent(SlideActivity.this, ExitActivity.class);
}
startActivity(intent); //最后开启跳转
}
}
11.Scrollview
12.单选框和复选框
单选框
mRG1 = findViewById(R.id.rg_1);
mRG1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
RadioButton radioButton = radioGroup.findViewById(i); //当前选择的项
ToastUtil.showMsg(Scan.this,radioButton.getText().toString());
}
});
复选框
mCb1 = findViewById(R.id.cb_1);
mCb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { //监听复选框选项是否变动
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) { //b:指示当前框是否被选中
ToastUtil.showMsg(Check.this,b?"火锅被选中":"火锅未选中");
}
});
13. RecyclerView和Adapter写法
14.无尽的报错
动态添加表格报错:原来是要添加的布局没有赋值!!
gradle-xx-bin文件路径
C:\Users\admin.gradle\wrapper\dists
gradle version选择
代理选择
重开解决问题:
删除 .idea文件,重新运行项目
15. sqlite数据库
安装数据库插件