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之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
随机推荐
- java架构之路(多线程)JMM和volatile关键字(二)
貌似两个多月没写博客,不知道年前这段时间都去忙了什么. 好久以前写过一次和volatile相关的博客,感觉没写的那么深入吧,这次我们继续说我们的volatile关键字. 复习: 先来简单的复习一遍以前 ...
- Centos 7.2 Jenkins+Ansible+Gitlab 基础配置
注意:首先准备jenkins服务器 如何搭建jenkins 由于上篇文章中jenkins是采用war并部署在tomcat中来完成的安装,所以这里隆重介绍下启动tomcat的用户:tomcat,下面会 ...
- Django设置 DEBUG=False后静态文件无法加载解决
前段时间调试一直是在Debug=True先运行的,没有什么问题.今天关闭了Debug后,出现了一个问题.就是静态文件找不到了,「img.css.js」都提示404,无法准确的访问 static 静态文 ...
- LeetCode 第20题--括号匹配
1. 题目 2.题目分析与思路 3.代码 1. 题目 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭 ...
- 《爬虫学习》(二)(urllib库使用)
urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. 1.urlopen函数: 在Python3的urllib库中,所有 ...
- hihoCoder 1387 A Research on "The Hundred Family Surnames"
搬家一个月,庆祝一下 啪啪啪啪啪啪啪啪啪啪❀❀❀❀ 题目传送门 分析: 这什么奇奇怪怪的OJ,以前从来不知道的2333 以前只知道合并两个连通块时,其中一边直径端点为A,B,另一边为C,D D=max ...
- Java&Eclipse&Maven的折腾
趁着寒假对于Java的余热,继续了对Java的征途.这次并没有太多琐碎的事情打断我的学习,于是借着这股热情去图书馆借了两本国外的书(中译版),对于程序的爱好一定要坚持下来,才开通了这个博客以坚持学习.
- 团队项目——Alpha发布1
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/homework 这个作业要求在哪里 https ...
- Python学习,第四课 - 字符串相关操作
这次主要说说Python中字符串的使用方法详解 capitalize 首字母大写 print('chengshou'.capitalize()) #输出结果:Chengshou title 修改成标题 ...
- DOM中的位置和大小(总结)
[window]window对象 一.position位置 screenLeft/screenTop (适用于火狐和谷歌) screenX/screenY (适用于IE) 二.size大小 inner ...