【Android】《第一行代码—Android》第三章总结
2015-12-13 20:29
323 查看
Activity启动模式
standard模式standard是Activity的默认启动模式,再不进行限时指定的情况下,所有Activity都会默认使用standard启动模式。由于Android使用返回栈来管理Activity,在standard模式下,即默认情况下,每当启动一个新的Activity,它就会在返回栈中入栈,柄处有栈顶位置。对于使用standard模式的Activity,系统不会在乎这个Activity是否在返回栈中存在,每次启动hi创建一个新的实例。
singleTop模式
当Activity的启动模式指定为singleTop模式,在启动Activity时如果发现返回栈的栈顶已经是该活动,则可以直接使用,不会在创建新的Activity实例。
singleTask模式
当Activity的启动模式指定为singleTask,每次启动该Activity时系统首先会在返回栈中检查是否存在该Activity的实例,如果发现存在该Activity的实例则直接使用,同事吧这个Activity之上的所有Activity统统出栈,如果没有发现就会创建一个新的Activity实例。
singleInstance模式
singleInstance模式应该算是四种启动模式中最特殊,也最复杂的一个了。不同于以上三种模式,指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity(其实如果为singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。
自定义控件
在Android开发中,经常会遇到程序的多个Activity都需要使用某个相同的控件,传统的做法是在每个Activity中都加入这个控件的代码,这样就会出现相同的代码要重复写好几遍的情况,显然没有很好的实现相同代码的复用,我们可以把这部分形同的、定义控件的代码抽象成一个控件类,哪个Activity需要就可以直接添加。下面就以自定义标题栏为例加以说明。首先定义标题栏
TitleLayout类的布局文件,代码如下
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f0ffff" > <Button android:id="@+id/title_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="5dip" android:background="#98fb98" android:text="Back" android:textColor="#ff0000" /> <TextView android:id="@+id/title_text" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1" android:gravity="center" android:text="Title Text" android:textColor="#ff0000" /> <Button android:id="@+id/title_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="5dip" android:background="#98fb98" android:text="Edit" android:textColor="#ff0000" /> </LinearLayout>
上面的代码中采用线性布局定义了
Button、
TextView、
Button三个子控件,组成了一个标题栏控件。然后创建
TitleLayout类继承
LinearLayout,代码如下
package com.demo1.layouttest; import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; public class TitleLayout extends LinearLayout { public TitleLayout(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.title, this); Button titleBack = (Button) findViewById(R.id.title_back); Button titleEdit = (Button) findViewById(R.id.title_edit); titleBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ((Activity) getContext()).finish(); } }); titleEdit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getContext(), "you clicked edit button", Toast.LENGTH_SHORT).show(); } }); } }
LinearLayout子类有很多重载的构造器,这里我们重写了带两个形参的构造器
public TitleLayout(Context context, AttributeSet attrs)。借助
LayoutInflater.from(context)方法可以构建出一个
LayoutInflater对象,然后调用
inflate(R.layout.title, this)方法动态加载一个布局文件,
inflate()方法接收两个参数,第一个参数是要加载的布局文件的id,第二个参数是给加载好的布局再添加一个父布局,这里我们想要指定为
TitleLayout,于是直接传入
this。
没有响应事件的按钮是没有任何意义的,上面的代码分别为两个
Button按钮定义了点击事件,点击
Back按钮直接销毁当前
Activity,点击
Edit按钮,弹出
Toast提示信息。
下面在主
Activity的布局文件
main_activity.xml中添加自定义标题栏控件。特别要注意的是,添加自定义控件时,在类名前面要带上完整的包名,在这里包名不可以省略。代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <com.demo1.layouttest.TitleLayout android:layout_width="match_parent" android:layout_height="wrap_content" ></com.demo1.layouttest.TitleLayout> </LinearLayout>
相关文章推荐
- android 一些易混淆的方法1
- Android学习笔记之使用百度地图实现路线规划+公交信息检索
- Android手机平板两不误,使用Fragment实现兼容手机和平板的程序
- android studio设置应用图标时注意事项
- Android 自定义帧动画
- 编译Chromium Android版本
- 编译Chromium Android版本
- Git 项目推荐 | Android 键盘弹出显示 Emoji 按钮
- Android基础(一)
- Android 上拉加载 PullToRefresh
- android之ContentProvider详解
- Android学习笔记——持久化技术
- android 资源国际化 语言 国家/地区 缩写代码
- Android自定义view之下载控件,ProgressBar
- android 记事本demo!!!(listview与SQLite综合)
- Android异步任务AsyncTask
- Android基础进阶—JNI(上)
- android如何使用自己定义JNI接口,以及NDK环境建设和使用的工具。
- Android在onInterceptTouchEvent与onTouchEvent
- Android使用的开发MediaRecorder录制视频