Android Studio 入门——002 控件篇
最近看的书是第一行代码老师推荐--感觉讲的很基础,很对小白的胃口。好了不罗嗦别的了,干货。
------------------------------------------------------------------------------------------------------------
控件篇
1.TextView这是一个再简单不过的控件---用来在页面上显示一些文本信息【这个控件必须声明的属性--宽、高、内容、id】
2.Button是程序用于和用户进行交互的一个重要控件--那些基本的属性和TerxtView差不多唯一一个比较骚的一点就是android:onClick="funcName"[这个点,在空间的基础入门不需要太多的了解,感觉这个事件处理的方式更加的简单一些]
3.EditText---程序与用户进行交互的控件---简单基础的控件在AndroidStudio里面都比较好实现,直接给一个id、宽度、高度差不多就能够满足一个空间的基本需求,然后再对不同的控件添加特殊的属性就好了。回到这个EditText里面特殊点的东西就是初始的输入框控件的提示文字--android:hint="text" 还有一个设置最大行数【保证输入再多EditText也不会继续拉伸】
4.ImageView--首先图片资源放到Drawable文件夹下,这样在后面文件名就可以直接R.drawable.name来获取对应文件。
5.ProgressBar--用于界面显示一个进度条【可以用style来改变进度条的样式】
6.AlertDialog--在这个里面需要注意的是要写cancel和ok按钮的时间处理方法
7.ProgressDialog--会显示一个带有进度条的对话框
----上面就是一些【基本上所有】基本的控件,接下来就来了解一下这些控件的布局方式,更加深入的美化自己的界面--------------------------------------
布局方式
什么是布局?布局是一种用于放置控件的容器,它可以按照一定的规律调整内部空间的位置,从而达到自己想要实现的精美界面。
1.线性布局 LinearLayout
线性布局会将它所包含的空间在线性方向上依次排列。
线性布局最重要的一个属性莫过于:android:weight【设置对应控件的权重,而后计算宽度】example:在一个editview和button控件水平排列的时候,不同的手机屏幕大小不一样,但是要求设计的button的大小不变。那么就给button的width设置为wrap_content,EditView的width设置权重为1就能够完美的展现设计好的button而不至于它被拉伸,影响外观。
2.相对布局 RelativeLayout 这种布局方式显得更加的随意,它通过相对定位的方式让空间出现在想要的位置---这种布局对于那种相对位置关系确定的控件很有用。
android:layout_alignParentLeft="bool" android:layout_abolve/below/toLeftOf/toRightOf="@id/id"//这个是通过id获取到控件
3.帧布局 Frame Layout 这种布局方式相对于前面的两个就很简单了,应用场景也少得多。这种布局没有方便的定位方式,所有控件都会默认摆放在布局的左上角。
4.百分比布局 仔细看看上面的三种布局方式,也就LinearLayout支持按照比例实现控件的大小
但是百分比布局不算是默认布局,为此support库里面已经定义了该布局,我们需要做的就是在build.gracdle文件里面
dependencies{
compile fileTree(dir: 'libs',include:['*.jar'])
compile 'com.android.support.appcompat-v7:24.2.1'
compile 'com.android.support:percent:24.2.1' //在这个闭包里面添加这一行代码就好了
testCompile 'junit:junit:4.12'}
在使用百分百布局的时候需要把文件路径全部都写出来<android.support.percent.PercentFrameLayout></android.support.percent.PercentFrameLayout>
然后在这个里面就可以直接利用百分比创建控件的大小。
总结:在仔细看过这个布局以后,个人认为百分比布局完全可以在Linear Layout的布局里面利用weight来代替。【当然,又可以是自己还没有真正的实践,还不知道百分百布局的好处】
5.自定义布局 引入布局---对于那些拥有同样的控件的活动,可以考虑把那些基本的控件打包作为一个布局,然后每个活动只需引用这个布局就好。从而节省了代码量当然也是更加的方便。
当然第一步就是自定义一个布局--创建布局,命名为title;接下来就是在新的布局里面引用这个固定模式的布局--<include layout="@layout/title>
创建一个自定义控件TitleLayout--首先新建一个类TitleLayout extends LinearLayouot
实现其构造函数TItleLayout(Context context,AtrributeSet attrs){
super(context,attrs);
LayoutInflater.from(context}.inflate(R.layout.title , this);}
想要在这里引用这个布局就需要包括这个完整的文件路径了,com.example.uicuntomviews.TitleLayout。然后,这个控件就被导入到对应的布局中了。至于要实现按钮点击的效果,直接在TitleLayout类里面获取到对应button的id,然后添加onClick()事件就好了。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------据说是最难用的控件----ListView
首先是准备工作:1.你要展示的对象--listview里面一条一条的信息打包成为一个类;2.怎么样来展示--list每一条的展示布局;3.adapter--适配器,用来把你要展示的对象和该对象的布局方式绑定在一起。
-------由于自己属于小白,对于所以目前没办法只好按照大牛指的道路前进。那么在这里,关于ListView的东西感觉没有什么特别的地方,然后就投靠了更为强大的控件RecyclerView。
在build.gradle dependences的闭包里面添加recyclerview的support,然后sync now 同步一下你的操作。
接下来就是在你的activity.layout 里面用recyclerview 还是老规矩完整的路径android.support.v7.widget.RecyclerView。
<在这里需要加一点干货viewholder。这个能够节省加载时间---毕竟小白无法用自己的话解释这个>
适配器WeaponAdapter extends RecyclerVIew.Adapter<WeaponAdapter.ViewHolder>{
private List<Weapon> mWeaponList; //适配器数据源
static class ViewHolder extends RecylerView.ViewHolder{ //weaponAdapter内部类viewholder的实现--也就是把它和weapon【对象】类的东西一致
ImageView weaponImage; //weapon有什么成员 这个里面也需要什么成员 然后在构造函数里面给其赋值
TextView weaponName; //看起来很简单,对应该就是这么的简单
public ViewHolder(View view){
super(view);
this->weaponImage=(ImageView)view.findVIewById(R.id.weapon_img);
this->weaponName=(TextView)view.findVIewById(R.id.weapon_name);
}
}
public WeaponAdapter(List<Weapon> weaponList){ //waponadapter的构造函数 初始化数据源
mWeaponList=weaponList;
}
@override
public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){ // weaponadapter重写创建view holder的函数
VIew view =LayoutInflate.from(parent.getContext()).inflate(R.laytou.weapon_item,parent,false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@override
public void onBindViewHolder(ViewHolder holder,int position){
Weapon weapon=mWeaponList.get(position);
holder.weaponImage.setImageRescourse(weapon.getImage());
holder.weaponName.setText(weapon.gerName());
}
@override
public int getItemCount(){
return mWeaponList.size();
}
}
代码一堆,想放弃?哪有那么难哦,仔细看看就知道这个多么的清晰明了了。
仔细的对比一下,就知道用了viewholder和没用viewholder的代码思路都是差不多的,只不过viewholder把view装在一起了。
在activity里面编写代码的时候顺序:
1.初始化数据源;2.实例化recyclerview/listview;3.设置布局管理器;4.给实例化的对象添加布局管理器;5.创建适配器;6.给实例化的对象设置适配器。【然后就完成了-—-】
------------------------------------------------------------------------------------------------------------------------
大牛们说recyclerview强大肯定有他的道理,就比如下面的干货:实现横向滚动、瀑布流布局、网格布局。
横向滚动:这个实现起来就很简单,只需要两步:1.把weapon_item.layout里面的宽度设置为wrap_content【毕竟是横向,如果设置的是match_parent那样效果不明显】,顺便把weapon_item.layout的布局orientation改为vertical;2.在给实例化的对象recyclerview设置管理器之前,设置它的orientation为horizontal,然后运行就达到效果了。
瀑布流布局:这个的更改更加的简单。只需要把LinearLayoutManager换为StaggeredGridLayoutManager【构造函数有两个参数:第一个是瀑布的列,第二个是瀑布的方向】
网格布局:和瀑布流布局一样。这两个的差异,或许就在于每一块的适应位置的问题了;网格布局,整整齐齐的排列,瀑布流布局参差不齐的按照view大小排列,各有各自的好处。
最后的最后,提醒自己recycleview的点击事件。写在创建viewholder的函数里面,创建view holder以后就开始监听。
【感觉有点怪怪的,偷窥一样。但是listener不就是一个偷窥者嘛】
------------------------------------哇 总结完了我的控件篇-------------------------------------------------------------
------------------------------------------有点长,但是毕竟就是这么的多的东西啊,我能怎么办-------------------------