文章目录
二、UI
ViewGoup 五大布局
LinearLayout
android:orientation 属性指定排列方向
android:layout_weight 属性指定权重
android:gravity用于指定文字在控件中的对齐方式,而 android:layout_gravity 用于指定控件在布局中的对齐方式。android:layout_gravity 的可选值和 android:gravity 差不多,但是需要注意,当LinearLayout 的排列方向是 horizontal 时,只有垂直方向上的对齐方式才会生效,因为此时水平方向上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定该方向上的对齐方式。
RelativeLayout
FrameLayout
设计FrameLayout是为了显示单一项widget。通常,不建议使用FrameLayout显示多项内容;因为它们的布局很难调节。不用layout_gravity属性的话,多项内容会重叠;使用layout_gravity的话,能设置不同的位置。layout_gravity可以使用如下取值:
top :将对象放在其容器的顶部,不改变其大小.
bottom:将对象放在其容器的底部,不改变其大小.
left:将对象放在其容器的左侧,不改变其大小.
right:将对象放在其容器的右侧,不改变其大小.
center_vertical:将对象纵向居中,不改变其大小.
TableLayout
1、 TableLayout继承了 LinearLayout,因此它的本质依然是线性布局管理器。每次向TableLayout中添加一个TableRow,该TableRow就是一个表格行,TableRow也是容器,因此它也可以不断地添加其他组件,每添加一个子组件该表格就增加一列。如果直接TableLayout中添加组件,那么这个组件将直接占用一行。
2、表格三种属性
- Shrinkable:如果某个列被设为Shrinkable,那么该列的所有单元格的宽度可以被收缩,以保证该表格能适应父容器的宽度。
- Stretchable:如果某个列被设为Stretchable,那么该列的所有单元格的宽度可以被拉伸,以保证组件能完全填满表格空余空间。
- Collapsed:如果某个列被设为Collapsed,那么该列的所有单元格会被隐藏。
AbsoluteLayout
一.AbsoluteLayout(绝对布局):
AbsoluteLayout(绝对布局)之所以把这个放到最后,是因为绝对布局,我们基本上都是不会使用的,我们开发的应用需要在很多的机型上面进行一个适配,如果你使用了这个绝对布局的话,可能你在4寸的手机上是显示正常的,而换成5寸的手机,就可能出现偏移和变形,所以的话,这个还是不建议使用了
二.AbsoluteLayout(绝对布局)常用属性:
控制大小:
android:layout_width:组件宽度 android:layout_height:组件高度
控制位置:
android:layout_x:设置组件的X坐标 android:layout_y:设置组件的Y坐标
基础控件
TextView
android:text 指定 TextView 中显示的文本内容
android:gravity 来指定文字的对齐方式
android:textSize 属性可以指定文字的大小
通过 android:textColor 属性可以指定文字的颜色
在 Android 中字体大小使用 sp 作为单位。
Button
系统会对 Button 中的所有英文字母自动进行大写转换
禁用:android:textAllCaps=“false”
ImageView
图片通常都是放在以“drawable”开头的目录下
android:src="@drawable/img_1 " 属性指定要显示图片
代码中也可以更改图片:imageView.setImageResource(R.drawable.img_2);
EditText
android:hint=“Type something here” 提示文字
android:maxLines 指定了 EditText 的最大行数为两行,这样当输入的内容超过两行时,文本就会向上滚动
android:inputType=“password” 指定输入框类型(可改变键盘默认页面)
ProgressBar
ProgressBar 用于在界面上显示一个进度条,表示我们的程序正在加载一些数据
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
会看到屏幕中有一个圆形进度条正在旋转。
可以通过 android:visibility进行指定进度条可见性,可选值有 3 种:visible、invisible 和 gone。
visible 表示控件是可见的,这个值是默认值,不指定 android:visibility 时,控件都是可见的。
invisible 表示控件不可见,但是它仍然占据着原来的位置和大小,可以理解成控件变成透明状态了。
gone 则表示控件不仅不可见,而且不再占用任何屏幕空间。
AlertDialog
AlertDialog.Builder dialog = new AlertDialog.Builder (MainActivity.this);
dialog.setTitle("This is Dialog");
dialog.setMessage("Something important.");
dialog.setCancelable(false);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
ProgressDialog
ProgressDialog 和 AlertDialog 有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。
ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("This is ProgressDialog");
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(true);
progressDialog.show();
高级控件
RecyclerView
先定义了一个内部类 ViewHolder,ViewHolder 要继承自 RecyclerView.ViewHolder。然后ViewHolder 的构造函数中要传入一个 View 参数,这个参数通常就是 RecyclerView 子项的最外层布局,那么我们就可以通过 findViewById()方法来获取到布局中的实例了。
Adapter 中也有一个构造函数,这个方法用于把要展示的数据源传进来,并赋值给一个全局变量 ,我们后续的操作都将在这个数据源的基础上进行。
Adapter 是继承自 RecyclerView.Adapter 的,那么就必须重写onCreateViewHolder()、onBindViewHolder()和 getItemCount()这 3 个方法。
onCreateViewHolder()方法是用于创建 ViewHolder 实例的,我们在这个方法中将 item 布局加载进来,然后创建一个 ViewHolder 实例,并把加载出来的布局传入到构造函数当中,最后将ViewHolder 的实例返回。
onBindViewHolder()方法是用于对 RecyclerView 子项的数据进行赋值的,会在每个子项被滚动到屏幕内的时候执行,这里我们通过 position 参数得到当前项的 Item实例,然后再将数据设置到 ViewHolder 的 TextView 当中即可。
getItemCount()方法就非常简单了,它用于告诉 RecyclerView 一共有多少子项,直接返回数据源的长度就可以了。
public class ItemAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
private List<Item> mItemList;
static class ViewHolder extends RecyclerView.ViewHolder {
TextView itemName;
public ViewHolder(View view) {
super(view);
itemName = (TextView) view.findViewById(R.id.item_name);
}
}
public ItemAdapter(List<Item> itemList) { //构造函数绑定数据源
mitemList = itemList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_item, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Item item = mItemList.get(position);
holder.mName.setText(item.getName());
}
@Override
public int getItemCount() {
return mItemList.size();
}
}
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); //获取Recyclerview布局
LinearLayoutManager layoutManager = new LinearLayoutManager(this); //创建一个LinearLayoutManager
recyclerView.setLayoutManager(layoutManager); //为Recyclerview设置一个Manager
ItemAdapter adapter = new ItemAdapter(itemList); //创建Adapter并传入数据源
recyclerView.setAdapter(adapter); //为Recyclerview设置yigeAdapter
为每一个条目注册点击事件
public class ItemAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
private List<Item> mItemList;
static class ViewHolder extends RecyclerView.ViewHolder {
TextView itemName;
View itemView; //*
public ViewHolder(View view) {
super(view);
itemName = (TextView) view.findViewById(R.id.item_name);
}
}
public ItemAdapter(List<Item> itemList) {
mitemList = itemList;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_item, parent, false);
final ViewHolder holder = new ViewHolder(view);
holder.ItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();
Item item = mItemList.get(position);
... //点击后逻辑
}
});
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Item item = mItemList.get(position);
holder.mName.setText(item.getName());
}
@Override
public int getItemCount() {
return mItemList.size();
}
}
Toolbar
顶部导航栏
ViewPager
ViewPager 是android support V4 包中类,这个类可以让用户左右切换当前的View,轮播图?APP欢迎界面?
- ViewPager直接继承自ViewGroup类,它是一个容器类,可以在其中添加其他的View
- ViewPager类需要一个PagerAdapter适配器,来为他提供数据。
- ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类
WebView
混合开发,直接将网页放入WebView容器显示
自定义View
测量——onMeasure():决定View的大小
布局——onLayout():决定View在ViewGroup中的位置
绘制——onDraw():如何绘制这个View。
Fragment
碎片(Fragment)是一种可以嵌入在活动当中的 UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛
生命周期
onAttach()
:Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArguments()获取参数。
onCreate()
:Fragment被创建时调用
onActivityCreated()
:当Activity完成onCreate()时调用
onStart()
:当Fragment可见时调用。
onResume()
:当Fragment可见且可交互时调用
onPause()
:当Fragment不可交互但可见时调用。
onStop()
:当Fragment不可见时调用。
onDestroyView()
:当Fragment的UI从视图结构中移除时调用。
onDestroy()
:销毁Fragment时调用。
onDetach()
:当Fragment和Activity解除关联时调用。
基础用法
静态加载
- 定义Fragment的xml布局文件
- 自定义Fragment类,继承Fragment类或其子类,同时实现onCreate()方法,在方法中,通过inflater.inflate加载布局文件,接着返回其View
- 在需要加载Fragment的Activity对应布局文件中
<fragment>
的name属性设为全限定类名,即包名.fragment - 最后在Activity调用setContentView()加载布局文件即可
静态加载一旦添加就不能在运行时删除
动态加载
- 获得FragmentManager对象,通过
getSupportFragmentManager()
- 获得FragmentTransaction对象,通过
fm.beginTransaction()
- 调用
add()
方法或者repalce()
方法加载Fragment; - 最后调用
commit()
方法提交事务
Fragment与Activity通信
如果Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()
或者findFragmentById()
获得任何Fragment实例,然后进行操作
在Fragment中可以通过getActivity
得到当前绑定的Activity的实例,然后进行操作。