5.相对布局RelativeLayout常用属性
----------------------------------------------------------------------
RelativeLayout用到的一些重要的属性:
第一类:属性值为true或false
android:layout_centerHrizontal 水平居中
android:layout_centerVertical 垂直居中
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop 贴紧父元素的上边缘
android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物
第二类:属性值必须为id的引用名“@id/id-name”
android:layout_below 在某元素的下方
android:layout_above 在某元素的的上方
android:layout_toLeftOf 在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
第三类:属性值为具体的像素值,如30dip,40px
android:layout_marginBottom 离某元素底边缘的距离
android:layout_marginLeft 离某元素左边缘的距离
android:layout_marginRight 离某元素右边缘的距离
android:layout_marginTop 离某元素上边缘的距离
----------------------------------------------------------------------
android:id —— 为控件指定相应的ID
android:text —— 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
android:textSize —— 指定控件当中字体的大小
android:background —— 指定该控件所使用的背景色,RGB命名法 #FFFFFF或@android:color/white
android:width —— 指定控件的宽度
android:height —— 指定控件的高度
android:sigleLine —— 如果设置为真的话,则将控件的内容只能在同一行当中进行显示
android:grivity —— 指定控件中的内容的基本位置,比如说居中,居右等位置
android:layout_gravity 控件本身相对于父视图的位置
//此属性值为带单位的数值 在所有视图中都可使用
android:padding —— 指定控件的四周的内部留出一定的空间
android:paddingLeft —— 指定控件的左边的内部留出一定的空间
android:paddingTop —— 指定控件的上边的内部留出一定的空间
android:paddingRight —— 指定控件的右边的内部留出一定的空间
android:paddingBottom —— 指定控件的下边的内部留出一定的空间
//此属性值为带单位的数值 在所有视图中都可使用
android:layout_margin—— 指定控件的四周的外部留出一定的空间
android:layout_marginLeft—— 指定控件的左边的外部留出一定的空间
android:layout_marginTop—— 指定控件的上边的外部留出一定的空间
android:layout_marginRight—— 指定控件的右边的外部留出一定的空间
android:layout_marginBottom—— 指定控件的下边的外部留出一定的空间
//此属性值为引用id 只能在相对布局中都可使用
android:layout_above 将该控件的底部与给定ID的控件之上部对齐
android:layout_below 将该控件的上部与给定ID的控件之下部对齐
android:layout_toLeftOf 将该控件的右与给定ID的控件之左边对齐
android:layout_toRightOf 将该控件的左边与给定ID的控件的右边对齐
//此属性值为引用id 只能在相对布局中都可使用
android:layout_alignTop 将该控件的上部与给定ID的控件之上部对齐
android:layout_alignBottom 将该控件的下部与给定ID的控件之下部对齐
android:layout_alignLeft 将该控件的左与给定ID的控件之左边对齐
android:layout_alignRight 将该控件的右边与给定ID的控件的右边对齐
android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐
//此属性值为引用id 只能在相对布局中都可使用
android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐
android:layout_alignParentLeft 如果该值为true,则将该控件的左边与父控件的左边对齐
android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐
android:layout_alignParentTop 如果该值为true,则将空间的顶部与父控件的顶部对齐
android:layout_centerHorizontal 如果值为真,该控件将被至于水平方向的中央
android:layout_centerInParent 如果值为真,该控件将被至于父控件水平方向和垂直方向的中央
android:layout_centerVertical 如果值为真,该控件将被至于垂直方向的中央
----------------------------------------------------------------------
相对布局综合演练——智能家居刷卡界面
6.美化按键
参考博文(
https://blog.csdn.net/tracydragonlxy/article/details/88552262)
在drawable-mdpi下新建3个xml文件
更改程序
btn_selector.xml
btn_normal.xml
btn_pressed.xml
7.线性布局
实现样式
代码
插入水平线
代码
8.按键响应的第一种方式(xml中的onclick属性)
在xml中设置按键的onclick绑定的函数
9.按键响应的第二种方式(接口类)
安卓开发中的监听器(onclicklistener)
自定义类实现按键监听事件的接口
通过findViewByld绑定局部变量button和xml中的button
实现接口类,在类中实现onclieck方法,写业务代码
为1.2两步做的准备进行绑定,使得按键被按下后执行业务代码
package com.example.yhq;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
class MyClieckHandler implements View.OnClickListener {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
switch(v.getId()) {
case R.id.button1:
System.out.println("按键1被按下");
break;
case R.id.button2:
System.out.println("按键2被按下");
break;
}
}
}
public class MainActivity extends Activity {
Button btn1; //此时为野指针 定义局部变量
Button btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过方法将其与按钮组件联系起来,此处需要强转换
btn1 = (Button)findViewById(R.id.button1); //绑定xml
btn2 = (Button)findViewById(R.id.button2);
btn1.setOnClickListener(new MyClieckHandler()); //设置监听器
btn2.setOnClickListener(new MyClieckHandler());
}
}
9.按键响应的第三种方式(匿名内部类)
package com.example.yhq;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
Button btn1; //此时为野指针
Button btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过方法将其与按钮组件联系起来,此处需要强转换
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
//匿名内部类,由于没有名字,需要现场建类实现里面的接口
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO 自动生成的方法存根
System.out.println("按键1被按下");
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO 自动生成的方法存根
System.out.println("按键2被按下");
}
});
}
}
10.按键响应的第四种方式(Activity_P)
package com.example.yhq;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
//为整个页面实现一个onClick这个接口,具备点击的事件处理,也要让btn跟页面功能建立联系
public class MainActivity extends Activity implements View.OnClickListener {
Button btn1; //此时为野指针
Button btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过方法将其与按钮组件联系起来,此处需要强转换
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
switch(v.getId()) {
case R.id.button1:
System.out.println("按键1被按下");
break;
case R.id.button2:
System.out.println("按键2被按下");
break;
}
}
}
11.安卓页面跳转
创建新页面
新建,右键src新建other
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goSecond(View v) {
//intent去设置要跳转的页面 //当前页面,跳转页面的类
Intent intent = new Intent(this, SecondActivity.class);
//跳转
startActivity(intent);
}
}
页面跳转传参方式一
修改第一个页面的程序,使其传递数据
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goSecond(View v) {
//intent去设置要跳转的页面 //当前页面,跳转页面的类
Intent intent = new Intent(this, SecondActivity.class);
//键 值
intent.putExtra("MyData", "皓清很帅");
//跳转
startActivity(intent);
}
}
修改第二个页面的程序,使其接收数据
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class SecondActivity extends Activity {
private String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent i = this.getIntent();
data = i.getStringExtra("MyData");
System.out.println("收到数据, "+data);
Toast.makeText(this, "收到数据"+data, 0).show();
}
public void goThird(View v) {
//intent去设置要跳转的页面 //当前页面,跳转页面的类
Intent intent = new Intent(this, ThirdActivity.class);
//跳转
startActivity(intent);
}
}
页面跳转传参方式二
修改第一个页面的程序,使其传递数据
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goSecond(View v) {
//intent去设置要跳转的页面 //当前页面,跳转页面的类
Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("MyData", "皓清很帅");
bundle.putInt("ID", 100);
intent.putExtras(bundle);
//跳转
startActivity(intent);
}
}
修改第二个页面的程序,使其接收数据
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class SecondActivity extends Activity {
private String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent i = this.getIntent();
Bundle b = i.getExtras();
String data = b.getString("MyData");
int data2 = b.getInt("ID");
Toast.makeText(this, "收到数据"+data, 0).show();
}
public void goThird(View v) {
//intent去设置要跳转的页面 //当前页面,跳转页面的类
Intent intent = new Intent(this, ThirdActivity.class);
//跳转
startActivity(intent);
}
}
12.安卓线程实现页面的自动跳转
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化一个线程,使用构造方法来初始化,即通过接口Runnable设置新线程要执行的任务
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
try { //sleep会睡眠UI线程的刷新,所以要在新线程中使用sleep
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//intent去设置要跳转的页面 //当前页面,跳转页面的类
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//跳转
startActivity(intent);
}
}); //实例化一个线程
t.start(); //启动线程
}
}
13.Activity(页面)的生命周期
1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
14.安卓Socket客户端开发
activity_main.xml
MainActivity.java
package com.example.hq;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import com.example.hq.nets.NetUtils;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendMessage(View v) {
switch (v.getId()) {
case R.id.fh:
NetUtils.sendMessageHandler("goforward");
break;
case R.id.back:
NetUtils.sendMessageHandler("goback");
break;
case R.id.right:
NetUtils.sendMessageHandler("goright");
break;
case R.id.left:
NetUtils.sendMessageHandler("goleft");
break;
}
}
}
NetUtils.java
package com.example.hq.nets;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class NetUtils {
public static void sendMessageHandler(final String command) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
try {
Socket client = new Socket("192.168.3.5", 8806);// 创建套接字
OutputStream out = client.getOutputStream(); // 获得数据发送通道
out.write(command.getBytes()); // 发送数据
InputStream in = client.getInputStream(); // 获得数据接收通道
int len;
byte[] data = new byte[128];
len = in.read(data);// 接收通道接收数据
System.out.println("获得服务器端返回数据是:"
+ new String(data, 0, len));
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}).start();
}
}
15.实现倒计时10s——非UI控件想要修改线程,使用Handler类解决
MainActivity.java
package com.example.hq;
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 h;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//关联UI控件,需要类型强制转换
textView = (TextView) findViewById(R.id.textView);
h = new Handler() { //UI主线程的家里的电话,处理一些其他进程无法处理的事件
@Override
public void handleMessage(Message msg) { //区分事件的类型
// TODO 自动生成的方法存根
super.handleMessage(msg);
textView.setText(msg.what+"s"); //接到电话则会修改控件
}
};
}
public void testFunc(View v) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
for (int i = 10; i >= 0; i--) {
System.out.println("yhq"+i);
Message msg = new Message();
msg.what = i;
//打电话,去把UI要显示、处理的事件交给UI线程的Handler去做
h.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}).start();
}
}
注,导Handler包时,选第一个
activity_main.xml
16.安卓客户端可收发并刷新UI控件显示
activity_main.xml
MainActivity.java
package com.example.hq;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
import com.example.hq.nets.NetUtils;
public class MainActivity extends Activity {
Handler handler;
TextView tx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tx = (TextView)findViewById(R.id.tx);
handler = new Handler() {
private CharSequence String;
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle b = msg.getData();
String string = b.getString("msg");
tx.setText(string);
}
};
}
public void sendMessage(View v) {
switch (v.getId()) {
case R.id.fh:
NetUtils.sendMessageHandler("goforward", handler);
break;
}
}
}
NetUtils.java
package com.example.hq.nets;
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 h) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
try {
Socket client = new Socket("192.168.3.5", 8806);// 创建套接字
OutputStream out = client.getOutputStream(); // 获得数据发送通道
out.write(command.getBytes()); // 发送通道发送数据
InputStream in = client.getInputStream(); // 获得数据接收通道
int len;
byte[] data = new byte[128];
len = in.read(data);// 接收通道接收数据
String str = new String(data, 0, len);
Message msg = new Message();
Bundle b = new Bundle();
b.putString("msg", str);
msg.setData(b);
h.sendMessage(msg);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}).start();
}
}
17.WebView控件的使用
https://blog.csdn.net/weixin_40438421/article/details/85700109
增加访问权限
或者直接在.xml文件中输入
package com.example.hq;
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 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WebView wb = (WebView)findViewById(R.id.webView1);
wb.setWebViewClient(new WebViewClient());//使用自带浏览器
final EditText ed = (EditText) findViewById(R.id.ed);
ed.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent event) {
// TODO 自动生成的方法存根
String str = ed.getText().toString();
wb.loadUrl(str);
return (event.getKeyCode() == KeyEvent.KEYCODE_ENTER);
}
});
}
}
activity_main.xml
18.智能家居项目APP开发
activity_main.xml(主页面布局设置)
MainActivity.java(主页面程序)
package com.example.hq;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wb = (WebView) findViewById(R.id.webView1);
wb.loadUrl("https://tianqi.2345.com/");
wb.setWebViewClient(new WebViewClient());
}
}
activity_main.xml(启动页面布局设置)
WelcomeActivity.java(启动页面程序)
package com.example.hq;
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 {
TextView textview;
Handler h;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
textview = (TextView) findViewById(R.id.textView);
h = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO 自动生成的方法存根
super.handleMessage(msg);
textview.setText(msg.what+"s");
}
};
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
for (int i = 3; i > 0; i--) {
Message msg = new Message();
msg.what = i;
h.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
startActivity(intent); //启动页面
}
}).start();
}
}
AndroidMainifest.xml
包资源管理
实际界面展示
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)