布局是摆放控件的规则,可以认为布局是一个透明的容器。
透明容器内部按照规则去摆放控件。
只关注android:开头的即可。
Android中有六大布局,分别是:
而今天我们要讲解的就是前两个布局。
LinearLayout(线性布局),我们屏幕适配的使用 用的比较多的就是LinearLayout的weight(权重属性)。
线性布局表示内部的控件横着或者竖着排成一排。
android:orientation=“vertical” 方向
可选值:horizontal(水平),vertical(垂直)
线性布局支持比例划分的。
//共同作用分宽度
android:layout_width="0dp"
android:layout_weight="2"
在某个参照物的某个方向或位置,相对布局的第一步就是给参照物起一个名字(id).
相对布局中,如果不指定子控件的相对位置,默认都在左上角堆放。
例子:创建一个新的布局文件
给某个布局或控件起一个id
android:id="@+id/text1"
在某个参照物的右边
android:layout_toRightOf="@id/text1"
在某个参照物的左边
ndroid:layout_toLeftOf="@id/text1"
在某个参照物的下面
android:layout_below="@id/text1"
在某个参照物的上面
android:layout_above="@id/text1"
在父控件的中间
android:layout_centerInParent="true"
在父控件的水平中心
android:layout_centerHorizontal="true"
在父控件的垂直中心
android:layout_centerVertical="true"
对齐父控件的左边
android:layout_alignParentLeft="true"
对齐父控件的右边
android:layout_alignParentRight="true"
对齐父控件的顶端
android:layout_alignParentTop="true"
对齐父控件的底部
android:layout_alignParentBottom="true"
对齐某个控件的左边/右边
android:layout_alignLeft="@id/btn1"
android:layout_alignRight="@id/btn1"
对齐某个控件的顶端/底部
android:layout_alignTop="@id/btn1"
android:layout_alignBottom="@id/btn1"
布局之间可以嵌套,对于外层的布局而言,内层的布局也相当于一个控件。
理论上布局可以嵌套任意层次,但是为了性能起见,应该尽可能的少用嵌套。
设置显示文字
android:text="我今晚想吃卷饼"
如果给TextView设置比较大的宽度和高度时,文字默认在左上。
可以通过设置重力方向来控制文字的位置。
android:gravity="center"
设置文字大小(单位使用sp)
android:textSize="10sp"
设置为浏览器的超链接
android:autoLink="web"
Button是TextView的子类,拥有TextView的绝大多数属性。
另外身为一个子类,Button也对其父类TextView做出了一些改动。
例如:文字默认居中,增加了按钮的点击效果。
功能用于显示图片
设置显示的图片
android:src="@drawable/xxx"
图片命名规则:
drawable目录中有任何一个违规的都不行
<GridView
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:horizontalSpacing="10dp"
android:numColumns="3"
android:verticalSpacing="30dp" >
GridView>
类似于提前先设定好某个“约定”(某个达成的条件A→执行某段代码B·)。
如果在程序运行的过程中达成了这个条件A,则自动触发B。
如果在程序运行的过程中没有达成条件A,则永远不会触发B。
“万物皆对象”
xml中布置控件(控件必须有id) → .java中找到对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
//按钮绑定id
mBtn = (Button) findViewById(R.id.btn1);
mBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//创建一个Intent对象
//1.导包
//2.参数一:当前的类名.this 参数二:要跳转的类名.class
Intent intent = new Intent(MyActivity.this,MainActivity.class);
//跳转
startActivity(intent);
}
});
}
AndroidMainfest.xml 清单配置文件
需要将其他页面的Activity配置到清单文件中。
多个按钮,多个监听器情况:
//1.使用当前的MainActivity主页面类实现OnClickListener接口
public class MainActivity extends Activity implements OnClickListener {
private Button mBtn1, mBtn2, mBtn3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn1 = (Button) findViewById(R.id.btn1);
mBtn2 = (Button) findViewById(R.id.btn2);
mBtn3 = (Button) findViewById(R.id.btn3);
//设置点击事件监听器
//A:点击事件 OnClick
mBtn1.setOnClickListener(this);
mBtn2.setOnClickListener(this);
mBtn3.setOnClickListener(this);
}
/**
*
* @param v 点击的按钮的对象
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
//获得点击的控件的id
case R.id.btn1: //B1
Toast.makeText(MainActivity.this, "您点击了按钮1", Toast.LENGTH_SHORT).show();
break;
case R.id.btn2: //B2
Toast.makeText(MainActivity.this, "您点击了按钮2", Toast.LENGTH_SHORT).show();
break;
case R.id.btn3: //B3
Toast.makeText(MainActivity.this, "您点击了按钮3", Toast.LENGTH_SHORT).show();
break;
}
}
}
在程序的关键节点输出一些调试信息,这些信息无法被用户感知,但是可以被开发者在后台截取。
//tag:日志的标签
//msg:日志显示的内容
Log.d(String tag,String msg)
例子:点击一下按钮,在后台输出一句调试信息。
捕获日志的两种方式:
1.IDE(集成开发环境):Eclipse
2.adb(安卓调试桥)------建议
需要先配置环境变量
进入到开发环境的目录下,有一个sdk文件夹,里面有一个platform-tools文件夹。
复制platform-tools的路径到环境变量中。
直接调用Toast类的makeText()方法
@Override
public void onClick(View v) {
//B:弹出个小窗提示
//参数一:固定搭配
//参数二:要显示的文字
//参数三:持续时长Toast.LENGTH_SHORT或者Toast.LENGTH_LONG
Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
}
四大组件间的 枢纽——Intent(意图),Android通信的桥梁。
MainActivity.java :发送数据
public class MainActivity extends Activity {
private TextView mText1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mText1 = (TextView) findViewById(R.id.text1);
//设置显示的内容
mText1.setText("https://mini.eastday.com//a//201218135517111.html?qid=juheshuju&referrer=");
//设置点击事件的监听器
mText1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
//携带参数(参数一:数据名称;参数二:数据的值)
intent.putExtra("data", mText1.getText());
startActivity(intent);
}
});
}
}
Second.java 接收并显示数据
public class SecondActivity extends Activity{
private TextView mText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mText = (TextView) findViewById(R.id.text_custom);
//获取上个页面跳转来的数据
String text = getIntent().getStringExtra("data"); //参数是数据的名称,见发送的时候的第一个参数
//设置到TextView上
mText.setText(text);
}
}
Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!
回调方法
:在特定的时机(系统的时机,无需手动设定)自动调用的方法。
Activity会在各个特定的时机回调一个特定方法,用户可以在这些特定的时机下调用一些代码。
-----页面开始启动-----
D/MainActivity( 2349): onCreate
D/MainActivity( 2349): onStart
D/MainActivity( 2349): onResume
------前台运行状态---------
-------开始退到后台--------
D/MainActivity( 2349): onPause
D/MainActivity( 2349): onStop
--------完全处于后台--------
--------开始返回前台--------
D/MainActivity( 2349): onStart
D/MainActivity( 2349): onResume
---------前台运行状态--------
---------关闭页面(例如点击返回键)------
D/MainActivity( 2349): onPause
D/MainActivity( 2349): onStop
D/MainActivity( 2349): onDestroy
onCreate/onDestroy
页面的启动/销毁
一个Activity实例,只会调用一次。
onStart/onStop
开始进入前台/完全处于后台
onResume/onPause
完全处于前台/开始进入后台
onPause中不可执行耗时的操作,应该放到onStop中去执行。
每次启动都会创建一个新的实例进入栈。
如果下一个要启动的页面恰好是当前正在显示的页面,此时不会创建新的实例。
1.包含栈顶复用
2. 如果下一个要启动的页面之前在栈内已经存在了,那么会重用这个实例,并且会把在这个实例
上面的其他实例弹出栈。
任何一个App都有唯一的一个Application实例,用于管理整个App的所有流程。
Application的特性适合做app运行过程中数据的中转。
默认情况下,Application由谷歌设计,并没有提供数据中转和临时存储的功能。
需要用户手动覆盖官方的Application类,替换成自定义的Application类实现此功能。
自定义Application
MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//演示如何在每一个Acitivity中获得MyApplication对象并存取数据
MyApplication app = (MyApplication) getApplication();
app.putData("data", "这是我扔进去的数据");
//加入下面的代码是另外一个地方的Activity
MyApplication app2 = (MyApplication) getApplication();
String value = (String) app2.getValue("data");
Toast.makeText(MainActivity.this, value, Toast.LENGTH_SHORT).show();
}
}
MyApplication.java
public class MyApplication extends Application{
private HashMap<String,Object> mData = new HashMap<String, Object>();
//添加数据
public void putData(String key,Object value) {
mData.put(key, value);
}
//获取数据
public Object getValue(String key) {
return mData.get(key);
}
}
Tip:
在Android中所有的on来头的方法,都不需要用户手动调用。
这些方法都会在特定的时机被调用。
实际上这些函数都是回调函数。
Object类是所有类的父类,Object可以使用多态来保存任何类型。