凤凰demo小节
-
再做一个demo时呢,首先一定得确定需求,具体实现先放一边。
-
再以需求为目的,扩展出需要的工具,与之涉及的实体类。
-
也应确定大致需要用到那些控件,对每个控件的应用呢都应该有基本的认识。
-
千万不能忘记在androidManifest 中添加应用需要的权限。
新认识的控件
-
StaggeredGridLayoutManager类是RecyclerView的另一个布局管理类,其类构造函数接收两个参数,参数一为同一个水平(或同一个垂直)有几个子项布局,参数二为子项布局放置方向。
-
cardView 多用在RecyclerView中的子项布局,以卡片的形式包裹内容。容器类型的布局。
-
circleimageview 此控件呢会把bitmap的图片以圆形的形式显示。
-
glide是一个自带缓存的图片加载库。
基本的使用方式如下所示:public static void loadpicture(String url, ImageView view){ Glide.with(MyApplicatioin.getContext()). load(url). error(R.drawable.ic_image_loadfail). into(view); }
with方法参数要传入Context参数,以构建环境,
load方法参数传入需要加载的图片url(即图片地址)。
error方法参数传入在没有找到图片url的情况下(错误),显示的图片。
into方法参数为需要显示图片的View 控件。
保存图片的方法
需注意的地方有:保存位图时呢,调用bitmap对象的compress方法()就可保存图片,此方法呢接收三个参数。参数一为保存bitmap的格式,一般有png与jpg
,参数二图片的压缩率,无论是那种格式千万不能传入100即意为100%的压缩率,程序会崩溃的。参数三保存位图的fileOutputStream对象。以png格式保存图片呢,多少的压缩率都无所谓。
构建bitmap保存的路径时,并不需要文件的存在,有路径就好,compress方法会自动创建文件。在保存时最好开启子线程来做事,用java流写文件还是蛮费时的。当使用glide加载图片后呢,要获取imageView的bitmap一定把imageView对象getDrawable()获取的对象转型为GlideBitmapDrawable然后再用getBitmap()方法获取位图,这样才能保存进去。
public static File file;
public synchronized static Boolean saveBitmap(final Bitmap bitmap , String jpgMark) {
try {
file = new File(Environment.getExternalStoragePublicDirectory("Icon"),"zuimei"+jpgMark+".png");
if(!file.exists()){
new Thread(new Runnable() {
@Override
public void run() {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG,99, outputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
if(outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
return true;
}else {
return false;
}
}catch (Exception e){
e.printStackTrace();
return false;
}
}
问题小节
-
编写RecyclerView的子项视图时呢,高度设置成wrap-content就好,或者显示图片的子项视图呢直接规定需要多少dp就好。
-
在编写RecyclerView的每个项目的点击事件时,直接在viewHolder对象构造函数里注册,可以提高性能。
private OnitemClickListener itemlistener; public void setOnitemClickListener(OnitemClickListener listener) { this.itemlistener = listener; } class ZmImageHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private ImageView imageView; private TextView mText; public ZmImageHolder(View itemView) { super(itemView); itemView.setOnClickListener(this); imageView = (ImageView) itemView.findViewById(R.id.image_content_main2); mText = (TextView) itemView.findViewById(R.id.image_content_text2); } @Override public void onClick(View view) { if (itemlistener != null) itemlistener.onitemClick(view,zmlist.get(this.getLayoutPosition())); } } }
其中呢通过viewholder对象的getLayoutPosition()方法来获得当前position(子项布局位置)
-
当两个碎片同时添加在同一个fragmelayout时,即时调用hide()了,也出现重叠时呢,一定要在fragment的根布局中设置背景为白色。
-
在activity中用getSupportFragmentManager()方法呢可以获取到管理V4包里碎片的管理对象,但是如果需要在fragment中再使用碎片,就不能通过此方法获取FragmentManager对象,因可能出现白页情况。
需使用getChildFragmentManager()方法来获取子碎片的fragmentManager对象,才能正确显示内容。 -
某些情况下,一定要加对象为空的判断,不然极易出现空指针的情况。activity一般在调用finish()方法,那些view对象也就被回收了,因其主宿主都已经被销毁了。
-
有些基本需要多次写的就应该创建一个父类,然后新类继承就好。比如activity 和 Fragment。
-
当创建java流对象后,写完或读完后一定要调用close()方法关闭了。要得到最终的流对象,至少需要一个对象来装饰,第一个对象呢是最终写入或读取的目标,第二对象用来装饰流的行为。如果要操作的内容中含有中文时呢,还需要一个适配器对象把InputStream或OutputStream转换为Reader或Writer对象。
inputStream = MyApplicatioin.getContext().openFileInput(filName); reader = new BufferedReader(new InputStreamReader(inputStream)); outputStream = MyApplicatioin.getContext().openFileOutput(fileName, Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(outputStream));
-
从服务器返回的json数据呢,有以下两种处理方式:
private String loadPhoenix(String response , int postion) throws JSONException { JSONArray jsonArray = new JSONArray(response); return jsonArray.getJSONObject(postion).getString("item"); } private String loadZm(String response) throws JSONException { JSONObject object = new JSONObject(response); return object.getJSONObject("data").getString("images"); }
因view视图需要的实体类呢,会被一层层的包裹起来,所以就需提出我们需要那部分内容。
方法一对应的时,服务器直接返回的是数组形式,且属于item这个键名才能获取到。
方法二对应的是,服务返回的为对象,对象套对象,然后获取images的json内容。
json数据是通过键对值得形式保存的。{}表示对象,[]表示数组。
-
透明状态栏和透明导航栏,在activity的onCreate方法中进行操作。(只有安卓5.0才支持)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ Window window = getWindow(); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); // window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setNavigationBarColor(Color.TRANSPARENT); window.setStatusBarColor(Color.parseColor("#cccc99")); }
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION表示让应用的UI布局延伸到状态栏和导航栏.
一定不能少SYSTEM_UI_FLAG_LAYOUT_STABLE此flag。最后再把两者的颜色设置为透明色。
SYSTEM_UI_FLAG_HIDE_NAVIGATION和
SYSTEM_UI_FLAG_FULLSCREEN表示直接把状态栏和导航栏隐藏。
SYSTEM_UI_FLAG_IMMERSIVE_STICKY表示让应用内容变为沉浸式的,不为因点击就显示状态栏和导航栏,就像安卓游戏那样。
-
RecyclerView要设置OnScrollListener呢,通过addOnScrollListener()方法,要解除呢通过clearOnScrollListener()方法。复写
public void onScrollStateChanged(RecyclerView recyclerView, int newState) 与 public void onScrolled(RecyclerView recyclerView, int dx, int dy) 。
参数newState为当前RecyclerView的状态值
RecyclerView.SCROLL_STATE_IDLE 表示视图不在滚动。
参数dx,dy为当前坐标,通过存储上次的值,两次再减就能得出滑动方向。
通过布局管理器对象的findLastVisibleItemPosition()方法获取子项最后可见的position,
- 当使用DialogFragment时,用onCreateView()创建视图不加载时呢,就要使用onCreateDialog()方法,创建一个AlertDialog对象,并调用setView()方法显示的view,最后再返回一个AlerDialog 对象。
网友评论