02 java ---- Android 基础app开发
目录
相对布局
显示一个美女
显示两个美女
安卓APP启动过程
安卓布局控件
常用布局之相对布局
常用布局之相对布局
padding和margin
按键美化
常用布局之线性布局
安卓按键响应的几种方式
直接设置按键的onClick绑定的函数
自定义类实现按键监听事件的接口
匿名内部类实现按键响应
mainActivity实现了oclick接口
页面跳转
如何跳转 Intent 配合onclick
如何传参 方式一 直接putExtra传参数
如何传参 方式二 通过Bundle搭配putExtras
安卓线程
Activity(页面)的生命周期 面试常考点
安卓网络编程
javaSocket服务端开发
JavaSocket 客户端开发:
安卓app中创建客户端连接java服务器
不能通过除UI外的线程去改变UI的控件 public TextView textview;
倒计时 Handler 、TextView、Message、 handler.sendMessage(msg);
socket客户端和按键显示输入输出流
网页创建 注意权限问题
智能家居页面
asserts: 存放一些资源,配置文件,图片
bin: 编译后会生成的一些文件,包括我们关心的apk
lib: 依赖库
res:
drawable:存放app程序要用到的一些图片
layout: 存放局文件的文件夹一般一个activity(安卓页面)对应一个布局
values: 存放一些参数,或者自定义控件的文件
AndroidMainfirst.xml: APP的配置权限:网络访问权限,名片夹访问权限,相机访问权限
目标机器SDK版本:APP的名字APP的图标 配置第一个被加载,启动页面
Laucher->mainifirst(执行数据初始化)->lauch(当app被按下)标签的activity被加载->oncreat被调用->java关联xml布局页面->显示->等待用户触摸等操作
相对布局
除了布局容器,您还可以使用布局属性来控制视图的布局行为,例如:
显示一个美女
控件的宽度
android:layout_width="match_parent"
控件的高度
android:layout_height="match_parent"
显示两个美女
相对布局 引入安卓的库和工具
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent" 布局宽度 自适应android:layout_height="match_parent" 布局高度 自适应tools:context=".MainActivity" > <布局头><RelativeLayout 布局android:id="@+id/girl" 布局一个位置idandroid:layout_width="wrap_content"布局宽android:layout_height="300dp" 布局高300分辨率android:background="@drawable/girl" 布局背景为grawable下的girl图片/> /关闭布局<RelativeLayout android:layout_below = "@id/girl" 在这个布局位置的下面android:layout_width = "wrap_content"android:layout_height="300dp"android:background= "@drawable/girl2"/></RelativeLayout> <布局尾>
RelativeLayout中子控件常用属性:
1、相对于父控件,例如:android:layout_alignParentTop=“true”
android:layout_alignParentTop 控件的顶部与父控件的顶部对齐;
android:layout_alignParentBottom 控件的底部与父控件的底部对齐;
android:layout_alignParentLeft 控件的左部与父控件的左部对齐;
android:layout_alignParentRight 控件的右部与父控件的右部对齐;
//给定id位置的四周位置
android:layout_above 控件的底部置于给定ID的控件之上;
android:layout_below 控件的底部置于给定ID的控件之下;
android:layout_toLeftOf 控件的右边缘与给定ID的控件左边缘对齐;
android:layout_toRightOf 控件的左边缘与给定ID的控件右边缘对齐;
//给定id位置的内部上下左右
android:layout_alignBaseline 布局顶部上线对齐
android:layout_alignTop 控件的顶部边缘上线对齐
android:layout_alignBottom 控件的底部边缘下线对齐
android:layout_alignLeft 控件的左边缘与给定ID的左边缘对齐;
android:layout_alignRight 控件的右边缘与给定ID的右边缘对齐;
3、居中,例如:android:layout_centerInParent=“true”
android:layout_centerHorizontal 水平居中;
android:layout_centerVertical 垂直居中;
android:layout_centerInParent 父控件的中央;
RelativeLayout中子控件常用属性:
1、相对于父控件,例如:android:layout_alignParentTop=“true”
android:layout_alignParentTop 控件的顶部与父控件的顶部对齐;
android:layout_alignParentBottom 控件的底部与父控件的底部对齐;
android:layout_alignParentLeft 控件的左部与父控件的左部对齐;
android:layout_alignParentRight 控件的右部与父控件的右部对齐;
//给定id位置的四周位置
android:layout_above 控件的底部置于给定ID的控件之上;
android:layout_below 控件的底部置于给定ID的控件之下;
android:layout_toLeftOf 控件的右边缘与给定ID的控件左边缘对齐;
android:layout_toRightOf 控件的左边缘与给定ID的控件右边缘对齐;
//给定id位置的内部上下左右
android:layout_alignBaseline 布局顶部上线对齐
android:layout_alignTop 控件的顶部边缘上线对齐
android:layout_alignBottom 控件的底部边缘下线对齐
android:layout_alignLeft 控件的左边缘与给定ID的左边缘对齐;
android:layout_alignRight 控件的右边缘与给定ID的右边缘对齐;
3、居中,例如:android:layout_centerInParent=“true”
android:layout_centerHorizontal 水平居中;
android:layout_centerVertical 垂直居中;
android:layout_centerInParent 父控件的中央;
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><!-- 在中间创建一个页面 --><RelativeLayoutandroid:layout_width="300dp"android:layout_height="120dp"android:background="#00ff00"android:layout_centerInParent="true"><!-- 在这个页面中创建字符串 id位置 宽 高 大小 颜色 内容 --><TextViewandroid:id="@+id/usr1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="30dp"android:textColor="#ffffff"android:text="用户:"/><!-- 在这个页面中创建一个文本框 id位置 宽 高 在usr1的右边 --><EditText android:id="@+id/kuang1"android:layout_width="250dp"android:layout_height="40dp"android:layout_toRightOf="@id/usr1"/><!-- 在这个页面中创建字符串 id位置 宽 高 大小 颜色 内容 --><TextViewandroid:id="@+id/passwd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="30dp"android:textColor="#ffffff"android:text="密码:"android:layout_below="@id/usr1"/><!-- 在这个页面中创建一个文本框 id位置 宽 高 在usr2的右边 在kuang1的下面 --> <EditText android:id="@+id/kuang2"android:layout_width="250dp"android:layout_height="40dp"android:layout_toRightOf="@id/passwd"android:layout_below="@id/kuang1"/><!-- 在这个页面中创建按键 id位置 宽 高 大小 在kuang2下面 父控件右边 内容 --><Button android:id="@+id/anjian1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/kuang2"android:layout_alignParentRight="true"android:text="取消"/><!-- 在这个页面中创建字符串 id位置 宽 高 大小 在kuang2下面 按键1左边 passwd右边内容 --><Button android:id="@+id/anjian1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/kuang2"android:layout_toLeftOf="@id/anjian1"android:layout_toRightOf="@id/passwd"android:text="确认"/></RelativeLayout></RelativeLayout>
外边距可以设置为正值、负值或百分比。
外边距可以用来控制元素之间的间距、对齐元素、扩展元素的可点击区域等。
外边距不会影响元素的背景颜色或边框。
android:layout_margin:本组件离上下左右各组件的外边距。
android:layout_marginStart:本组件离开始的位置的外边距。
android:layout_marginEnd:本组件离结束位置的外边距。
android:layout_marginBottom:本组件离下部组件的外边距。
android:layout_marginTop:本组件离上部组件的外边距。
android:layout_marginLeft:本组件离左部组件的外边距。
android:layout_marginRight:本组件离右部组件的外边距
-
安卓APP启动过程
-
安卓布局控件
android:layout_width
和android:layout_height
:设置视图的宽度和高度。android:layout_margin
:设置视图的外边距。android:layout_padding
:设置视图的内边距。android:layout_gravity
:设置视图在布局容器中的对齐方式。android:layout_weight
:定义视图在线性布局中的权重,用于实现灵活的伸缩布局。- android:background="#ff0000" 设置背景颜色 #代表十六进制 ff红色 00 00 红绿蓝三基色
-
常用布局之相对布局
- 相对给定Id控件,例如:android:layout_above=“@id/**”
-
常用布局之相对布局
- 相对给定Id控件,例如:android:layout_above=“@id/**”
-
padding和margin
-
内边距(padding):内边距定义了元素的内容与其边框之间的空白区域。
内边距可以设置为正值、负值或百分比。
内边距可以用来控制元素内容与边框之间的间距、增加元素的可点击区域等。
内边距会影响元素的背景颜色。android:padding:为组件的四边设置相同的内边距。
android:paddingLeft:为组件的左边设置内边距。
android:paddingRight:为组件的右边设置内边距。
android:paddingTop:为组件的上边设置内边距。
android:paddingBottom:为组件的下边设置内边距。
-
按键美化
参考博文
- https://blog.csdn.net/tracydragonlxy/article/details/88552262
代码块
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_shopping_menu"tools:context=".MainActivity" ><RelativeLayoutandroid:id="@+id/relativeLayout1"android:layout_width="wrap_content"android:layout_height="50dp"android:background="#ff99cc" ><TextViewandroid:id="@+id/smartHome"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:layout_marginTop="8dp"android:textSize="18dp"android:text="prppr -- 智能家居页面" /><Buttonandroid:id="@+id/bnt2ZhuCe"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:text="注册" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_toLeftOf="@id/bnt2ZhuCe"android:layout_alignParentTop="true"android:layout_marginRight="10dp"android:text="查询信息" /></RelativeLayout><RelativeLayoutandroid:id="@+id/minAction"android:layout_width="90dp"android:layout_height="70dp"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:background="@drawable/pic_rf" /><RelativeLayoutandroid:id="@+id/car"android:layout_width="60dp"android:layout_height="40dp"android:layout_alignLeft="@+id/minAction"android:layout_centerVertical="true"android:layout_marginLeft="60dp"android:background="@drawable/card" /><Buttonandroid:id="@+id/bnt1Shuaka"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@id/minAction"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="15dp"android:background="@drawable/btn_selector"android:text="刷卡" /></RelativeLayout>
-
常用布局之线性布局
常用且易错 api
android:layout_weight="1" 权重1分配占比 看是水平还是垂直布局相对应width和height为0dp
android:layout_width="match_parent" 用于指定一个 View 或布局应该与其父容器的大小匹配。 android:layout_width="wrap_content
" 是使视图的宽度或高度根据内容的实际尺寸来动态调整
android:gravity="center" 是用于控制视图内部内容的对齐方式。它可以应用于诸如 TextView、Button 等具有文本内容的视图,以确定文本在视图内部的对齐方式。例如,使用 android:gravity="center"
可以使文本在视图中水平和垂直方向上都居中显示。
android:layout_gravity="" 用于控制视图在其父布局中的对齐方式。它可以影响视图在父布局中水平和垂直方向上的位置。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_shopping_menu" tools:context=".MainActivity" ><!-- 在中间创建线性布局 水平布局 --><LinearLayout android:layout_width="280dp" android:layout_height="100dp"android:layout_centerInParent="true" android:orientation="horizontal" > <!-- 线性布局 占比例1 垂直方向布局 weight是权重 垂直方向heigh为0dp权重分配 --><LinearLayout android:layout_weight="1"android:layout_width="0dp"android:layout_height="100dp"android:orientation="vertical"><!-- 在这个垂直方向上分配三个字符串 match_parent匹配父组件发小wrap_content会自动分配 --><TextView android:layout_weight="1"android:layout_width="match_parent"android:layout_height="0dp"android:text="用户"android:gravity="center"/><!-- gravity组件子元素对齐方式 center中心对齐 --><TextView android:layout_weight="1"android:layout_width="match_parent"android:layout_height="0dp"android:text="登录"android:gravity="center" /><TextView android:layout_weight="1"android:layout_width="match_parent"android:layout_height="0dp"android:text="ID"android:gravity="center"/></LinearLayout> <!-- 注意相对布局和线性布局要注意关闭 --><LinearLayout android:layout_weight="5"android:layout_width="0dp"android:layout_height="100dp"android:orientation="vertical"><EditText android:layout_weight="1"android:layout_width="match_parent"android:layout_height="0dp"/><EditText android:layout_weight="1"android:layout_width="match_parent"android:layout_height="0dp"/><EditText android:layout_weight="1"android:layout_width="match_parent"android:layout_height="0dp"/></LinearLayout></LinearLayout></RelativeLayout>
使用
-
安卓按键响应的几种方式
-
setOnClickListener()
:是 View 类的一个方法,用于为 View 设置一个 OnClickListener。通过调用这个方法,可以将一个实现了 OnClickListener 接口的对象设置给需要监听点击事件的 View。当用户点击该 View 时,系统会调用 OnClickListener 中的onClick(View v)
方法。 -
OnClickListener:是一个接口,用于监听用户点击事件。它包含一个抽象方法
onClick(View v)
,需要在这个方法中编写点击事件的逻辑。通过实现 OnClickListener 接口,可以自定义点击事件的响应。 -
onClick(View v)
:是 View.OnClickListener 接口中的抽象方法,用于处理用户点击事件。当用户点击一个 View 时,系统会调用该方法,并将被点击的 View 作为参数传入。开发者需要实现这个方法,以执行自定义的点击事件逻辑 -
直接设置按键的onClick绑定的函数
//activity
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><!-- 以响应用户点击事件 电机button则调用main函数中"buttonBeOnclick" --><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="buttonBeOnclick" android:text="按键1" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_below="@+id/button1"android:layout_marginTop="93dp"// 以响应用户点击事件 电机button则调用main函数中"buttonBeOnclick"android:onClick="buttonBeOnclick" android:text="按键2" /></RelativeLayout>
//Mainactivity
package com.example.prppr.leren;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}// View 类似于通配符 名字叫v v.getId获取传过来v的idpublic void buttonBeOnclick(View v) {switch (v.getId()) {// 创建一个短暂的 Toast 弹窗,并显示文本 “按键一被按下// v的id是 R中的idR.id.button1 用于引用应用程序中的资源。// toast静态方法 this当前对象即 MainActivity 第二个参数是要显示内容,// 第三个参数是持续时间,0 表示 Toast.LENGTH_SHORT,即短暂的显示。//show() 方法是 Toast 类的方法,用于显示 Toast 弹窗case R.id.button1:Toast.makeText(this, "按键一被按下", 0).show();break;case R.id.button2:Toast.makeText(this, "按键二被按下", 0).show();break;}}}
-
自定义类实现按键监听事件的接口
package com.example.prppr;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;// 自定义的点击事件处理类,实现了View.OnClickListener接口 继承
class myOnclieckHandler implements View.OnClickListener{@Override//方法重写触控事件 有触控这日志输出 没用toast因为toast得调用主函数中public void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()){case R.id.button1://Toast.makeText(this, "按键一被按下", 0).show(); //没用toast因为toast得调用主函数中System.out.println("按键一被按下");break;case R.id.button2://Toast.makeText(this, "按键二被按下", 0).show();System.out.println("按键二被按下");break;}}}public class MainActivity extends Activity {//声明两个按键名Button bnt1;Button bnt2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 通过ID在布局中找到按钮1和按钮2bnt1 = (Button) findViewById(R.id.button1);bnt2 = (Button) findViewById(R.id.button2);// new myClickHandler() 来创建了一个 myClickHandler 的实例,并将其作为参数传递给 setOnClickListener//setOnClickListener 是 Button 类的一个方法,用于设置按钮的点击事件监听器。//它接受一个实现了 View.OnClickListener 接口的对象作为参数,以便在按钮被点击时调用相应的事件处理方法。bnt1.setOnClickListener(new myOnclieckHandler());bnt2.setOnClickListener(new myOnclieckHandler());}}
-
匿名内部类实现按键响应
//mainjava
package com.example.prppr.leren;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends Activity {Button bnt1;Button bnt2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bnt1 = (Button) findViewById(R.id.button1);bnt2 = (Button) findViewById(R.id.button2);//调用bnt1得方法 里面有个匿名内部类bnt1.setOnClickListener(new View.OnClickListener(){//匿名内部类@Override//匿名内部类中重写方法public void onClick(View v) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "按键一被按下", 0).show();}});bnt2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "按键二被按下", 0).show();}});}}
//xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="按键一" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/button1"android:layout_below="@+id/button1"android:layout_marginTop="71dp"android:text="按键二" /></RelativeLayout>
-
mainActivity实现了oclick接口
package com.example.prppr.leren;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;//继承这个接口的方法
public class MainActivity extends Activity implements View.OnClickListener {Button bnt1;Button bnt2;@Override// 重写 调用方法protected void onCreate(Bundle savedInstanceState) {// 调用父类得初始化super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 把组件按键初始化显示bnt1 = (Button) findViewById(R.id.button1);bnt2 = (Button) findViewById(R.id.button2);// 实现了 OnClickListener 接口的对象设置给需要监听点击事件的 View。// 当用户点击该 View 时,系统会调用 OnClickListener 中的 onClick(View v) 方法。bnt1.setOnClickListener(this);//this是MainActivitybnt2.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.button1:Toast.makeText(this, "按键一被按下", 0).show(); // 没用toast因为toast得调用主函数中System.out.println("按键一被按下");break;case R.id.button2:Toast.makeText(this, "按键二被按下", 0).show();System.out.println("按键二被按下");break;}}}
页面跳转
如何创建 右键new other 、Android activity 。。。。创建多个页面
如何跳转 Intent 配合onclick
//mainactivity
package com.example.prppr;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);} public void nextPage(View v){//onclick 函数按下按键时执行此函数// 创建一个对象 指定要从那跳转到哪里Intent intent = new Intent(this,TwoActivity.class);startActivity(intent);}
}
//layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="这是界面一" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignTop="@+id/textView1"android:layout_marginRight="16dp"android:onClick="nextPage"android:text="点击进入界面二" /></RelativeLayout>
如何传参 方式一 直接putExtra传参数
//传参数可以说字符串 数组 小数 ------发送方
package com.example.prppr;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void nextPage(View v){Intent intent = new Intent(this,TwoActivity.class);intent.putExtra("key_data", "杨浪很帅");//键值对 传参数startActivity(intent);}
}
//页面二收 打印
package com.example.prppr;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;public class TwoActivity extends Activity {public String data1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_two);Intent itwo = getIntent();//获取 Intent 对象 实例化data1 = itwo.getStringExtra("key_data");//根据键值对 赋值内容 注意类型Toast.makeText(this, "收到数据:"+data1, 0).show();//显示并打印出来}public void nextPage(View v){Intent intent = new Intent(this,ThreeActivity.class);intent.putExtra("key_data","good lucky!!");//传给页面三startActivity(intent);
}}
如何传参 方式二 通过Bundle搭配putExtras
//页面二传到页面三
package com.example.prppr;import android.app.Activity;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;public class TwoActivity extends Activity {public String data1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_two);//页面1到二时 获取Intent 根据键值对 输出内容显示在屏幕上Intent itwo = getIntent();//获取 Intent 对象 实例化data1 = itwo.getStringExtra("key_data");//根据键值对 赋值内容 注意类型Toast.makeText(this, "收到数据:"+data1, 0).show();//显示并打印出来}public void nextPage(View v){//在页面二按下按键时 配置好bundle内容 和跳转页面 传过去在页面三中接收显示Intent intent = new Intent(this,ThreeActivity.class);//实例化Bundle bunble = new Bundle();bunble.putString("MyData", "杨浪咯咯咯咯咯");//填充内容bunble.putInt("ID", 100);intent.putExtras(bunble);//放进去startActivity(intent);//开始}
}
//页面三接收
package com.example.prppr;import java.io.ObjectOutputStream.PutField;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;public class ThreeActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_three);Intent intent = this.getIntent ();Bundle bundle = intent.getExtras();String datas = bundle.getString("MyData");int datai = bundle.getInt("ID");Toast.makeText(this, "获取到:"+datas +datai, 0).show();}
}
-
安卓线程
实现页面的诺干秒后的自动跳转效果
run方法(函数)是线程要做的”事情”,相当linuxC线程的回调函数
启动线程
//界面一线程延时三秒后自动跳转
//必须新建线程 否则会跟ui界面的线程冲突 并且使用try和catch
package com.example.prppr;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Thread t = new Thread(new Runnable() { //实例化线程和线程中的匿名类对象 并重写执行run方法@Overridepublic void run() { //重写并执行方法// TODO Auto-generated method stubtry {Thread.sleep(3000);//可能异常所以try catchIntent intent = new Intent(MainActivity.this,TwoActivity.class);intent.putExtra("key_data","浪滚滚");startActivity(intent);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});t.start();}// public void nextPage(View v){
// Intent intent = new Intent(this,TwoActivity.class);
// intent.putExtra("key_data", "杨浪很帅");//键值对 传参数
// startActivity(intent);
// }
}
-
Activity(页面)的生命周期 面试常考点
package com.example.prppr;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);System.out.println("onCreat!!"); Thread t = new Thread(new Runnable() { //实例化线程和线程中的匿名类对象 并重写执行run方法@Overridepublic void run() { //重写并执行方法// TODO Auto-generated method stubtry {Thread.sleep(3000);//可能异常所以try catchIntent intent = new Intent(MainActivity.this,TwoActivity.class);intent.putExtra("key_data","浪滚滚");startActivity(intent);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});t.start();}@Overrideprotected void onStart() {//开始时打印日志// TODO Auto-generated method stubSystem.out.println("onStart");Toast.makeText(this, "onStart", 0).show();//显示并打印出来super.onStart();}@Overrideprotected void onResume() {//运行时打印日志// TODO Auto-generated method stubSystem.out.println("onResume");Toast.makeText(this, "onResume", 0).show();//显示并打印出来super.onResume();}@Overrideprotected void onPause() {//锁住时打印// TODO Auto-generated method stubSystem.out.println("onPause");Toast.makeText(this, "onPause", 0).show();//显示并打印出来super.onPause();}@Overrideprotected void onStop() {// TODO Auto-generated method stubSystem.out.println("onStop");Toast.makeText(this, "onStop", 0).show();//显示并打印出来super.onStop();}
}
-
安卓网络编程
javaSocket服务端开发
//单个单次socket连接
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.StringReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;public class Server {public static void main(String[] args) {byte[] data = new byte[128];int len;try {//创建socket套接字和端口号ServerSocket server = new ServerSocket(8888);System.out.println("socket创建成功");//根据socket创建连接套接字Socket c_fd = server.accept();System.out.println("accept连接成功");//根据连接获取数据流 并创建数据套接字InputStream msg = c_fd.getInputStream();//根据数据流读取内容大豆data数组中 len长度len = msg.read(data);//打印数据 //字节数组 data 转换为字符串的方式之一。String格式 哪里开始 长度System.out.println("获取到内容:" + new String(data, 0, len));} catch (IOException e) {e.printStackTrace();}}}
多连接
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) { try {// 1 创建socket套接字和端口号ServerSocket server = new ServerSocket(8888);System.out.println("socket创建成功");while(true){ // 2 不断阻塞连接//根据socket创建连接套接字final Socket c_fd = server.accept();System.out.println("accept连接成功");new Thread(new Runnable() { // 3 连接上一个就新建一个线程对接读取数据 // 实例化线程 钩爪方法 中重写方法并执行 防止异常错误trypublic void run() {try {byte[] data = new byte[128];int len;//根据连接获取数据流 并创建数据套接字InputStream msg;msg = c_fd.getInputStream();//根据数据流读取内容大豆data数组中 len长度len = msg.read(data);//打印数据 //字节数组 data 转换为字符串的方式之一。String格式 哪里开始 长度System.out.println("获取到内容:" + new String(data, 0, len));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}} catch (IOException e) {e.printStackTrace();}}}
JavaSocket 客户端开发:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class Client {public static void main(String[] args) {try {//实例化客户端连接Socket client = new Socket("172.16.107.146",8889);//连接上 捕获输出流 返回套接字c_fdOutputStream c_fd = client.getOutputStream();//捕获按键输入 存放到msg中Scanner sc = new Scanner(System.in);String msg = sc.next();//通过输出流方法 以beyes类型发送c_fd.write(msg.getBytes());}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
//客户端实现收和发
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) {try {//实例化客户端连接Socket client = new Socket("172.16.106.130",8883);//连接上 捕获输出流 返回套接字c_fdOutputStream out = client.getOutputStream();//捕获按键输入 存放到msg中Scanner sc = new Scanner(System.in);String msg = sc.next();//通过输出流方法 以beyes类型发送out.write(msg.getBytes());int len;byte[] datas = new byte[128];//客户端捕获输入流InputStream in = client.getInputStream();//读取输入流存放到datas里len = in.read(datas);System.out.println("客户端获取到数据:"+new String(datas,0,len));}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
安卓app中创建客户端连接java服务器
模拟器----安卓ip和 服务器端必须是在同一个网段 可通过驱动桥接模式
//java服务器端 while不断等待连接 创建线程对接处理数据
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) { try {// 1 创建socket套接字和端口号ServerSocket server = new ServerSocket(8999);System.out.println("socket创建成功");while(true){ // 2 不断阻塞连接//根据socket创建连接套接字final Socket c_fd = server.accept();System.out.println("accept连接成功");new Thread(new Runnable() { // 3 连接上一个就新建一个线程对接读取数据 // 实例化线程 钩爪方法 中重写方法并执行 防止异常错误trypublic void run() {try {byte[] data = new byte[128];int len;//根据连接获取数据流 并创建数据套接字InputStream msg;msg = c_fd.getInputStream();//根据数据流读取内容大豆data数组中 len长度len = msg.read(data);//打印数据 //字节数组 data 转换为字符串的方式之一。String格式 哪里开始 长度System.out.println("获取到内容:" + new String(data, 0, len));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}} catch (IOException e) {e.printStackTrace();}}}
//安卓app客户端
package com.example.socket_androidapp;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void sendMessageHandler(){try {//实例化客户端连接Socket client = new Socket("172.20.10.4",8999);//主义ip地址!!!本地ip地址//连接上 捕获输出流 返回套接字c_fdOutputStream c_fd = client.getOutputStream();String msg = "message form Client";//通过输出流方法 以beyes类型发送c_fd.write(msg.getBytes());}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void sendMessage(View v){Toast.makeText(MainActivity.this, "按键按下", 0).show();new Thread(new Runnable() {public void run() {sendMessageHandler();}}).start();}}
客户端不同连接服务器--方向
//把sendMessageHandler封装在NetUtils这个包中 函数要Staticpackage com.example.socket_androidapp;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import com.example.socket_androidapp_NetUtils.NetUtils;//导入连接网络 创建线程对接的包public class MainActivity extends Activity {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void sendMessage(View v){switch(v.getId()){//解析是哪个按键按下 调用这个包中的类并传递参数过去case R.id.goForword:NetUtils.sendMessageHandler("goForword");break;case R.id.goBack:NetUtils.sendMessageHandler("goBack");break; case R.id.goLeft:NetUtils.sendMessageHandler("goLeft");break;case R.id.goRight:NetUtils.sendMessageHandler("goRight");break;}}}
//网络连接部分 封装包class
package com.example.socket_androidapp_NetUtils;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class NetUtils {public static void sendMessageHandler(final String command){new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {//实例化客户端连接Socket client = new Socket("172.20.10.4",7888);//连接上 捕获输出流 返回套接字c_fdOutputStream c_fd = client.getOutputStream();//通过输出流方法 以beyes类型发送c_fd.write(command.getBytes());}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}
}
不能通过除UI外的线程去改变UI的控件 public TextView textview;
//不能通过除UI线程外的线程去控制UI控件package com.example.prppr;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class MainActivity extends Activity {public TextView textview;// 1 初始化创建@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textview = (TextView) findViewById(R.id.show1); // 2 找到这个控建id} public void testFunc(View v){//必须加View 否则会程序异常退出 因为按键无法绑定new Thread(new Runnable() { // 3 创建线程@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 0; i < 10; i++) {textview.setText("hello ,world!!---"+i);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}}
倒计时 Handler 、TextView、Message、 handler.sendMessage(msg);
package com.example.prppr;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;public class MainActivity extends Activity {public TextView textView;//接收TextView组件idpublic Handler handler; //handler函数实例化等待信息 handlerMessage 等待电话 收到电话则处理@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.TextView1);//强转类型handler = new Handler(){//得选带括号的@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);textView.setText(""+msg.what + "s");}};}public void funcHandler(View v){//没用view的话会异常new Thread(new Runnable() { //创建线程 在线程中 循环打印 并延时@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 10; i >= 0; i--) {Message msg = new Message(); //实例化Message 用来存放东西msg.what = i;handler.sendMessage(msg); //通过handler的发送函数把message发送出去try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}
}
socket客户端和按键显示输入输出流
//xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000000"tools:context=".MainActivity" ><Button android:id="@+id/bnt1"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="changeDatas"android:text="按键"/><TextViewandroid:id="@+id/TextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:textSize="35dp"android:textColor="#ffffff"android:text="@string/hello_world" /></RelativeLayout>
//main
package com.example.socket.prppr;import NetUtils.NetUtils;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;public class MainActivity extends Activity {public TextView textView;public Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = (TextView) findViewById(R.id.TextView);//获取到数据输入流时调用 handler.sendMessage(msg);会执行handlermessagehandler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);//获取到msg 把msg中bundler赋值给bundle bundle中的字符串赋值给String 通过setText显示在主屏幕中Bundle bundle = msg.getData();String string = bundle.getString("msg");textView.setText(string);}};}//按键按下 把参数传过去 并连接socket网络获取数据输出流 用handler和message来处理数据输入流public void changeDatas(View v){switch(v.getId()){case R.id.bnt1:NetUtils.sendMessageHandler("goForwd",handler);break;}}}
//net网络连接 数据处理细节
package NetUtils;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;public class NetUtils {public static void sendMessageHandler(final String command,final Handler handler){new Thread(new Runnable() {public void run() {// TODO Auto-generated method stubtry { //连接网络Socket client = new Socket("172.20.10.4",8999);//数据输出流OutputStream outMessage = client.getOutputStream(); outMessage.write(command.getBytes());//数据输入流 利用bundle存放输入流数据 用message和handle把数据发送到handlerInputStream inMessage = client.getInputStream();int len;byte[] rcvDatas = new byte[128]; len = inMessage.read(rcvDatas);//获取输入流数据 转换成字符串String string = new String(rcvDatas,0,len);//实例化message 用来存放bundleMessage msg = new Message();//实例化bundleBundle b = new Bundle();//bundle中绑定字符串 键值为msg 内容为stringb.putString("msg", string);//把bundler的内容放到msg中msg.setData(b);//发送msg到handler.messagehandler.sendMessage(msg);} catch (IOException e) {e.printStackTrace();}}}).start();}
}
网页创建 注意权限问题
参考博文 Android WebView 的使用(超详细用法)_webview实现_wt-cai的博客-CSDN博客
//main
package com.example.prppr;import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.TextView;public class MainActivity extends Activity {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final WebView we = (WebView) findViewById(R.id.we);final EditText ed = (EditText) findViewById(R.id.ed); //WebViewClient 用于处理 WebView 中发生的各种事件,例如页面加载和链接点击等//创建一个新的 WebViewClient 对象并将其传递给 setWebViewClient() //方法来将其设置为 WebView 的 WebViewClientwe.setWebViewClient(new WebViewClient());//通过实现 OnEditorActionListener 接口的匿名类来实现监听器//并在 onEditorAction() 方法内获取 EditText 中的文本内容,并将其作为 URL 加载到 WebView 中//监听器返回的布尔值表示该事件是否已被处理。这里判断按下的按键是否是回车键,并返回相应结果ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView arg0, int arg1, KeyEvent event) {// TODO Auto-generated method stubString string = ed.getText().toString();//把回车的内容转换成字符串赋值给stringwe.loadUrl(string);//然后进入这个网页return (event.getKeyCode() == KeyEvent.KEYCODE_ENTER);}});}
}
//xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><LinearLayout android:id="@+id/li1"android:layout_width="match_parent"android:layout_height="wrap_content" ><EditText android:id="@+id/ed"android:layout_width="match_parent"android:layout_height="match_parent"android:hint="请输入网址"/></LinearLayout><WebViewandroid:layout_below="@id/li1"android:id="@+id/we"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_marginLeft="24dp" /></RelativeLayout>
智能家居页面
注意权限问题 、调整主页面和欢迎页面的顺序
//欢迎页面 main
package com.example.prppr;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;public class WelcomeActivity extends Activity {//声明一个文字 和一个handler处理函数public TextView textView;public Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_welcome);//文字找到 文字对应idtextView = (TextView) findViewById(R.id.textView1);//当线程中handler.sendMessage时会调用handlerMessage处理函数 在里面打印文字 防止和ui界面冲突handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);textView.setText(msg.what + "s");}};//创建线程 格式new Thread(new Runable){}.start;new Thread(new Runnable() {public void run() {for (int i = 5; i >= 0; i--) {//创建一个message存放信息通过handler发送过去处理Message message = new Message();message.what = i;handler.sendMessage(message);//try可能异常try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//刷新三秒后跳转页面到MainActivity.class 开始Intent intent = new Intent(WelcomeActivity.this,MainActivity.class);startActivity(intent);}}).start();}}
//欢迎页面 xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/welcome"tools:context=".WelcomeActivity" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:textSize="23dp"android:layout_margin="26dp"android:textColor="#ffffff"/></RelativeLayout>
//main
package com.example.prppr;import NetUtils.Package.NetUtils;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;public class MainActivity extends Activity {//声明一个网页!!网页要注意权限public WebView we;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//找到一个网页id 显示网页填入网页地址 跳过默认浏览器网页we = (WebView) findViewById(R.id.webView1);we.loadUrl("https://blog.csdn.net/prppr_?type=blog");we.setWebViewClient(new WebViewClient());}//通过onClick按下按键时跳转到这里 根据v.getid解析是哪个id 调用NetUtils类中的函数//并把字符串传过去,通过socket连接ip和端口后 数据输出流 发送数据public void sendMsg(View v){switch(v.getId()){//调用NetUtils中的包case R.id.bnt1: NetUtils.sendMessageHandler("SO");break;//开二楼灯case R.id.bnt2: NetUtils.sendMessageHandler("BO");break;//开浴室灯case R.id.bnt3: NetUtils.sendMessageHandler("LO");break;//开客厅灯case R.id.bnt4: NetUtils.sendMessageHandler("RO");break;//开餐厅灯case R.id.bnt5: NetUtils.sendMessageHandler("aO");break;//灯全开case R.id.bnt6: NetUtils.sendMessageHandler("SC");break;//关二楼灯case R.id.bnt7: NetUtils.sendMessageHandler("BC");break;//关浴室灯case R.id.bnt8: NetUtils.sendMessageHandler("LC");break;//关客厅灯case R.id.bnt9: NetUtils.sendMessageHandler("RC");break;//关餐厅灯case R.id.bnt10: NetUtils.sendMessageHandler("aC");break;//关闭所有灯case R.id.bnt11: NetUtils.sendMessageHandler("fO");break;//开启人脸识别}};
}
//调用网络部分
package NetUtils.Package;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class NetUtils {public static void sendMessageHandler(final String command){new Thread(new Runnable() {public void run() {// TODO Auto-generated method stubtry {//连接服务器Socket client = new Socket("172.20.10.2",8887);//连接后发送数据流OutputStream outMsg = client.getOutputStream();//发送数据outMsg.write(command.getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();
};}
//xml页面部分
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg"tools:context=".MainActivity" ><WebViewandroid:id="@+id/webView1"android:layout_width="280dp"android:layout_height="170dp"android:layout_centerHorizontal="true"android:layout_marginTop="164dp"/><LinearLayout android:id="@+id/wenShiHuo"android:layout_width="355dp"android:layout_height="120dp"android:layout_below="@id/webView1"android:layout_centerHorizontal="true"android:orientation="horizontal"><LinearLayout android:layout_weight="1"android:layout_width="0dp"android:layout_height="120dp"android:orientation="vertical"android:layout_marginLeft="75dp"android:padding="15dp"><TextView android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ffffff"android:textSize="16sp"android:text="温度:"/><TextView android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ffffff"android:textSize="16sp"android:text="湿度:"/><TextView android:layout_weight="1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ffffff"android:textSize="16sp" android:text="火警"/></LinearLayout><LinearLayoutandroid:layout_width="0dp"android:layout_height="120dp"android:layout_weight="1"android:orientation="vertical"android:padding="15dp" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="26°"android:textColor="#ffffff"android:textSize="16sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="78"android:textColor="#ffffff"android:textSize="16sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="监测"android:textColor="#ffffff"android:textSize="14sp" /></LinearLayout></LinearLayout>//第一排灯控制<Button android:id="@+id/bnt1"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/wenShiHuo"android:layout_marginLeft="35dp"android:background="@drawable/btn_selector"android:textSize="16sp"android:text="二楼开"android:onClick="sendMsg"/><Button android:id="@+id/bnt2"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/wenShiHuo"android:layout_marginLeft="95dp"android:background="@drawable/btn_selector"android:textSize="16sp"android:onClick="sendMsg"android:text="浴室开"/><Button android:id="@+id/bnt3"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/wenShiHuo"android:layout_marginLeft="155dp"android:background="@drawable/btn_selector"android:textSize="16sp"android:onClick="sendMsg" android:text="客厅开"/><Button android:id="@+id/bnt4"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/wenShiHuo"android:layout_marginLeft="215dp"android:background="@drawable/btn_selector"android:textSize="16sp"android:onClick="sendMsg" android:text="餐厅开"/><Button android:id="@+id/bnt5"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/wenShiHuo"android:layout_marginLeft="275dp"android:background="@drawable/btn_selector"android:textSize="16sp"android:onClick="sendMsg" android:text="灯全开"/>//第二排灯控制<Button android:id="@+id/bnt6"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/bnt1"android:layout_marginLeft="35dp"android:background="@drawable/btn_selector"android:layout_marginTop="15dp"android:textSize="16sp"android:text="二楼关"android:onClick="sendMsg"/><Button android:id="@+id/bnt7"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/bnt2"android:layout_toRightOf="@id/bnt6"android:layout_marginLeft="5dp"android:background="@drawable/btn_selector"android:layout_marginTop="15dp"android:textSize="16sp"android:onClick="sendMsg"android:text="浴室关"/><Button android:id="@+id/bnt8"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/bnt3"android:layout_toRightOf="@id/bnt7"android:layout_marginLeft="5dp"android:background="@drawable/btn_selector"android:layout_marginTop="15dp"android:textSize="16sp"android:onClick="sendMsg"android:text="客厅关"/><Button android:id="@+id/bnt9"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/bnt4"android:layout_toRightOf="@id/bnt8"android:layout_marginLeft="5dp"android:background="@drawable/btn_selector"android:layout_marginTop="15dp"android:textSize="16sp"android:onClick="sendMsg"android:text="餐厅关"/><Button android:id="@+id/bnt10"android:layout_width="55dp"android:layout_height="27dp"android:layout_below="@id/bnt5"android:layout_toRightOf="@id/bnt9"android:layout_marginLeft="5dp"android:background="@drawable/btn_selector"android:layout_marginTop="15dp"android:textSize="16sp"android:onClick="sendMsg"android:text="灯全关"/><Buttonandroid:id="@+id/bnt11"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/bnt6"android:layout_marginTop="20dp"android:layout_centerHorizontal="true"android:onClick="sendMsg"android:text="人脸识别检测" /></RelativeLayout>
相关文章:
02 java ---- Android 基础app开发
目录 相对布局 显示一个美女 显示两个美女 安卓APP启动过程 安卓布局控件 常用布局之相对布局 常用布局之相对布局 padding和margin 按键美化 常用布局之线性布局 安卓按键响应的几种方式 直接设置按键的onClick绑定的函数 自定义类实现按键监听事件的接口 匿名内…...
鲁棒性与稳定性区别
鲁棒性 所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性粗携。 稳定性 所谓“稳定性”,是指控制系统在使它偏离平衡状态的扰动作用消失后,返回原来平衡状…...
C++项目实战——基于多设计模式下的同步异步日志系统-⑦-日志输出格式化类设计
文章目录 专栏导读日志格式化类成员介绍patternitems 格式化子项类的设计抽象格式化子项基类日志主体消息子项日志等级子项时间子项localtime_r介绍strftime介绍 源码文件名子项源码文件行号子项线程ID子项日志器名称子项制表符子项换行符子项原始字符串子项 日志格式化类的设计…...
Android---底部弹窗之BottomSheetDialog
BottomSheetDialog 是Android开发中的一个弹出式对话框,它从屏幕底部弹出并覆盖部分主界面。 1. BottomSheetDialog的使用 // 参数2:设置BottomSheetDialog的主题样式;将背景设置为transparent,这样我们写的shape_bottom_sheet_…...
Cesium 地球网格构造
Cesium 地球网格构造 Cesium原理篇:3最长的一帧之地形(2:高度图) HeightmapTessellator 用于从高程图像创建网格。提供了一个函数 computeVertices,可以根据高程图像创建顶点数组。 该函数的参数包括高程图像、高度数据的结构、网格宽高、…...
C++深度优化——cacheline测试
cacheline是内存调度的基本结构,其大小一般为32B或者64B。关于本机具体的配置信息可以在配置文件中看到: 这里可以看到我的这台机器的cacheline大小是64B。对于cacheline在多核处理器中有一个伪共享的状态,具体可以参考以下博客:高…...
【数字IC/FPGA】Verilog中的递归调用
参考文章 在Verilog2001中,模块的递归调用是可能的,引用下面的一段话(出自上面的参考文章) Many designers think that recursive techniques cannot be applied to hardware design. I’m not really sure where this misconception comes from. While it is true that i…...
禁用Win10自动更新
第一步,winr,输入 gpedit.msc 并回车,打开【组策略】 第二步,依次点击 管理模板->Windows组件->Windows更新 第三步,双击Windows更新,然后在设置中双击 指定 intranet Microsoft 更新服务位置 第…...
算法通关村-----动态规划高频问题
最少硬币数问题 问题描述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬…...
记一起小意外事件引起的批量重命名文件名
一、事件描述 某次,因某业务系统迁移,一线人员对业务目录误操作,执行打包命令过程中导致Tomcat下的web应用程序无法使用,检查后发现项目下所有文件名都加了gz格式;询问一线,发现是对项目目录执行了:gzip -r ./tomcat导致程序文件找不到;报错如下: 二、事件处理 1、查看…...
【Excel函数】Excel的Len函数求对象的字符数
在Excel中,LEN函数用于计算文本字符串中的字符数。它的语法如下。 LEN(text) 其中,text是要计算字符数的文本字符串。 例如,如果你想计算单元格A1中文本的字符数,可以使用以下公式: A2len(a1) 结果将返回单元格A1中文…...
小白备战大厂算法笔试(八)——搜索
搜索 二分查找 二分查找是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮减少一半搜索范围,直至找到目标元素或搜索区间为空为止。 Question: 给定一个长度为n的数组 nums ,元素按从小到大的顺序排列,数组…...
〔022〕Stable Diffusion 之 生成视频 篇
✨ 目录 🎈 视频转换 / mov2mov🎈 视频转换前奏准备🎈 视频转换 mov2mov 使用🎈 视频转换 mov2mov 效果预览🎈 视频无限缩放 / Infinite Zoom🎈 视频无限缩放 Infinite Zoom 使用 🎈 视频转换 /…...
网络安全深入学习第三课——热门框架漏洞(RCE—Struts2远程代码执行)
文章目录 一、Struts2框架介绍二、Struts2远程代码执行漏洞三、Struts2执行代码的原理四、Struts2框架特征五、漏洞手工POC六、漏洞工具复现 一、Struts2框架介绍 ------ Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网…...
【uni-app】
准备工作(Hbuilder) 1.下载hbuilder,插件使用Vue3的uni-app项目 2.需要安装编译器 3.下载微信开发者工具 4.点击运行->微信开发者工具 5.打开微信开发者工具的服务端口 效果图 准备工作(VScode) 插件 uni-cr…...
Pytorch 多卡并行(3)—— 使用 DDP 加速 minGPT 训练
前文 并行原理简介和 DDP 并行实践 和 使用 torchrun 进行容错处理 在简单的随机数据上演示了使用 DDP 并行加速训练的方法,本文考虑一个更加复杂的 GPT 类模型,说明如何进行 DDP 并行实战MinGPT 是 GPT 模型的一个流行的开源 PyTorch 复现项目ÿ…...
IAM、EIAM、CIAM、RAM、IDaaS 都是什么?
后端程序员在做 ToB 产品或者后台系统时,都不可避免的会遇到账号系统、登录系统、权限系统、日志系统等这些核心功能。这些功能一般都是以 SSO 系统、RBAC 权限管理系统等方式命名,但这些系统合起来有一个专有名词:IAM。 IAM IAM 是 Identi…...
STM32 Cubemx 通用定时器 General-Purpose Timers同步
文章目录 前言简介cubemx配置 前言 持续学习stm32中… 简介 通用定时器是一个16位的计数器,支持向上up、向下down与中心对称up-down三种模式。可以用于测量信号脉宽(输入捕捉),输出一定的波形(比较输出与PWM输出&am…...
Ubuntu 20.04降级clang-format
1. 卸载clang-format sudo apt purge clang-format 2. 安装clang-format-6.0 sudo apt install clang-format-6.0 3. 软链接clang-format sudo ln -s /usr/bin/clang-format-6.0 /usr/bin/clang-format...
激活函数总结(三十四):激活函数补充(FReLU、CReLU)
激活函数总结(三十四):激活函数补充 1 引言2 激活函数2.1 FReLU激活函数2.2 CReLU激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、Sof…...
【LeetCode-简单题KMP】459. 重复的子字符串
文章目录 题目方法一:移动匹配方法二:KMP算法 题目 方法一:移动匹配 class Solution {//移动匹配public boolean repeatedSubstringPattern(String s) {StringBuffer str new StringBuffer(s);//ababstr.append(s);//拼接一份自己 abababab…...
Lua脚本
基本语法 注释 print(“script lua win”) – 单行注释 – [[ 多行注释 ]] – 标识符 类似于:java当中 变量、属性名、方法名。 以字母(a-z,A-Z)、下划线 开头,后面加上0个或多个 字母、下划线、数字。 不要用下划线大写字母…...
vue 封装一个Dialog组件
基于element-plus封装一个Dialog组件 <template><section class"dialog-wrap"><el-dialog :title"title" v-model"visible" :close-on-click-modal"false"><section class"content-wrap"><Form…...
外包干了2个月,技术退步明显。。。。。
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
python科研作图
1、气泡图 气泡图是一种在xy轴上显示三个维度的数据的有效方式。在气泡图中,基本上,每个气泡代表一个数据点。横坐标和纵坐标的位置代表两个维度,气泡的大小则代表第三个维度。 在这个例子中,我们用numpy库生成了一些随机数据&a…...
视锥体裁剪射线的算法
射线Ray(直线情况)需要满足的条件: 在视野中显示的粗细均匀,需要分段绘制,每段的粗细根据到视野的距离计算射线model的顶点尽量少以节省性能损耗要满足条件2的话需要对射线进行裁剪,只绘制射线在视锥体内的部分,因此需要计算射线被视锥体裁剪后新的起点和终点 1. 计算三角…...
程序员在线周刊(投稿篇)
嗨,大家好!作为一名程序员,并且是一名互联网文章作者,我非常激动地向大家宣布,我们计划推出一份在线周刊,专门为程序员们提供有趣、实用的文章和资讯。而现在,我们正在征集投稿! 是…...
uniapp——实现聊天室功能——技能提升
这里写目录标题 效果图聊天室功能代码——html部分代码——js部分代码——其他部分 首先声明一点:下面的内容是从一个uniapp的程序中摘录的,并非本人所写,先做记录,以免后续遇到相似需求抓耳挠腮。 效果图 聊天室功能 发送图片 …...
脚本:用python实现五子棋
文章目录 1. 语言2. 效果3. 脚本4. 解读5. FutureReference 1. 语言 Python 无环境配置、无库安装。 2. 效果 以第一回合为例 玩家X 玩家0 3. 脚本 class GomokuGame:def __init__(self, board_size15):self.board_size board_sizeself.board [[ for _ in range(board_…...
Java-华为真题-预定酒店
需求: 放暑假了,小王决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>k>0)ÿ…...
wordpress主动提交百度/济南网络优化网站
今年9月10号华为开发者大会中,华为正式开源发布了鸿蒙os 2.0系统,鸿蒙终于开放给开发者,目前只能用来做指挥屏/手表/车机。华为手机版本的鸿蒙系统则要到今年的12月才提供。在9月10号我就去鸿蒙gitee上的开源代码库中参观,主要是看…...
做网站会用到什么语言/打开百度网址
1、先看一个例子,一个进程可以起多个线程,多个线程都共享这个线程的内存import threading import timenum 100 thread_lock threading.Lock()def add_func():global numprint("Begin--->",num)num - 1# thread_lock.release()#上面这段代…...
驻马店市住房和城乡建设局网站首页/北京seo服务销售
D3.js Canvas 绘制组织结构图 使用 D3.js 默认的 svg 渲染 D3默认的树状图画图使用的是svg, 比如这个来自D3作者的例子: https://bl.ocks.org/mbostock/... 使用svg有好有坏: 好处是方便操作dom元素, 添加用户交互坏处是渲染效率不高, 在数据量较大时页面易掉帧, 卡顿在大多数…...
怎么搭建网站后台/网络营销logo
一、查询yum版本: yum info yum 二、查询打算下载软件的信息,如: yum search redis 或者 yum list |grep redis...
建设专业网站的价格/新闻发稿平台
往期精选● 架构师高并发高性能分布式教程(4000G)● 39阶段精品云计算大数据实战视频教程● 互联网技术干货视频教程大全【菜单为准】● 2017年8月最新Intellij IDEA全套视频教程● 程序员如何制作高质量的简历【视频简历】● 两套大型电商实战项目 ● 200本经典编程相关…...
钟星建设集团网站/百度关键词排名靠前
一 般情况下,DBA能从监控mysql的状态列表中查看出数据库的运行端倪,需要注意的是STATUS所表示的不同内容。且需要注意的是TIME字段表示的 意思。它表示的只是最后那个STAT状态持续的时间。这个时间是有可能忽大忽小的。而不是SQL开始执行到现在的时间。单位时间是秒…...