学习android个人笔记一
jcenter()是代码托管仓库
dependeencies是闭包
在onCreate()方法外面键TAG快捷键logt按tab键就可以
重写的方法的快捷键使Ctrl+o
Android 中http显示网页
geo显示地理位置
tel 显示拨打号码
备注:1.一下是访问网络的(安卓系统内置动作)
Intent intent = newIntent(Intent.ACTION_VIEW);intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
2.一下是调用拨号界面(安卓系统内置的有一个动作)
Intent intent = newIntent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
返回数据用到一下的方法
protected void onActivityResult(int requestCode,int resultCode, Intent data) {}
按返回键返回数值的的方法
public void onBackPressed(){}
活动(Activity)是使用任务(Task)来管理活动的,也叫返回栈
栈:是一种后进先出的数据结构
活动(activity)在其生命周期中最多可能会有四中状态
1. 运行状态(活动处于栈顶)系统最不愿回收就是这个状态
2. 暂停状态(活动不再处于栈顶)但仍可见(可能不会占满屏)
3. 停止状态(活动不再处于栈顶)且不可见
4. 销毁状态(活动从栈中移除)系统最有可能就回收此活动
注:在清单文件中添加主题 正确的添加 android:theme=@style/Theme.AppCompat.Dialog
错误添加 android:theme="@android:style/Theme.Dialog"
注:一个活动(ActivityA)正在传输,此时启动活动(ActivityB)。而因内存不足活动(ActivityA)被系统回收,此时用back键回到活动(ActivityA)。但是传输的数据全被清除了。因为这种情况的存在所以谷歌提供一个onSaveInstanceState()回调方法,这个方法可以保证活动被回收之前一定会被调用,以此我们可以用这个方法来解决活动被回收时临时数据得不到保存的问题。
protected void onSaveInstanceState(BundleoutState) {
super.onSaveInstanceState(outState);
String data = "临时文件";
outState.putString("save",data);
}
这样就能保存临时数据了。但是在那回复保存的临时数据呢?其实在onCreate()方法中有一个Bundle参数。取出临时数据的方法
//判断if活动被系统回收时保存了临时数据就从这里取出临时数据
if(savedInstanceState != null){
String emty =savedInstanceState.getString("save");
Log.d(TAG,"onCreate: " + emty);
}
活动(activity)的的启动模式有4种
1. Standard:每次启动一个活动都会创建一个新的实例
2. singleTop:返回栈顶中已存在该活动。不会重新创建实例,复用栈顶的活动。当活动不处在栈顶时,启动一个活动就会重新创建实例
3. singleTask:这种模式下的活动只要在返回栈中存在要启动的活动就去复用。如果栈中不存在该活动也会创建实例
4. singleInstance:指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。那么这样做有什么意义
重点:想随时随地退出程序的办法
(1)新建一个ActivityCollector类作为活动管理器代码如下:
publicclass ActivityCollector {
publicstatic List<Activity> activities = newArrayList<Activity>();
//添加一个活动
public static void addActivity(Activity activity){
activities.add(activity);
}
//删除已个活动
public static voidremoveActivity(Activity activity){
activities.remove(activity);
}
public static voidfinishAll(){
for(Activity activity :activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
Androiud的控件都有这个属性android:visibility有三种取值,分别是visiable(默认)、invisiable控件不可见,但仍然占着原来的位置和大小、gone控件不但不可见,而且也不会占用任何屏幕空间。同时也可以用代码去实现控件的可见性,使用的是setVisibility()方法。可以传入View.VISIBLE、View.INVISIBLE、View.GONE
AlertDialog.Builder alertDialog = new AlertDialog.Builder(SecondActivity.this);
ProgressDialog dialog = new ProgressDialog(SecondActivity.this);
这两个的用法相似都会提示提示框,但当我们用ProgressDialog这个的时候提示框是有一个进度条。类似正在加载。
AlertDialog用法:
AlertDialog.Builder alertDialog = new AlertDialog.Builder(SecondActivity.this); alertDialog.setTitle("This is dialog"); alertDialog.setMessage("something important"); alertDialog.setCancelable(false);
alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCollector.finishAll(); } }); alertDialog.setNegativeButton("Cancelable", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); alertDialog.show(); Edit
ProgressDialog用法:
ProgressDialog dialog = new ProgressDialog(SecondActivity.this); dialog.setTitle("This is ProgressDialog"); dialog.setMessage("Load......."); dialog.setCancelable(true); dialog.show();
注意,如果在setCancelabel()中传入了false,表示ProgressDialog是不能通过Back键取消掉的,这是你就一定要在代码中做好控制,当数据加载完成后必须要调用ProgressDialog的dismiss()方法来关闭对话框,否则ProgressDialog将一直存在。
四种基本的布局:
1.LinearLayout:线性布局
注意:android:layout_gravity用于指定控件在布局中的对齐方式。
android:gravity 用于指定文字在控件中的对齐方式。
但当LinearLayout的排布列方向是horizontal时,只有垂直方向的对齐方式才会有效,因为此时水平方向的长度是不固定的,没添加一个控件,水平方向的长度都会改变,因而无法指定该方向上的对齐方式。同样都是道理,当LinearLayout的排布列方向是vertical时,只有水平方向上的对齐方式才会生效。
2.RelativeLayout:相对布局
属性:相对于父视图的有:
android:layout_alignParentBottom=""
android:layout_alignParentTop=""
android:layout_alignParentLeft=""
android:layout_alignParentRight=""
android:layout_centerInParent=""
一般去true和false(还有@android)
相对于控件定位:
android:layout_toLeftOf="" android:layout_toRightOf="" android:layout_above="" android:layout_below=""
取值相对于某一个控件的id来定位
android:layout_alignBottom="" android:layout_alignTop="" android:layout_alignLeft="" android:layout_alignRight=""
1. FrameLayout:帧布局
使用场景较少。控件默认摆放在布局的左上角
android:layout_gravity="right" 还是可用
注:权重(layout_weight)只有再线性布局(LinearLayout)中才生效。
2. 百分比布局
使用百分比布局需要依赖一个库
在app/build.gradle中的dependencies闭包中添加:
compile ‘com.android.support:percent:24.2.1’
由于百分比布局并不是内置在系统SDK当中,所以需要把完整的路径写出来。然后还必须定义一个app的命名空间,这样才能使用百分比布局的自定义属性。
自定义控件
可以看到,我们所使用的所有控件都是直接或间接继承自View的。有所的布局直接或间接继承自ViewGroup。View是android中最基本的一种UI组件,他可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件。因此我们是用的各种控件其实就是在View的基础上有添加了各自特有的功能,而ViueGroup则是一种特殊的View。它可以包含很多子View和ViewGroup,是一个用于放置控件和布局的容器。
注:包含进来的语句是:
<include layout="@layout/title"/>
活动中将系统自带的标题栏隐藏有
//隐藏自带的标题栏
ActionBar actionBar =getSupportActionBar();
if(actionBar != null){
actionBar.hide();
}
注:添加自定义控件和添加普通控件的方式基本是一样的,只不过在添加自定义控件的时候,我们需要指明控件的完整类名,包名在这里是不可以省略的。
<com.prize.uicustomviews.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"/>