Android基础知识整理(二) UI

二、UI

在这里插入图片描述

ViewGoup 五大布局
LinearLayout

android:orientation 属性指定排列方向

android:layout_weight 属性指定权重

android:gravity用于指定文字在控件中的对齐方式,而 android:layout_gravity 用于指定控件在布局中的对齐方式。android:layout_gravity 的可选值和 android:gravity 差不多,但是需要注意,当LinearLayout 的排列方向是 horizontal 时,只有垂直方向上的对齐方式才会生效,因为此时水平方向上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定该方向上的对齐方式。

RelativeLayout

img

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欢迎界面?

  1. ViewPager直接继承自ViewGroup类,它是一个容器类,可以在其中添加其他的View
  2. ViewPager类需要一个PagerAdapter适配器,来为他提供数据。
  3. 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通信

img

如果Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法

如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作

在Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leisure-ZL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值