今天来谈一下第一行代码三四章所讲的东西,其实内容并不难,主要在于需要真正的去写去练手,去了解每一种情况该怎么用,因而我打算在后面的一段时间内整理下自己的这部分代码,这样结合代码去读的话更容易更快速的理解。


                                         Chap3 软件也要拼脸蛋-UI开发点点滴滴

        这章无非也就是常用七种控件的用法(TextView、Button、EditText、ImageView、ProgressBar、AlterDialog、ProgressDialog)、四大布局的用法(Linearlayout、RelativeLayout、FrameLayout、PercentFrameLayout)、自定义一个标题栏、ListView的用法效率点击事件、Recyclerview的用法点击事件、还有一个制作聊天界面的实战。开始干!

(一)常用控件使用方法
1.TextView(文本)

      match_parent:控件与父类相同(基本不用fil_parent);

      wrap_content:刚好包裹里面内容。

      android:gravity调节文字对齐方式,可选参数包括top、bottom、left、right、center等。可用|来同时指定多个值。文字采用sp为单位,文字颜色使用#XXXXXX来表示。

2.Button(按钮)

       系统会将英文字母自动进行大小写转化,使用android:textAllCaps=”false”禁用。Button可以通过注册监听器调用,也可以通过实现接口的方式实现调用。

3.EditText(编辑框)

        android.hint:指定一段提示性文字,android:maxLines指定EditText的最大行数。 editText_01.getText().toString();来获取输入内容。

4.ImageView(图片控件)

        android:src为ImageView指定一张照片。使用setImageResource()更改ImageView里面的图片。

5.ProgressBar(进度条)

     (1)Android:visibility设置控件可见属性,Visible可见invisible不可见,gone消失。设置控件可见性setVisiblity(View.visible);获取控件可见性progress_bar01.getVisiblity(),

     (2)设置Prograssbar的进度条进度。

style="?android:attr/progressBarStyleHorizontal"
android:max="100"

6.AlterDialog(对话框)

        先new一个AlterDialog.Builder对象,setTitle、setMessage、SetCancelable、setPositiveButton、setNegativeButton完成。最后一定要dialog.show();

7.ProgressDialog

        与AlterDialog类似,设置progressdialog.setCaceled(true),可通过返回键回去。

(二)详解四种基本布局

         多层布局嵌套可以实现复杂界面布置。

        1.线性布局(Linearlayout)

        1.1.android:orientation="vertical"竖直方向。horizontal水平方向。

        1.2.android:gravity 用于指定文字在控件中的对齐方式,而android:layout_gravity用于指定控件在布局中的对齐方式。若LinearLayout的排列方向是horizontal时,只有垂直方向上的对齐方式才会生效。

        1.3.dp是Android中用于指定控件大小、间距等属性,android:layout_width="0dp" android:layout_weight="1"若两个控件都为1则平分屏幕。

        2.相对布局 (RelativeLayout)

        2.1.相对父布局定位:

android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
//两个属性来确定唯一左上的位置。

        2.2相对于控件定位

android:layout_below="@id/button_03"
android:layout_toRightOf="@id/button_03"
//该位置在button_03控件的右下方。
//其他控件应写在button_03控件的后面,否则会找不到

      3.帧布局 (FrameLayout)

      应用场景较少,将元素放在左上方,可以通过android:layout_gravity="left"改变位置

      4.百分比布局(PercentFrameLayout)

      gradle的dependencies中添加compile 'com.android.support:percent:26.+'

android:layout_gravity="right|top"//放于左上方位置上
app:layout_widthPercent="50%"//宽度指定为布局50%
app:layout_heightPercent="50%"//宽度指定为布局50%

(三)创建自定义控件

                                                           《第一行代码》总结之UI、碎片(二)_第一行代码

        1.引入布局:

        建立title.xml(adroid:background用于为布局或控件指定一个背景,可以使用颜色或图片来进行填充,adroid:layout_margin这个属性,它可以指定控件在上下左右方向上偏移的距离)、引入布局(<include layout="@layout/title" />)、在MainActivity中隐藏掉自带标题栏。

ActionBar actionBar = getSupportActionBar();//获得ActionBar的实例
if(actionBar!=null){actionBar.hide();//将标题栏隐藏起来

       2.创建自定义控件:

       每次引入Title.xml点击事件都要写,不如改成动态加载形成自定义控件。1.上一步引入布局后;2.新建TitleLayout继承自LinearLayout,对标题栏动态加载(LayoutInflater.from(context).inflate(R.layout.title,this);)3.重新引入布局,引入TitleLayout,而非title.xml;4.添加点击事件,形成自定义控件。

(四)ListView

       4.1简单用法

      1.提供显示数据

      2.构建适配器,目的是传递数据进入ListView,适配器是ArrayAdapter,可以通过泛型传递数据。

android.R.layout.simple_list_item_1
//里面只有一个简单的TextView。

       3.setAdapter将适配器传递进去,完成Listview与数据的关联。

       4.2.定制ListView的界面

      1.定义实体类Fruit,传入ImageId和name;

      2.建立Fruit_item.xml,完善布局;

      3.建立自定义适配器,继承ArrayAdapter,泛型为Fruit类,FruitAdapter将上下文、ListView子布局的id和数据传递进来。

      4.重写getView方法,其功能是每个子项滚动到屏幕内的时候会被调用。获取当前项的Fruit实例;LayoutInflater.from(getContext()).inflate为这个子项加载传入的布局;setImageResource和setText设置图片和文字。返回布局最后。

       5.使用initFruits初始化所有水果数据,将水果名称和水果图片ID添加进来;建立Adapter,将其作为适配器传入Listview,只要修改fruit_intem.xml,就可以修改出复杂界面了。

       4.3提升ListView的运行效率

       1.对已经加载好的布局的优化:在getView方法中,充分利用convertview参数,它的目的是将之前加载好的布局进行缓存,若convertview为null,则使用LayoutInflater加载布局,若不为null,则直接重用convertview;

       2.对获取控件实例的优化:创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,然后调用View的setTag()方法,将ViewHolder对象存储在View中。当convertView不为null的时候,则调用View的getTag()方法,把ViewHolder重新取出。这样所有控件的实例都缓存在了 ViewHolder里,就没有必要每次都通过findViewByid()方法来获取控件实例了。

       4.4 ListView的点击事件

使用setOnItemClickListener注册一个监听器,当点击子项时,回调onItemClick方法,通过position来获取那个位置,并Toast显示水果名字。

     (五)更强大的滚动控件RecyclerView

        5.1基本用法

       1.新建适配器继承自RecyclerView.Adapter,泛型指定为自己的ViewHolder

       2.FruitAdapter构造函数中将要展示的数据源传递给全局变量;

       3.onCreateViewHolder目的是创建ViewHolder实例,将fruit_item传递进来,创建ViewHolder实例,将加载的布局传递至构造函数ViewHolder中去。

      4.ViewHolder构造函数传递进入View参数,通过findViewById获取ImageView和TextView的实例;

      5.onBindViewHolder目的是每个子项滚动到屏幕内的时候执行,通过poistion获取位置,然后set进去。

      6.getItemCount告诉我们一共有多少子项

      7.指明RecyclerView为LinearLayoutManager线性布局方式;

      8.将构建的适配器放入recyclerview中去。

      5.2实现横向滚动和瀑布流布局

      横向滚动:除了更改fruit_item的部分布局之外,只需要添加下面这句话即可。RecyclerView相比于之前,优势在于将布局排列交由LinearLayoutManager去管理。

layoutmanager.setOrientation(LinearLayoutManager.HORIZONTAL);

       瀑布流布局:创建了一个StaggeredGridlayoutManager的实例。 StaggeredGridlayoutManager的构造函数接收两个参数,第一个参数用于指定布局的列数,传入3表示会把布局分为3列;第二个参数用千指定布局的排列方向,传入StaggeredG门d­LayoutManager. VERTICAL表示会让布局纵向排列,最后再把创建好的实例设置到RecyclerView。

        5.3点击事件

        在ViewHolder中添加了fruitView变最来保存子项最外层布局的实例,然后在onCreateViewHolder()方法中注册点击事件就可以了。这里分别为最外层布局和ImageView都注册了点击事件,RecyclerView的强大之处也在这里,它可以轻松实现子项 中任意控件或布局的点击事件。

      (六)制作聊天界面

        6.1制作Nine-Patch图片

       应用场景:聊天气泡在整体拉伸时候比较难看,使用Nine-Patch进行处理。

       如何去处理:右键图片->选择《第一行代码》总结之UI、碎片(二)_UI_02->拉伸上边框和左边框,表示内容放置的区域,用鼠标在图片边缘拉伸即可->删除之前图片。

        6.2编写精美聊天界面

        1.添加依赖关系库;

        2.修改主界面,加入RecyclerView和底下的EditText和Button;

        3.构建MSg实体类,包括消息内容和消息类型;

        4.编写RecyclerView的子项布局,新建msg_item.xml;构建了左右两个包含TextView的LinearLayout;

        5.构建适配器,大致步骤如本节5.1所示,唯一不同在于onBindViewHolder中添加显示左右布局的判断;

        6.在MainActivity中初始化数据,再加入:

Msg msg = new Msg(content,Msg.Type_Sent);
msglist.add(msg);
msgAdapter.notifyItemInserted(msglist.size()-1);
//当有新消息时,通知列表有新数据加入,并刷新RecyclerView中显示
msgrecyclerview.scrollToPosition(msglist.size()-1);
//将recyclerview定位至最后一行
input_Text.setText("");

      第三章搞定!一定要对比代码和书去看,否则有些地方会不知所云。那么来搞定第四章吧。


                                                              第四章.碎片

        本章主要从碎片是什么、碎片的用法(简单用法、动态添加、碎片模拟栈、通信)、碎片的生命周期(一定要对比着图上手走一篇印象会更深)、动态加载布局的技巧四个方面去阐述的。来看下吧。

(一)碎片是啥?

         嵌入在Activity的UI片段,类似于迷你型的活动。

(二)碎片的使用方法

         2.1碎片的简单写法

        1.建立两个xml文件,这两个文件分别是两个Fragment的布局,与Activity没有什么区别;

        2.新建Fragment继承自android.support.v4.app.Fragment,否咋4.2之下跑不了,重写OnCreateView方法,使用inflate方法将left_fragment布局动态加载进来。再建立一个Fragment将右布局加载进来。

        3.在Activity_main.xml中将两个Fragment放进来平分屏幕,其中需要加上完整包名:

android:name="nwu.hzk.p145.RightFragment"

        2.2动态添加碎片

       碎片的强大之处在于在程序运行时动态就添加到活动中。

       (1)创建待添加的碎片实例。

       (2)获取FragmentManager, 在活动中可以直接通过调用getSupportFragmentManager()方法得到。

       (3)开启一个事务,通过调用beginTransaction()方法开启。

       (4)向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例。

       (5)提交事务,调用commit()方法来完成。

       2.3碎片中模拟栈

       2.2按back键会退出,在提交事务之前使用transaction.addToBackStack(null);即可。

      2.4碎片与活动之间的通信

//Activity调用Fragment:
RightFragment rightframent = (RightFragment) getFragmentManager().findFragmentById
(R.id.right_fragment);

//Fragment调用Activity:
MainActivity activity = (MainActivity) getActivity();

    (三)碎片的生命周期:

      四种状态:运行、暂停(半可见)、停止(对用户完全不可见)、销毁。

                                                                   《第一行代码》总结之UI、碎片(二)_第一行代码_03


         onAttach()。当碎片和活动建立关联的时候调用。

         onCreateView()。为碎片创建视图(加载布局)时调用。

         onActvityCreated ()。确保与碎片相关联的活动定已经创建完毕的时候调用。

         onDestroyView()。当与碎片关联的视图被移除的时候调用。

         onDetach()。当碎片和活动解除关联的时候调用。

      (四)动态加载布局的技巧

       1.使用限定符进行操作,大屏幕自动加载layout_large下的布局文件;小屏幕还会记载layout的布局。限定符包括了屏幕大小、分辨率、方向等。

       2.使用最小宽度限定符,在res目录下建立layout-sw600dp文件夹,若屏幕宽度大于600dp,会加载layout-sw600dp下的布局;若小于,则仍然会加载默认。

      (五)碎片的实践

       感觉暂时没啥用,跳过不看。