android 基础学习笔记2
1.容器布局
一。线性布局 (LineaLayout)
方向:orientation =vertical / horizontal
重力(对齐) :gravity =bottom/right/left 对应常亮值为整形(int)
对齐常亮可通过管道符连接
int gravitys=bottom|right 底部右对齐
权重:weight=1 使用权重时,对应的width或者height=0dp
二。相对布局(Ralativelayout)
相对位置而言的布局
对齐:
layout_alignParentRight=“true” 父容器对齐
layout_alignBaseLine="true" 机械对齐
layout_above="@id/~~" 父控件对齐
内外边距:
~~~~
(EditText 小技巧)
{
background设置背景透明去除下划线
透明色 #00000000
singleline=“true”单行输入
}
三。网格布局 帧布局 表格布局
1.表格布局(tablelayout)
行(tablerow)控制
组件属性:
layout_span=“2” 跨多列
layout_column=“2” 占第几列
2.帧布局 (Framelayout)
~~不作介绍
(textview 小技巧)
{
TextView。setvisibility(view.visible);
设置TextView组件是否可见
}
3.网格布局(Gridlayout)
属性:
rowcount=“4”
columncount=“4”
组件属性
layout_columnspan="2"
layout_gravity="fill"
占多列 row占多行
四。Drawerlayout 侧拉布局
实现需要先导入相关包 support libary (v4)
基本格式:
<android.support.v4.widget.DrawerLayout
android:id="@+id/dl_layout"
android:background="@android:color/holo_orange_light"
android:layout_width="match_parent"
android:layout_height="match_parent"> <FrameLayout ~属性>主页内容 </FrameLayout> <LineaLayout ~属性 layout_gravity=“start”>侧拉内容 </LineaLayout> </android.support.v4.widget.DrawerLayout>
五。滚动条 (scrollview)垂直
滚动条不可添加多个组件,但可添加容器容纳多个组件
Horizontalscrollview 水平滚动条
可能遇到的一些需求
好的,就不一个个扣文档了,直接说实际开发中可能会遇到的一些需求吧:
另外有一个很典型的问题就是:ScrollView和ListView的嵌套问题,这个放到ListView那一章节 再来讲解~
1.滚动到底部:
我们可以直接利用ScrollView给我们提供的:fullScroll()方法:
scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部
scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部
另外用这玩意的时候要小心异步的玩意,就是addView后,有可能还没有显示完, 如果这个时候直接调用该方法的话,可能会无效,这就需要自己写handler来更新了~
代码示例:
效果图:
实现代码:
布局比较简单,就不贴了,直接贴MainActivity MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_down;
private Button btn_up;
private ScrollView scrollView;
private TextView txt_show; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindViews();
} private void bindViews() {
btn_down = (Button) findViewById(R.id.btn_down);
btn_up = (Button) findViewById(R.id.btn_up);
scrollView = (ScrollView) findViewById(R.id.scrollView);
txt_show = (TextView) findViewById(R.id.txt_show);
btn_down.setOnClickListener(this);
btn_up.setOnClickListener(this); StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 100; i++) {
sb.append("呵呵 * " + i + "\n");
}
txt_show.setText(sb.toString()); } @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_down:
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
break;
case R.id.btn_up:
scrollView.fullScroll(ScrollView.FOCUS_UP);
break;
}
}
}
当然除了这种方法还,你还可以使用另一种复杂一点的写法:
public static void scrollToBottom(final View scroll, final View inner) {
Handler mHandler = new Handler();
mHandler.post(new Runnable() {
public void run() {
if (scroll == null || inner == null) {
return;
}
int offset = inner.getMeasuredHeight() - scroll.getHeight();
if (offset < 0) {
offset = 0;
}
scroll.scrollTo(0, offset);
}
});
}
scrollTo()参数依次为x,y滚到对应的x,y位置!
2.设置滚动的滑块图片
这个更加简单: 垂直方向滑块:android:scrollbarThumbVertical
水平方向滑块:android:scrollbarThumbHorizontal
3.隐藏滑块
好吧,这个好像没什么卵用:
方法有两种: 1.android:scrollbars="none"
2.Java代码设置:scrollview.setVerticalScrollBarEnabled(false);
4.设置滚动速度:
这个并没有给我们提供可以直接设置的方法,我们需要自己继承ScrollView,然后重写一个 public void fling (int velocityY)的方法:
@Override
public void fling(int velocityY) {
super.fling(velocityY / 2); //速度变为原来的一半
}
本节小结:(引用)
好的,能想到的ScrollView的东西就这么多,因为平时这个用得并不多,一般直接套在外面而已, 另外,问题最多的一般是ScrollView和ListView的嵌套问题~如果有什么补充欢迎提出,谢谢~
2.消息处理机制
(多线程 主线程不应过长,复杂操作应在子线程完成,子线程不能更新ui组件信息)
一。主线程不用来做长时间耗时工作,长时间工作将产生无响应警告,费事操作应在子线程中完成,如:数据库操作,网络连接,大量数据计算等。
消息队列(MessageQueue)将ui反应与工作线程连接
Message Queue /Handler
子线程(工作线程)通过Handler传递Massage到Message Queue
(方法:
sendEmptyMessage(int what);传递一个动作标识服what
sendMessage(Message message,int what);传递一个message 和一个动作标识
post (Runnable r)传递一个ruannable到消息队列
)
ui主线程通过handleMessage(Massage message)方法以队列方式处理Message Queue中的Message
Message可带参数 arg2,arg1,object
Handler handler=new Handler(){
public void handleMessage(android.os.Message msg){
switch(msg.what){
//跟据what标识符判断对消息如何处理
case 0x0001: ~
break; }
}
} Message msg=new Message();
msg.what=0x0001;
msg.arg1=100;
handler.sengMessage(msg);
线程创建三种方式:
1)继承Thread类创建线程
2)实现Runnable接口创建线程
3)使用Callable和Future创建线程
下面让我们分别来看看这三种创建线程的方法。
------------------------继承Thread类创建线程--------------------- 通过继承Thread类来创建并启动多线程的一般步骤如下 1】d定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。 2】创建Thread子类的实例,也就是创建了线程对象 3】启动线程,即调用线程的start()方法 代码实例 public class MyThread extends Thread{//继承Thread类 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ new MyThread().start();//创建并启动线程 } }
------------------------实现Runnable接口创建线程--------------------- 通过实现Runnable接口创建并启动线程一般步骤如下: 1】定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体 2】创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象 3】第三部依然是通过调用线程对象的start()方法来启动线程 代码实例: public class MyThread2 implements Runnable {//实现Runnable接口 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ //创建并启动线程 MyThread2 myThread=new MyThread2(); Thread thread=new Thread(myThread); thread().start(); //或者 new Thread(new MyThread2()).start(); } }
------------------------使用Callable和Future创建线程--------------------- 和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要强大。 》call()方法可以有返回值 》call()方法可以声明抛出异常 Java5提供了Future接口来代表Callable接口里call()方法的返回值,并且为Future接口提供了一个实现类FutureTask,这个实现类既实现了Future接口,还实现了Runnable接口,因此可以作为Thread类的target。在Future接口里定义了几个公共方法来控制它关联的Callable任务。 >boolean cancel(boolean mayInterruptIfRunning):视图取消该Future里面关联的Callable任务 >V get():返回Callable里call()方法的返回值,调用这个方法会导致程序阻塞,必须等到子线程结束后才会得到返回值 >V get(long timeout,TimeUnit unit):返回Callable里call()方法的返回值,最多阻塞timeout时间,经过指定时间没有返回抛出TimeoutException >boolean isDone():若Callable任务完成,返回True >boolean isCancelled():如果在Callable任务正常完成前被取消,返回True 介绍了相关的概念之后,创建并启动有返回值的线程的步骤如下: 1】创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)。 2】使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值 3】使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口) 4】调用FutureTask对象的get()方法来获得子线程执行结束后的返回值 代码实例: public class Main { public static void main(String[] args){ MyThread3 th=new MyThread3(); //使用Lambda表达式创建Callable对象 //使用FutureTask类来包装Callable对象 FutureTask<Integer> future=new FutureTask<Integer>( (Callable<Integer>)()->{ return 5; } ); new Thread(task,"有返回值的线程").start();//实质上还是以Callable对象来创建并启动线程 try{ System.out.println("子线程的返回值:"+future.get());//get()方法会阻塞,直到子线程执行结束才返回 }catch(Exception e){ ex.printStackTrace(); } } }
实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,后者线程执行体run()方法无返回值,因此可以把这两种方式归为一种这种方式与继承Thread类的方法之间的差别如下:
1、线程只是实现Runnable或实现Callable接口,还可以继承其他类。
2、这种方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。
3、但是编程稍微复杂,如果需要访问当前线程,必须调用Thread.currentThread()方法。
4、继承Thread类的线程类不能再继承其他父类(Java单继承决定)。
注:一般推荐采用实现接口的方式来创建多线程
android 基础学习笔记2的更多相关文章
- android 基础学习笔记1
1.控件 XML种控件必须带有Layoutwidth 和height 1.textview 常用属性 text,textcolor,textsize Android 种颜色用十六进制数表示,共四种形式 ...
- android 基础学习笔记3
1.XML解析 与 Json 解析 (文件读取一般较耗时 可将相应的解析做成方法 用线程调用) 一.XML解析 (pull解析)res/xml(资源文件 需用到Resources) Xml文本 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Android:日常学习笔记(7)———探究UI开发(4)
Android:日常学习笔记(7)———探究UI开发(4) UI概述 View 和 ViewGrou Android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成 ...
- Android:日常学习笔记(6)——探究活动(3)
Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...
- Android:日常学习笔记(5)——探究活动(2)
Android:日常学习笔记(5)——探究活动(2) 使用Intent在活动之间穿梭 什么是Intent Intent时Android程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要 ...
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例
---------------------------------------------------------------------------------------------------- ...
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
随机推荐
- 0182 JavaScript执行机制:单线程,同步任务和异步任务,执行栈,消息队列,事件循环
以下代码执行的结果是什么? [结果是1 2 3 ] console.log(1); setTimeout(function () { console.log(3); }, 1000); console ...
- js如何下载后台传过来的base64文件
一.<a>标签的作用 相信大部分人都知道<a>链接再简单不过了,跳转嘛,跳转到另外一个页面,这谁不知道. 当然这这是一部分, <a> 标签定义超链接,用于从一个页面 ...
- 我是如何做到springboot自动配置原理解析
一前言 springboot 2.0.0版本分析,整体的自动配置流程如下: 具体配置参考官方文档:springboot-doc 二 @SpringBootApplication 核心注解@Spring ...
- Python中with标签的使用详解
1.在python DTL模板中,想要定义变量,可以通过"with"语句来实现. 2."with"语句有两种使用方式: 第一种是"with xx=xx ...
- 在 Vue 中使用 Typescript
前言 恕我直言,用 Typescript 写 Vue 真的很难受,Vue 对 ts 的支持一般,如非万不得已还是别在 Vue 里边用吧,不过听说 Vue3 会增强对 ts 的支持,正式登场之前还是期待 ...
- Qt Installer Framework翻译(3-4)
更新组件 下图说明了用于更新已安装组件的默认工作流程: 本节使用在macOS上运行的Qt 5维护工具为例,来演示用户如何更新已安装组件. 启动更新程序 用户启动维护工具时,将打开"简介&qu ...
- GoldenGate DB11gr2配置手册
GoldenGate DB11gr2配置手册 源端数据库配置 1.1源端数据库打开Archive Log: SQL>shutdown immediate; SQL>startup moun ...
- org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3报错解决
报错的原因翻译出来: 预期的一个结果(或null)返回selectOne(),但发现:3 意思就是你想得到一个结果值,但是返回了三个结果值. 一般可能测试的时候我们存了几条一样的数据,在登录时,会把同 ...
- NSCTF-Reverse02 超级详细且简单的办法搞定
没有壳 VC写的 观察界面 一个编辑框 一个按钮 拖进IDA 在导入表里找到GetDlgItemTextA 为什么找这个函数 因为这个函数的作用就是 获取我们输入编辑框的内容 双击进入 ctrl+X ...
- 14、python异常处理及断言
前言:本文主要介绍python中异常的处理及断言,包括异常类型.异常捕获.主动跑出异常和断言. 一.异常类型介绍 什么是异常?异常即是一个事件,该事件会在程序执行过程中发生,会影响程序的正常执行,一般 ...