基础概念
-
Android程序运行的一般步骤:
-
访问Mainfest.xml文件,确定默认Activity并调用该Activity类内的onCreat方法构建对应的Activity对象。
-
onCreat方法内的setContentView方法调用此Activity的布局文件,生成需要的控件对象。
-
继续执行Activity类内的其他方法(设置监听器,动态修改布局…..)
-
-
View类,是所有控件的父类(文本、按钮、多选、单选、布局)
-
在xml文件内设置一个View类的控件以后,会自动生成对应类的对象,之后在Activity文件内可以通过findViewById函数在R文件(所有在src文件夹内的对象在此文件内都会自动生成一个对应的int类型编号)内寻找到该控件类的对象并返回(返回的是一个View类对象!)。
-
为控件绑定监听器的一般步骤:
-
获取代表控件的对象
-
定义一个类,实现监听器接口
-
生成监听器对象
-
为控件绑定监听器对象
其中2,3可以简化为:生成一个匿名内部类,此类复写onClick方法后生成对象调动setClickListener函数为控件绑定监听器。
-
-
一个xml文件内有且只能有一个根元素。根元素的父控件是Activity。
-
LinearLayout布局不会自动换行,线性布局内的元素只能操纵orientation属性之外的方向。
-
px = dip * (dpi/160),设计时尽量避免使用px
-
sp通常用来设置字体大小,他会更具用户设备的字体设置自动调整大小
布局
LinearLayout:
- layout_weight属性:
使用前提:仅当子控件还没有占满父控件的所有空间时,才有实际意义。
作用:指定子控件对父控件的空闲空间的分配比例。
注意:完成分配以后,每个控件所占大小 = 控件本身大小 + 分配到的空间大小 如果按照1:1分配,分配以后两个控件并不是一样大。如果要让两个子控件评分父控件的所有空间,则可以将子控件的“本身大小”设置为0或者其他相同的值 。
控件
CheckBox:
-
继承关系:
CheckBox -> CompounButton -> Button ->TextView -> View
-
方法:
Boolean isCheck()
setChecked(boolean b)
- 监听器
CompoundButton.OnCheckedChangeListener()
Public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
isChecked 传入的是发生点击变化以后的checked状态量
RadioGroup
-
继承关系
RadioGroup -> LinearLayout -> ViewGroup
-
监听器
RadioGroup.OnCheckedChangeListener()
Public void onCheckedChanged(RadioGroup group,int checkedId)
注意区分RadioGroup的监听器和Button与RadioButton监听器的区别,参数的不同
RadioButton
-
继承关系
RadioButton -> CompounButton -> Button ->TextView -> View
-
监听器
CompoundButton.OnCheckedChangeListener()
Public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
ImagView
-
继承关系 ImageView -> View
-
属性
- ScaleType:
- fitCenter(fitStart/fitEnd):长宽等比例缩小、放大后居中(靠上/下边沿)显示
- center:不进行缩放,局中截取相同大小以显示
- centerInside:只对图片进行缩小,不进行放大,其他属性同fitcenter
- centerCrop:等比例缩放,保证填充完ImageView的所有空间,其他属性同fitCenter
- src:指定本地文件地址,添加本地图片,推荐png格式。
- 可以在Activity文件中利用Glid:Glide.with(this).load().into(ImageView); 添加网络资源
-
方法
.setImageResource(int id);
.setScalType(ScaleType.CENTER);
小技巧
整形数据+“”可以快速转换成相应的字符串
demo实训:剪刀石头布
布局:
设计思路:
- 布局
所有布局使用LinearLayout嵌套实现,View控件多使用weight属性使其充分填满控件。
其中需要注意的是如何让元素居中显示:
- 如果是要让某个控件的文字等属性居中显示,可以使用
android:gravity="center_horizontal"实现。
注意:如果width设置为wrap _ content,那么gravity设置为center _ horizontal是无效的,height和center _ vertical的关系类似
例如:
<TextView
android:id="@+id/textView2"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="mode2" />
- 如果要实现一个控件的居中显示,则需要调用android:layout_gravity属性
注意:如果父类容器是带有vertical属性的LinearLayout,那么将android:layout_gravity设置成center_vertical也是无效的。horizontal类似。
例如
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.breakloop.textviewgravity.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:text="mode1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="mode2" />
</LinearLayout>
</LinearLayout>
遇到的主要问题
-
从内部类中访问本地变量Proint1; 需要被声明为最终类型
原因:当含有内部类的函数被调用完毕以后,函数参数等就会被内存机制回收,而参数是被分配到栈中的。而内部类的对象是在堆中分配内存的,外部方法调用结束后该内部类对象不一定就被销毁了;所以就会出现一个奇怪的现象:内部类对象在访问一个不存在的局部变量。
这时候,可以用状态修饰符final修饰该变量,从而该变量成了常量,解决了这个问题。
如果需要调用的参数还有初始值,那么就应该将该声明一个final修饰的相同类型的数组,数组内只有被调用的参数一个变量,变量的值为参数的初始值。
例如:
final int[] Point1 = {0};
final int[] Point2 = {0};
-
通过
Glide.with(this).load().into(ImageView);调用网络图片时无法显示查看catlog发现应用没有网络授权,需要在Mainfest中声明:
<uses-permission android:name="android.permission.INTERNET"/> -
在实体设备上调试时报错:
Installation did not succeed. The application could not be installed: INSTALL_FAILED_TEST_ONLY Installation failed due to: 'null'
解决方案:
在 gradle.properties 文件中添加android.injected.testOnly=false