安卓初体验~
其实这并不算是初体验吧,毕竟大三的时候已经玩过android开发了,而且看起来也蛮像回事儿的.
只不过当时搞了NFC,业务逻辑和网络请求.剩下的最重要的界面和界面跳转,都是在鹅厂的望神帮我写的~
第一节课其实我没去
那一节课,据说老师讲了布局文件
然后好像就布置了一个计算器的作业,然后就没什么了.
反正,我就在界面编辑器里面拖控件.然后findViewById,之后给他们做了一些逻辑~
第二节课说是要做SD卡读取图片,并且显示出来
我一想,觉得有点儿难啊,于是就开始查官方文档去了,
整理了一下,获取文件夹的路径,文件夹内文件这些好像都不难.
选择一个内容显示估计也不难,但是如何做一个漂亮的选择页面,可能比较复杂.
我打算用GridView,做一个和相册一样.
Let’s do this
先搞了一个SDCardHelper的类(写iOS时候留下的习惯,各种Helper)
//外部储存是否可写
static public boolean isExternalStorageWritable()
//外部储存是否可读
static public boolean isExternalStorageReadable()
//储存路径
static public String storagePath()
//为GridView用的文件列表
static public List<GridItem> getFileList()
Android的GridView和iOS的UICollectionView好像差不太多
Android的GridView需要的适配器里面需要重写
public int getCount();
public Object getItem(int position);
public long getItemId(int position);
public View getView(int position, View convertView, ViewGroup parent);
iOS的UICollectionView需要实现DataSource协议的
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;
-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
这样就可以正常显示一个GridView(UICollectionView)
可是,我要自定义控件呀!不然用原始的GridView中每个item的View或者UICollectionView中原始的UICollectionViewCell
,那得多难看…
在iOS中,只要写一个继承于UICollectionViewCell的类,对它进行界面操作,数据操作,并且在Protocol中复用Cell并且返回,就可以完成目的
在Android中,貌似没有类似UICollectionViewCell的东西.所以得自己重写一个类,用来持有Item的xml布局文件中的各个控件
import android.widget.ImageView;
import android.widget.TextView;
/**
* Created by vikingwarlock on 16-9-23.
* This is the class for view
*/
public class GridItemView {
public ImageView imageView;
public TextView filename;
}
之前的图片列表,也专门写了一个类,用来存放这个数据
import java.io.Serializable;
/**
* Created by vikingwarlock on 16-9-23.
* This is a class that represent a grid item
*/
public class GridItem implements Serializable{
public String filepath;
public String filename;
}
这里用了一个Serializable
,是为了后面Intent传递用的~
最后在Adapter类里面实现View
@Override
public View getView(int position, View convertView, ViewGroup parent) {
GridItemView item;
GridItem data = gridItemList.get(position);
if (convertView == null) {
convertView = inflater.inflate(R.layout.gridviewitem, null);
item = new GridItemView();
item.filename = (TextView) convertView.findViewById(R.id.itemName);
item.imageView = (ImageView) convertView.findViewById(R.id.itemImage);
convertView.setTag(item);
} else {
item = (GridItemView) convertView.getTag();
}
ImageLoader.getInstance().displayImage("file://"+data.filepath,item.imageView);
item.filename.setText(data.filename);
return convertView;
}
界面就差不多搞定了~
至于点击效果,iOS依然是实现一个Protocol~就可以了
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;
Android需要手动添加
GridView gv = (GridView) findViewById(R.id.gridView);
if (gv != null) {
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
GridItem item = datalist.get(position);
Intent intent=new Intent();
intent.setClass(SDView.this,MainActivity.class);
Bundle bundle=new Bundle();
bundle.putSerializable("result",item);
intent.putExtras(bundle);
setResult(2,intent);
finish();
}
});
这里的gv是GridView的意思,不要想歪了.
做了一堆和Bundle有关的事情,主要是为了Intent中可以传递一个对象,而不仅仅是字符串.
setResult()用来传递一个Intent回上一个需要Result的Activity.
finish()就是结束当前Activity.
这个花了我最多时间的东西就这样做完了~
当然啦,后面还遇到了图片显示的问题.比如卡住啊,比如OOM啊~最后借助了universal-image-loader
都解决了!!
最后坐在旁边的同学跟我说,他们的代码,只有几十行.原来老师给的demo中获取图片是这样写的
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
/* 使用Intent.ACTION_GET_CONTENT这个Action */
intent.setAction(Intent.ACTION_GET_CONTENT);
/* 取得相片后返回本画面 */
startActivityForResult(intent, 1);
}
我好生气!说好的操作SD卡呢!
这样的写法,和iOS中的UIImagePickerViewController一样了~
Anyway,至少我学会了自定义控件的GridView,体验了一把OOM,还学习了SDCard的操作
还望各位大大指导我!