android基础知识杂记
Activity中获取视图组件对象:
public View findViewById(@IdRes int id)
该方法以组件的资源ID为参数,返回一个视图对象View,需要强转成具体的视图类对象。
Button mTrueButton = (Button) findViewById(R.id.true_button);
设置视图组件的点击监听器: 视图组件对象调用视图对象注册监听器的方法: public void setOnClickListener(@Nullable OnClickListener l) 该方法的参数是一个监听器,是一个实现了 OnClickListener 接口的对象,OnClickListener 接口中有一个 public void onClick(View v) 方法。
mTrueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//监听其中需要执行的具体代码
}
});
创建提示消息:
调用Toast类的以下方法:
public static Toast makeText(Context context, CharSequence text, @Duration int duration)
public static Toast makeText(Context context, @StringRes int resId, @Duration int duration) 上面的 makeText 方法,接收三个参数: Context: 通常是Activity的一个实例(Activity本身就是Context的子类) 第二个参数:既可以是要显示的字符串消息的资源ID,也可以是字符串本身 第三个参数:通常是两个Toast常量(Toast.LENGTH_SHORT、Toast.LENGTH_LONG)中的一个,用来指定toast消息的停留时间
makeText 方法返回Toast对象,然后调用Toast的实例方法 show() ,在屏幕上显示消息
Toast.makeText(QuizActivity.this, "这是要显示的消息", Toast.LENGTH_LONG).show();
上面直接显示消息的方式有一个问题:每次点击按钮,都会弹出一个消息,如果多次连续点击,消息会连续多次弹出。解决如下
监听消息的弹出和退出(设置上一次消息消失前,点击按钮不会有任何反应):
mTrueButton.setOnClickListener(new View.OnClickListener() {
boolean isClicked = false;
@Override
public void onClick(View v) {
//获取Toast对象
Toast toast = Toast.makeText(QuizActivity.this, "你好,你点击了确认按钮。", Toast.LENGTH_SHORT);
//获取显示消息的View对象
View view = toast.getView();
//设置显示消息的View对象的状态改变监听器
view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
//显示消息时触发
@Override
public void onViewAttachedToWindow(View v) {
isClicked = true;
}
//消息消失时触发
@Override
public void onViewDetachedFromWindow(View v) {
isClicked = false;
}
});
if (!isClicked) {
//调用Toast的实例方法 show() 显示消息
toast.show();
}
}
});
设置Toast消息显示的位置:
使用Toast的实例方法
public void setGravity(int gravity, int xOffset, int yOffset) 参数一:Gravity类的常量值(Gravity.TOP、Gravity.BOTTOM、Gravity.CENTER、Gravity.LEFT ...) 参数二:消息在x轴上的偏移量(消息默认是显示在x抽的中间的) 参数三:消息在y轴上的偏移量
mFalseButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast toast = Toast.makeText(QuizActivity.this, "你好,你点击了取消按钮。", Toast.LENGTH_LONG);
toast.setGravity(Gravity.TOP, -100, 0);
toast.show();
}
});
引用资源:
项目中的所有资源(布局文件,组件,图片,字符串等),系统都会为它们统一分配id。
引用组件:@id
引用字符串:@string
引用图片:@drawable
输出日志信息:
Android的 android.util.Log 类能够向系统级共享日志中心发送日志信息。
按照信息输出的冗长顺序排列,从少到多为:ERROR , WARN , INFO , DEBUG , VERBOSE 。
Log 类有如常用的下日志记录方法:
Log.v(String tag, String msg):
发送 VERBOSE 日志信息
Log.d(String tag, String msg);
发送 DEBUG 日志信息
Log.i(String tag, String msg);
发送 INFO 日志信息
Log.w(String tag, String msg);
发送 WARN 日志信息
Log.e(String tag, String msg):
发送 ERROR 日志信息
上面方法的参数:
tag:用于识别日志消息的来源,通常标识发生日志调用的类或活动。
msg: 被发送的消息。
一个很好的约定是,tag 在对应的类中声明一个常亮:
private static final String TAG = “当前所在类的类名(允许的最大字符长度为32)” ;
创建水平模式布局:
在项目窗口中,右键单击 res 目录,选择 New -> Android resource directory 选项:
选择 Resource type 为 layout,保持 Source set 为 main 不变,接下来选中 Available qualifires 中的 Orientation ,点击 >> 按钮,将其加入到右边的 Choosen qualifires 中:
设置 Screen orientation 为 Landscape ,并确保 目录名(Directory 那么)为 layout_land ,然后点击 OK ,就会在 res 目录下创建 layout_land 文件夹:
这里的 _land 后缀名是配置修饰符的一个使用例子,Android依靠 res 子目录的配置修饰符定位最佳资源以匹配当前设备配置。
此时,当设备处于水平方向时,Android会自动找到并使用 res/layout_land 目录下的布局资源。
保存Activity状态数据,以应对设备旋转:
旋转设备会改变设备配置(device configuration),设备配置实际是一系列特征组合,用来描述设备当前状态。
这些特征包含:屏幕方向、屏幕像素密度、屏幕尺寸、键盘类型、底座模式及语言等。
为匹配不同的设备配置,应用会提供不同的备选资源。
在运行时配置变更发生时,可能会有更合适的资源来匹配新的设备配置,所以,Android会销毁当前Activity实例,为新配置寻找更合适的资源,然后创建新实例使用这些资源。
所以,要让设备旋转后保持Activity实例的状态不变,就需要想个办法保存Activity实例当前的状态,以便设备旋转后将新创建的Activity实例回复到之前的状态。
Activity中提供了一个 protected void onSaveInstanceState(Bundle outState) 方法,该方法通常在 onStop() 方法调用之前由系统调用,
除非用户按后退键(因为,用户点击后退键,就是告知Android,acitivity用完了,所以系统就会认为没有重要的数据需要保存,就不会调用 onSaveInstanceState() 方法)。
复写该方法就可以自定义当Activity实例进入停止状态前需要执行的操作。
方法 onSaveInstanceState(Bundle) 的默认实现要求所有activity视图将自身状态数据保存在 Bundle(Bundle是存储字符串键与限定类型值之间映射关系(键值对)的一种结构) 对象中。
通过复写 onSaveInstanceState(Bundle) 方法,将一些数据保存到 Bundle 中,当新建Activity时,系统会将Bundle对象传递给 onCreate(Bundle) ,然后就可以在 onCreate(Bundle) 方法中取回这些数据。
例如:
public class QuizActivity extends AppCompatActivity {
private static final String TAG = "QuizActivity";
private static final String KEY_INDEX = "index";
private int mCurrentIndex = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz); Log.d(TAG, "onCreate(Bundle) method called."); if (savedInstanceState != null) {
mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
}
System.out.println(mCurrentIndex); //
} @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState method called.");
mCurrentIndex = 100;
outState.putInt(KEY_INDEX, mCurrentIndex);
}
android基础知识杂记的更多相关文章
- 【Xamarin开发 Android 系列 4】 Android 基础知识
原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...
- Android基础知识巩固:关于PendingIntent和广播
平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...
- Android基础知识(一)
前言 前言 从软件测试最终目的发现问题缺陷来看,Findyou比较认同一个观念,测试的能力大致可以划分成三个能力层次:发现问题.定位问题.预防问题.有机会探讨一下这个分类. 发现问题各种方式方法,比如 ...
- android开发学习---linux下开发环境的搭建&& android基础知识介绍
一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...
- elasticsearch基础知识杂记
日常工作中用到的ES相关基础知识和总结.不足之处请指正,会持续更新. 1.集群的健康状况为 yellow 则表示全部主分片都正常运行(集群可以正常服务所有请求),但是 副本 分片没有全部处在正常状态. ...
- Android基础知识-1
1.Android的Activity任务栈 在Android的系统中,在APP运行时每个APP都会默认有一个任务栈,任务栈的名称以APP的包名命名.任务栈是一中先进后出的结构,APP中每一个调用的Ac ...
- 看看android基础知识,谁帮我作答
无论怎么着,了解一点android的基本知识还是有必要的,就当开阔一些自己的眼界吧. .. . android的四大功能组件是_activity_,_service_,_BroadcastReceiv ...
- Android基础知识学习
IPC (Inter-Process Communication) 意思是: 进程间的通信,是指两个进程之间进行数据交换的过程. Android中如何开启多进程呢? 只需要给四大组件(Activit ...
- Android基础知识之Manifest文件的组织结构
原文:http://android.eoe.cn/topic/android_sdk 是AndroidManifest.xml文件中的根标签,她必须包含一个标签和指定的xmlns:android. p ...
随机推荐
- cf314E. Sereja and Squares(dp)
题意 题目链接 给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种,用除x之外的小写字母a~z表示.求有多少种合法的括号序列.答案对4294967296取模.合法序列不能相交,如()[],( ...
- es6声明对象以及作用域与es5对比
es6声明变量: let x=1;//声明一个变量 const y=2;//声明一个只读常量,声明时必须赋值,之后值不可修改 es5声明变量: var z=3;//声明一个变量 区别: let不存在变 ...
- 弹框&可用于判断
较常用的弹框:(3种) 1.prompt("显示用户的文本","输入域的默认值"): print();显示打印的对话框: find();显示查找的对话框: (用 ...
- 碎碎念css
块状元素单独占一行,但加上float变成跟着别人,有空就插!float让块级元素变行内元素
- Android自定义控件练手——简单的时钟
首先这应该是一个老生常谈的设计了,但是毕竟身为小白的自己都没动手做过,不动手怎么提高自己呢,所以在这梅林沉船闲暇之际,我就把我的设计流程与思路记录下来.首先来看看效果图吧: 如上图就是一个简单并没有美 ...
- python any all函数
a = [0, 0, 0, 0] b = [0, 0, 0, 1] c = [1, 1, 1, 1] >>> any(a) False >>> any(b) Tru ...
- 有些其他程序设置为从 Outlook 下载并删除邮件。为防止发生此意外情况,我们将这些邮件放入一个特殊的 POP 文件夹中
最近使用FOXMAIL接收MSN邮件时,发现有一些邮件收取不到,进到WEB页面,页面下方提示“你的邮件位于 POP 文件夹中!有些其他程序设置为从 Outlook 下载并删除邮件.为防止发生此意外情况 ...
- UML复习1-2章
第一章 1.请对SDLC的六个阶段排序 1> 可行性分析 2> 设计 3> 测试 4> 维护 5> 需求分析与说明 6> 编码 A. 1 5 2 6 3 4 B. ...
- java Vamei快速教程10 接口的继承和抽象类
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在实施接口中,我们利用interface语法,将interface从类定义中独立出 ...
- 【挖坑】2019年JAVA安全总结:SQL注入——新项目的开发与老项目的修复
如何在项目中有效的防止SQL注入 写给需要的人,所有的问题源自我们的不重视. 本章略过"什么是SQL注入","如何去利用SQL注入"的讲解,仅讲如何去防御 PS ...