Android(安卓)View And Activity
安卓
- View与GroupView
- 布局是什么?
-
- 线性布局
- 相对布局
- 布局嵌套
- 常用控件
-
- TextView 文本显示控件
- Button 按钮 和 ImageButton
- ImageView 图片显示控件
- GridView 网格视图
- 监听器 Listener
- 输出Log日志
- Toast 基本使用
- Intent 基本使用
- Activity
-
- 生命周期
- Activity的加载模式
-
- standard 标准模式
- singleTop 栈顶复用模式
- singleTask 栈内复用模式
- singleInstance 单例模式
- Application 应用程序
View与GroupView
Android里的图形界面都是由View和ViewGroup以及他们的子类构成的: View:所有可视化控件的父类,提供组件描绘和时间处理方法 。 ViewGroup: View类的子类,可以拥有子控件,可以看作是容器 Android UI中的控件都是按照这种层次树的结构堆叠得。 创建UI布局的方式有两种, 自己在Java里写代码或者通过XML定义布局,后者显得更加方便和容易理解! 也是我们最常用的手段!另外我们一般很少直接用View和ViewGroup来写布局,更多的 时候使用它们的子类控件或容器来构建布局!以下是本篇文章正文内容,下面案例可供参考
布局是什么?
布局是摆放控件的规则,可以认为布局是一个透明的容器。
透明容器内部按照规则去摆放控件。
只关注android:开头的即可。
Android中有六大布局,分别是:
- LinearLayout(线性布局)
- RelativeLayout(相对布局)
- TableLayout(表格布局)
- FrameLayout(帧布局)
- AbsoluteLayout(绝对布局)
- GridLayout(网格布局)
而今天我们要讲解的就是前两个布局。
LinearLayout(线性布局),我们屏幕适配的使用 用的比较多的就是LinearLayout的weight(权重属性)。
线性布局
线性布局表示内部的控件横着或者竖着排成一排。
android:orientation=“vertical” 方向
可选值:horizontal(水平),vertical(垂直)
线性布局支持比例划分的。
//共同作用分宽度android:layout_width="0dp"android:layout_weight="2"
相对布局
在某个参照物的某个方向或位置,相对布局的第一步就是给参照物起一个名字(id).
相对布局中,如果不指定子控件的相对位置,默认都在左上角堆放。
例子:创建一个新的布局文件
- 选中res—layout文件夹,右键—New—Android XML File
- 在弹出的窗口中的File栏,输入要创建的布局文件的名称(全英文小写,单词间使用_分割)
- 在下方的Root Element栏目中选择要使用的布局后点击Finish按键完成创建
给某个布局或控件起一个idandroid: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"
布局嵌套
布局之间可以嵌套,对于外层的布局而言,内层的布局也相当于一个控件。
理论上布局可以嵌套任意层次,但是为了性能起见,应该尽可能的少用嵌套。
常用控件
TextView 文本显示控件
设置显示文字android:text="我今晚想吃卷饼" 如果给TextView设置比较大的宽度和高度时,文字默认在左上。可以通过设置重力方向来控制文字的位置。android:gravity="center"设置文字大小(单位使用sp)android:textSize="10sp"设置为浏览器的超链接android:autoLink="web"
Button 按钮 和 ImageButton
Button是TextView的子类,拥有TextView的绝大多数属性。
另外身为一个子类,Button也对其父类TextView做出了一些改动。
例如:文字默认居中,增加了按钮的点击效果。
ImageView 图片显示控件
功能用于显示图片
设置显示的图片android:src="@drawable/xxx"
图片命名规则:
- 不允许数字开头
- 不允许大写英文
- 不允许中文和特殊的符号
drawable目录中有任何一个违规的都不行
GridView 网格视图
<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>
效果如图:
监听器 Listener
类似于提前先设定好某个“约定”(某个达成的条件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; } }}
输出Log日志
在程序的关键节点输出一些调试信息,这些信息无法被用户感知,但是可以被开发者在后台截取。
//tag:日志的标签//msg:日志显示的内容Log.d(String tag,String msg)
例子:点击一下按钮,在后台输出一句调试信息。
捕获日志的两种方式:
1.IDE(集成开发环境):Eclipse
- 确认当前的环境是否已经连接到对应的模拟器上,点击Open Perspective…(右上角)
- 选择新窗口中的DDMS窗口,点击Open按钮
- 在DDMS窗口的Devices标签中,确认设备已经连接
- 确认连接无误后回到编辑窗口的logcat窗口中
- 在Logcat窗口的左上角,点击绿色的加号
- 在新弹出的窗口中,前两个空输入标签名称(如MainActivity),点击OK按钮。
2.adb(安卓调试桥)------建议
需要先配置环境变量
进入到开发环境的目录下,有一个sdk文件夹,里面有一个platform-tools文件夹。
复制platform-tools的路径到环境变量中。
- 点击Win+R,输入cmd,回车。
在命令行黑窗口中,输入adb,回车,进行验证。 - adb命令:
验证已经连接的设备
adb devices - 筛选Log
adb logcat -s 标签名称,例如:
adb logcat -s MainActivity
Toast 基本使用
直接调用Toast类的makeText()方法
@Override public void onClick(View v) { //B:弹出个小窗提示 //参数一:固定搭配 //参数二:要显示的文字 //参数三:持续时长Toast.LENGTH_SHORT或者Toast.LENGTH_LONG Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show(); }
Intent 基本使用
四大组件间的 枢纽——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可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!
生命周期
回调方法
:在特定的时机(系统的时机,无需手动设定)自动调用的方法。
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中去执行。
Activity的加载模式
standard 标准模式
每次启动都会创建一个新的实例进入栈。
singleTop 栈顶复用模式
如果下一个要启动的页面恰好是当前正在显示的页面,此时不会创建新的实例。
singleTask 栈内复用模式
1.包含栈顶复用
2. 如果下一个要启动的页面之前在栈内已经存在了,那么会重用这个实例,并且会把在这个实例
上面的其他实例弹出栈。
singleInstance 单例模式
- 全局只有一个实例
- 单独一个栈
- 退栈的时候会先清空当前的活动栈,然后再切换到其他的栈,直到这个App的所有栈都被清空。
Application 应用程序
任何一个App都有唯一的一个Application实例,用于管理整个App的所有流程。
Application的特性适合做app运行过程中数据的中转。
默认情况下,Application由谷歌设计,并没有提供数据中转和临时存储的功能。
需要用户手动覆盖官方的Application类,替换成自定义的Application类实现此功能。
自定义Application
- 在清单文件中注册自定义的Application(添加name属性)
- 在src的包下创建自定义Application的类文件
- 让自定义的类继承Application类。import android.app.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可以使用多态来保存任何类型。
更多相关文章
- Android(安卓)Material Design 控件常用的属性
- Android自学笔记之Android常见命令操作及一些普通布局属性
- Win7上Git安装及简单配置过程
- Android可显示数字进度的进度条使用教程
- 配置android jni开发环境
- 安卓自定义View(第一篇)
- Android(安卓)定制万能Adapter
- Android(安卓)layout_alignBottom 注意事项
- Android(安卓)获取联系人