1.基本控件和布局 + 基本适配器 + Activity生命周期及传值和现场保护

1.android的项目目录结构

         Android学习首先要大致了解项目目录,有些看不懂的就先记下,等之后遇到了再回头来看,印象肯定会更加深刻。

src     Java源码

gen    自动生成的java文件

R.java (Resource)静态内部类

assets  资产  包括:音频视频 比较大的 不需要修改资源

不会再R.java中自动生成,必须通过路径来访问

bin    二进制文件(apk)

res    Resource 资源

drawable_hdpi 高分辨率的图片

drawable_ldpi 低分辨率的图片

drawable_mdpi 中分辨率的图片

drawable_xhdpi 超高清辨率的图片

drawable_xxhdpi 特高清分辨率的图片

layout 布局

xml的文件,告诉Activity显示什么样的内容

menu 菜单  xml的文件

values  数据文件    没有对应的静态的内部类

dimens.xml 尺寸

strings.xml 常量值

styles.xml  样式

AndroidMainfest.xml  项目清单文件

package="com.qf.day01_helloworld" 包名,应用程序的唯一标示

android:versionCode="1" 版本号

application:

android:icon="@drawable/ic_launcher"  图标

android:label="@string/app_name" 标签名称

android:theme="@style/AppTheme" 样式

2.DVM(Dalvik)和JVM的区别:

(1)Dalvik基于寄存器  jvm基于栈  基于寄存器的虚拟虚拟机对于更大的程序来说,

在他们编译的时候,花费的时间更短

(2)Dalvik执行.dex格式的字节码

JVM执行.class格式的字节码

(3).class的文件存在很多重要信息,.dex工具会去除重复的信息

3.android五大布局

(1)线性布局    LinearLayout

android:layout_width="match_parent" 设置布局的宽度(通用属性)

android:layout_height="match_parent" 设置布局的高度(通用属性)

属性值:match_parent 填充父容器的宽度和高度

fill_parent  填充父容器的宽度和高度(2.2之前的版本)

wrap_content 包裹内容的宽度和高度

android:orientation=""  设置线性布局的排列方式

属性值:  vertical 垂直排列

horizontal 水平排列(默认的)

android:gravity="center"  父容器内所有子控件的位置

android:gravity="bottom|right" 多个属性直接必须“|”分割

权重  android:layout_weight="1" 子控件在父容器剩余空间中所占的比例

属性值越大,所占的比例就越大

(2)相对布局  RelativeLayout

指子控件与父容器、控件与控件 相对位置的来进行布局

<1>,子控件相对于父容器的位置

居中对齐:

android:layout_centerHorizontal = "true"  子控件相对于父容器水平居中android:layout_centerVertical="true"      子控件相对于父容器垂直居中

android:layout_centerInParent = "true"   子控件相对于父容器完全居中

位置对齐:

android:layout_alignParentRight="true"     子控件相对于父容器的右边对齐android:layout_alignParentLeft="true"     子控件相对于父容器的左边对齐android:layout_alignParentBottom="true"      子控件相对于父容器的底部对齐android:layout_alignParentTop="true"     子控件相对于父容器的顶部对齐

<2>,子控件与兄弟控件之间的位置

放置的位置:

android:layout_toRightOf="@id/button_id"    子控件显示在ID为button_id的右侧

android:layout_toLeftOf="@id/button_id"     子控件显示在ID为button_id的左侧

android:layout_below="@id/button_id"     子控件显示在ID为button_id的下方

android:layout_above="@id/button_id"        子控件显示在ID为button_id的上方

对齐的方式:

android:layout_alignRight="@id/button_id"  子控件与ID为button_id的右边对齐

android:layout_alignLeft="@id/button_id"    子控件与ID为button_id的左边对齐

android:layout_alignBottom="@id/button_id"  子控件与ID为button_id的底部对齐

android:layout_alignTop = "@id/button_id"  子控件与ID为button_id的顶部对齐

android:layout_alignBaseLine = "@id/button_id" 子控件与ID为button_id的基准线对齐

(3),帧布局     

(4),表格布局

(5),绝对布局    这三个布局很少被用到,这里不做过多讲解,了解即可。用上面的线性布局和相对布局几乎可以达到大部分效果。另外有些老代码可能会用到帧布局,有兴趣的小伙伴可以自行找资料学习。

(6),网格布局GridLayout (4.0后出现的)

1,设置组件的排列方式

android:orientation=""

属性值: vertical 垂直

horizontal 水平

2,设置布局为几行几列

android:rowCount="4"    设置网格布局有4行

android:columnCount="4"  设置网格布局有4列

3,设置控件位于几行几列

注意:都是从0开始算的

android:layout_row = "1"  设置控件位于第二行显示

android:layout_column = "2" 设置控件位于第三列显示

4,设置某个组件横跨几行几列

android:layout_rowSpan="2"      行的跨度

android:layout_columnSpan = "3" 列的跨度

android:layout_gravity ="fill"  填充你所跨的整行或整列

4.TextView  extends  View

android:textStyle="bold" 文字的样式(可以叠加使用,必须用"|"分割)

属性值:  bold  加粗

               Italic 斜体

android:singleLine = "true" 是否单行显示

android:ellipSize = "" 用省略号显示超出文本宽度的内容

属性值: none  无

             start  开始位置省略

             middle 中间

             end    结束位置

             marquee 滚动显示

跑马灯:

          step1:  android:ellipSize = "marquee"

          step2:  设置焦点

                       android:focusable  = "true"

                       android:focusableInTouchMode = "true"

          step3:  android:marqueeRepeatLimit = "marquee_forever"循环滚动

          step4:  android:singleLine = "true"

android:autoLink = " " 自动连接(根据内容类型的不同,点击打开相应的应用程序

属性值:  none  无

               web  网址

               email 邮箱

               Phone 电话号码

               map  地理位置

               all  包括以上所有

5.EditText  extends  TextView

android:hint = "提示信息"   

 android:textColorHint = " " 提示信息的颜色    

 android:inputType  = "" 允许用户输入的内容            

 属性值: text  默认            

               number 只能输入数字    

               textpassword  文本密码    

               date  日期   

               Phone  电话号码          

android:layout_alignBaseline = ""在一条基准线上

<requestFocus/>请求焦点

6.Button  extends  TextView

android:drawableRight  图片放在文本的右侧

android:drawableLeft  图片放在文本的左侧

android:drawableBottom  图片放在文本的下方

android:drawableTop  图片放在文本的上方

ImageButton

android:src="@drawable/ic_launcher"  图片路径

android:background="@null"  去除灰色背景

7.按钮监听器

监听三部曲:

1,定义控件并且初始化

2,定义监听器(得到监听器对象)

3,为控件设置监听器

监听器实现的方式:4种

第一种方式: 匿名内部类

第二种方式: 成员内部类的方式

第三中方式: 让当前的类 implements  OnClickListener 接口,重写OnClick(),为控件设置监听器

第四种方式: Button属性 

            1,标签中定义属性:android:onClick ="onClickButton"

            2,  在代码中写监听方法:

                 2.1 必须是public

                 2.2  返回值必须是void

                 2.3  方法名称必须和xml中onClick属性的属性值一致

                 2.4  必须有一个View类型的参数

8.ImageView extends View

android:scaleType = ""图片显示的方式

属性值: matrix:    不缩放,从左上角开始截取和ImageView红箭,(可以在代码中设置Matrix对象)

(常用)fitXY:      不按比例缩放图片,目标是把图片塞满整个ImageView

fitStart:  按比例缩放图片的大小,置于顶部显示,完全显示图片

(常用)fitCenter:  按比例缩放图片的大小,居中显示,完全显示图片(默认)

fitEnd:    按比例缩放图片的大小,置于底部显示,完全显示图片

center:    保持图片原来的size,居中显示,超出部分不显示

centerCrop  按比例扩大图片的size,居中显示,小边填满容器,大边超出部分不显示

centerInside按比例缩小图片的size,居中显示,超出部分不显示

代码中设置图片资源:

imageView.setImageResource(R.drawabe.xxx);

9.CheckBox  多选框 extends CompoundButton --->Button

android:checked = "true" 设置为被选中状态

java代码中的方法

checkBox.isChecked() 获取多选框的状态

checkBox.setChecked(true) 设置多选框被选中

状态改变监听器 OnCheckedChangeListener (需要导入 android.widget.CompoundButton.OnCheckedChangeListener包,注意要与RadioButton区分)

10.RadioButton 单选按钮  extends CompoundButton --->Button

(1)由于是单选按钮,所以使用组来管理(RadioGroup)

(2)特点:多个取其一(RadioButton 必须制定id)

(3)属性

RadioGroup:

android:orientation = ""排列方式(默认为垂直排列)

android:checked = "" 按钮是否被点亮

(4)radioGroup.isChecked();判断是否被选中,默认为true

(5)从radioGroup组上获取其中的radioButton,判断是否被选中

((RadioButton)radioGroup.getChildAt(index)).ischecked();

(6)监听事件:OnCheckedChangeListener

只能给RadioGroup设置OncheckedChangeListener

需要导入android.widget.RadioGroup.OncheckedChangeListener包

与checkBox区分

11.Spinner  下拉菜单        

android:spinnerMode=""  Spinner的展示方式            

            属性值:drodown  下拉方式        

                          dialog    对话框       

android:prompt="" 在对话框方式下设置标题(标题内容只能应用,不能写死)          

android:entries = "@array/citys" 下拉菜单的内容    数据源的填充:                    

<1>数据源必须是String[]或List(纯文本)

<2>通过属性填充:android:entries=""

<3>在代码中使用ArrayAdapter数组适配器填充数据

12.ArrayAdapter数组适配器:

(1)三个参数的(数据源为数组)      

            this  上下文对象     

            resource item的布局资源      

            Object 数据源----数组     

            ArrayAdapteradapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item,data);      

(2)三个参数的(数据源为集合)      

            this  上下文对象      

            resource item的布局资源      

            Object 数据源----List集合      

            ArrayAdapteradapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,data);  (3)四个参数       

this  上下文对象      

resource item的布局资源     

 textViewResourceId  item布局资源中要用的TextView的ID                          

                                      当item的布局资源中只有一个TextView时,此参数可省略      

Object 数据源----List集合或者      

ArrayAdapteradapter = new ArrayAdapter(this,R.layout.xxx,R.id.textview,data);  

 (4)API推荐            

this  上下文对象     

textArrayResId  字符串数组的ID(数组写在Xml文件中)      

textViewResId  Item样式的资源文件      

ArrayAdapteradapter = new ArrayAdapter(this,R.array.xxx,R.id.textview);

13.Spinner监听器  OnItemSelectedListener 用来监听用户点击下来列表的事件

spinner.setOnItemSelectedListener(new OnItemSelectedListener(){

/**

*AdapterView parent  整个下拉菜单的视图(即spinner对象)

*View view              每个Item视图的对象

*int position          当前点击的条目下标

*long Id                当前点击条目的Id

*/

public void onItemSelected(AdapterView parent,View view,int position,long id){

//从parent中获取内容

String str2 = parent.getItemAtPosition(position).toString();

//从adapter中获取内容

String str3 = adapter.getItem(position);

//从spinner中获取内容

String str4 = spinner01.getItemAtPosition(position).toString();

}

};

14.SimpleAdapter 适配器(可实现图文混排:图片只能是本地的)    

(1)只用一个构造方法    

(2)构造方法介绍:    

 /**    *context 上下文对象    

 *data    数据源  数据源的格式为:List>

*resource Item的布局资源

*from    String[]数据源中的key

*to      int[] 布局资源的id

*/

SimpleAdapter adapter = new SimpleAdapter(this,

data,

R.layout.item_spinner,

new String[]{"icon","city"},

new int[]{R.id.icon,R.id.city});

15.AutoCompleteTextView 自动提醒的编辑框 extends EditText

(1)

android:completetionHint 设置下拉菜单中的提示标题

android:completionThreshold  设置用户至少输入多少个字符才会显示提醒

android:dropDownhorizontalOffset  下拉菜单于文本框之间的水平偏移。默认与文本框左对齐

android:dropDownheight  下拉菜单的高度

android:dropDownWidth  下拉菜单的宽度

android:dropDownVerticalOffset 垂直偏移量

(2)设置OnItemClickListener用来监听用户点击下来列表的事件

spinner.setOnItemClickListener(new OnItemSelectedListener(){

                       /**

                      *AdapterView parent  整个下拉菜单的视图(即AutoCompleteTextView对象)

                      *View view              点击的Item视图的对象

                      *int position          当前点击的条目下标

                     *long Id                当前点击条目的Id

                    */

                    public void onItemClick(AdapterView parent,View view,int position,long id){

                                //从parent中获取内容

                               String str2 = parent.getItemAtPosition(position).toString();

                               //从adapter中获取内容

                               String str3 = adapter.getItem(position);

                               //从spinner中获取内容

                               String str4 = spinner01.getItemAtPosition(position).toString();

                     }

 };

(3)添加TextChangedListener监听器 用来监听输入框文本的变化

autoView.addTextChangedListener(new TextWatcher(){

              /**

             *文本正在变化

             *charSequence s  改变之前的文本

             *start: 改变之前文本的下标

             *before 改变之前文本的数量

             *count  改变的文本个数

             */

             public void onTextChanged(CharSequence s,int start,int before,int count){

             }

             /**

             *文本改变之前触发次方法

             *s:变化之前的文本

             *start 变化之前文本的下标

             *count 变化之前文本的个数

             *after 变化之后文本的个数

             */

             public void beforeTextChanged(Charsequence s,int start,int count,int after){

             }

            /**

             *文本变化之后触发次方法

             *s:s.toString() 变化之后的文本

             */

             public void afterTextChanged(Editable s){

             }

};

16.两个Activity之间传值(4种)

(1)通过意图Intent传值

<1>A:  Intent intent = new Intent();

            intent.putExtra("key", value);

                     putExtra();该方法的value支持所有基本数据类型和String对象  以及他们所对应的数组类                                           型除此之外还支持实现Serializable、Parcelable接口的类对象(也就是说,要想                                         在Activit之间传对象,则该对象的类需要实现Serializable、Parcelable接口)

           intent.setClass(this,xxxActivity.class);

           startActivity(intent);

     B:  Intent intent = getIntent();

          intent.getXXXExtra(key); 拿到对应的值

<2>类似于上面

A: Bundle  bundle = new Bundle();

     bundle.putxxx("key",value); 与上面intent.putExtra("key",value)用法一样

     intent.putExtras(bundle);

B: Bundle  getIntent().getBundleExtra()  拿到bundle对象

     bundle.getxxx("key");  拿到值

(2)静态成员传值(不建议使用)

在A中声明一个公共的静态成员,在合适的地方存入数据

在B类中直接访问A类的静态成员,读取相应的数据

(3)全局变量传值(android建议使用)(★)

              ----Application组件中(一般存放适用于全局的数据,比如用户账户)    

<1>创建Application的子类,并声明全局的变量(类成员)    

<2>在AndroidManiFest.xml(清单文件)中标签中,

       通过android:name="包名+类名"属性将创建的Application子类引入项目

<3>在合适的位置存入数据

<4>在需要用的地方读取相应的数据

(4)回传数据

A:startActivityForResult(Intent,110)启动界面

B:setResult(RESULT_OK,data);设置回传的数据(然后直接finish()关闭当前页面)  data为Intent类型,data中不需要setClass()

A:重写onActivityResult(int requesCode,int resultCode,Intent data)方法

              该方法传回数据时系统调用

              参数:requesCode---请求码对应上面的110

                       resultCode----回复码对应上面的RESULT_OK

                       data  ------传回的数据

17.Activity的生命周期(7个)从创建到消亡

onCreate()      第一次创建时执行    初始化Activity

onStratet()      显示窗口时执行      显示Activity

onResume()      获取焦点是执行      与用户交互

onPause()        失去焦点时执行      停止与用户交互

onStop()        关闭窗口时执行      关闭Activity

onRestart()      重新显示窗口        再次显示Activity

onDestroy()      销毁时执行          销毁Activity

(1)在A中启动B时执行声明周期方法的顺序

A:onPause()---B:onCreate()---B:onStart()----B:onResume()---A:onStop()

从B中返回A

B:onPause()---A:onRestart----A:onStart()---A:onResume()---B:onStop()---B:onDestroy()

(2)在A中启动B(以对话框形式显示的Activity)

A:onParse()---B:onCreate()---B:onStart()---B:onResume()

从B中返回A

B:onParse()---A:onResume()----B:onStop()---:onDastroy()

18.现场保护(保持状态)

应对横竖屏切换时重新创建Activity,因此需要保持业务数据来保护现场

//重写onSaveInstanceState()方法来存入数据

protected void onSaveInstanceState(Bundle outState){

             super.onSaveInstanceState(ontState);

             outState.putInt("index",index);

}

//在onCreate() 方法中获取保护的数据

protected void onCreate(Bundle savedInstanceState){

              super.onCreate(savedInstanceState);

              setContentView(R.layout.activity_main);

              if(savedinstanceState){

                          index = savedInstanceState.getInt("index");

              }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容