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的更多相关文章

  1. android 基础学习笔记1

    1.控件 XML种控件必须带有Layoutwidth 和height 1.textview 常用属性 text,textcolor,textsize Android 种颜色用十六进制数表示,共四种形式 ...

  2. android 基础学习笔记3

    1.XML解析  与  Json 解析 (文件读取一般较耗时 可将相应的解析做成方法  用线程调用) 一.XML解析  (pull解析)res/xml(资源文件 需用到Resources) Xml文本 ...

  3. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  4. Android:日常学习笔记(7)———探究UI开发(4)

    Android:日常学习笔记(7)———探究UI开发(4) UI概述  View 和 ViewGrou Android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成 ...

  5. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  6. Android:日常学习笔记(5)——探究活动(2)

    Android:日常学习笔记(5)——探究活动(2) 使用Intent在活动之间穿梭 什么是Intent Intent时Android程序中各组件之间进行交互的一种重要方式,他不仅可以指明当前组件想要 ...

  7. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  8. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  9. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

随机推荐

  1. 洛谷 UVA11021 Tribles

    UVA11021 Tribles 题意翻译 题目大意 一开始有kk种生物,这种生物只能活1天,死的时候有p_ipi​的概率产生ii只这种生物(也只能活一天),询问m天内所有生物都死的概率(包括m天前死 ...

  2. light题目讲解 7.25模拟赛T1

    心得:这一道题其实就是自己打暴力打出来的 没有想到正解真的就是暴力枚举 我的做法是这样的 就是枚举A字符串中长度为x的子串 看它是不是B串的子序列 接下来是我的绝望考试代码(100分AC) //lig ...

  3. 【转】oracle条件子句执行顺序

    Oracle WHERE条件执行顺序:ORACLE采用自下而上的顺序解析WHERE子句 1.据此那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾例如:SELECT … FROM EMP E ...

  4. Window下安装并使用InfluxDB可视化工具 —— InfluxDBStudio

    下载 直接访问: https://github.com/CymaticLabs/InfluxDBStudio/releases/tag/v0.2.0-beta.1 创建or编辑InfluxDB 这个软 ...

  5. 数学基础系列(六)----特征值分解和奇异值分解(SVD)

    一.介绍 特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景. 奇异值分解是一个有着很明显的物理意义的一种方法,它可 ...

  6. [bzoj4567] [loj#2012] [SCOI2016] 背单词

    Description \(Lweb\) 面对如山的英语单词,陷入了深深的沉思,「我怎么样才能快点学完,然后去玩三国杀呢?」.这时候睿智的凤老师从远处飘来,他送给了 \(Lweb\) 一本计划册和一大 ...

  7. P1075,P1138(洛谷)

    今天难得做了做洛谷的题,而且还是两个! P1075:已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数.输入格式:一个正整数n.输出格式:一个正整数p,即较大的那个质数. 第一版代码: # ...

  8. Potplay视频播放画面扭曲

    Potplayer是一款非常好用的视频播放器,解码快,功耗低同时相对较好支持保真加速,但是,在使用过程中出现了如下的所谓“Bug” 经过摸索发现是播放器自动检测到此视频是360视频(不明觉厉,貌似需要 ...

  9. HLS协议

    今天来介绍一下HLS协议,这个协议是由苹果公司提出并推广开来的.来一段维基百科的定义. HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议.是 ...

  10. android开发实战-记账本APP(二)

    继昨天的开发,继续完成今天的内容. (一)开始构建一些业务逻辑,开始构建记账本的添加一笔记账的功能. ①对fab按钮的click时间进行修改,创建一个AlertDialog.Builder对象,因此我 ...