视频项目笔记(2)
来源:互联网 发布:双色球中奖算法 编辑:程序博客网 时间:2024/06/05 10:41
天天防腐笔记(2)
坚持看视频,忘记的东西只能铭记
- 1、Fragment的数据加载方法放在哪里
请求后台数据应该放在onActivityCreated()中
- 2、fragment findViewById()返回null完全解析
我们在onCreateView() inflate加载了布局mRootView , 我们可以在这里去
mRootView .findViewById()会报空指针。
mRootView = inflater.inflate(R.layout.fragment_home,null);
在inflate()参数里设置了flase, 说明当前fragment的布局文件并没有被加到activity的布局中当onCreateView执行完了,fragment的布局文件被加载了。所以只要在onCreateView方法之后getActivity().findViewById。我们也可以通过mRootView .findViewById()。还有就是你界面在哪就可以在哪找到,否则无法去findViewById
- 3、处理登录界面的逻辑
判断本地是否有没有输入,有就使用okHttp,四步走搞定
private void dealUserLogin() { //本地验证 String userPhone = mUserPhoneEt.getText().toString().trim(); String password = mUserPasswordEt.getText().toString().trim(); if(TextUtils.isEmpty(userPhone)){ Toast.makeText(this,"请输入用户名",Toast.LENGTH_LONG).show(); return; } if(TextUtils.isEmpty(password)){ Toast.makeText(this,"请输入密码",Toast.LENGTH_LONG).show(); return; } //往后台提交数据 OKhttp //1.创建一个OkHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.构造参数的boby MultipartBody.FORM表单形式 MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); //2.2封装参数 builder.addFormDataPart("appid","1"); builder.addFormDataPart("cell_phone",userPhone);//添加多个参数 builder.addFormDataPart("password", MD5Util.strToMd5(password));//Md5 ASE //3.构造一个请求 post提交里面参数是builder url()请求的路径 Request request = new Request.Builder().url("http://v2.ffu365.com/index.php?m=Api&c=Member&a=login") .post(builder.build()).build(); //4.发送一个请求 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //失败 } @Override public void onResponse(Call call, Response response) throws IOException { //成功 数据在response里面 获取后台给我们的JSON字符串 String result = response.body().string(); Log.e("TAG",result); Gson gson = new Gson(); UserLoginResult loginResult = gson.fromJson(result,UserLoginResult.class); dealLoginResult(loginResult); } }); }
接着处理登录结果逻辑,如果成功就保存状态并更新UI,并设置能点击收藏的Tab能显示
这里使用SharedPreferences(轻量级的存储)来记录对应的状态,并且将Gson解析回来的用户信息写入sp对象中,需要把用户对象转换为JSON字符串存入文件中
(1)使用getSharedPreferences(文件名称,操作模式) 来获取对象
(2)edit()方法来获取一个SharedPreferences.Editor对象,该对象可以去调用方法putXXX添加对应的键值对,然后提交
(3)读取数据
SharedPreferences pref = getSharedPreferences(“info”,MODE_PRIVATE);
boolean islogin = pref.getBoolean(“is_login”,”“);//第二个参数为默认值
SharedPreferences sp=getSharedPreferences(“info”,MODE_PRIVATE);
//登录才有收藏
sp.edit().putBoolean(“is_login”,true).commit();
//处理服务返回的数据 private void dealLoginResult(UserLoginResult loginResult) { //首先判断有没有成功 if(loginResult.getErrcode() == 1){ //成功处理 手动关掉该界面 //需要保存登录状态 当前设置为登录 //info生成.xml文件 SharedPreferences sp = getSharedPreferences("info",MODE_PRIVATE); //登录才有收藏 sp.edit().putBoolean("is_login",true).commit(); //需要保存用户信息 UserLoginResult.DataBean userData = loginResult.getData(); //SharedPreferences 怎么保存对象 转换为JSON String -> SharedPreferences Gson gson = new Gson(); String userInfoStr = gson.toJson(userData); //保存用户信息为JSON的字符串 sp.edit().putString("user_info",userInfoStr).commit(); //关掉这个页面 finish(); }else{ //登录失败 Toast.makeText(this,loginResult.getErrmsg(),Toast.LENGTH_SHORT).show(); } }
- 4、处理退出方法(SharedPreferences )
使用SharedPreferences 方法传入false的值,设置为没有登录
case R.id.user_exit_login: //把登录状态置为空 SharedPreferences sp = mContext.getSharedPreferences("info",Context.MODE_PRIVATE); sp.edit().putBoolean("is_login",false).commit(); break;
- 5、处理收藏tab的显示(SharedPreferences )
因为收藏是得去登录才有,所以点击后的判断登录状态。所以在MainActivity中,处理事件
在判断跳转时,跳转到登录界面,找到原来的位置,用这一句即可
int mCurrentPosition = mViewPager.getCurrentItem(); switch (mCurrentPosition){ case 0: mHomeRb.setChecked(true); break; case 1: mCollectionRb.setChecked(true); break; case 2: mMessageRb.setChecked(true); break; case 3: mCenterRb.setChecked(true); break;
改进后,在ViewPager设置监听,处理RadioButton的事件
onPageSelected(mViewPager.getCurrentItem());
@Override public void onPageSelected(int position) { //切换到相应的页面图标点亮 switch (position){ case 0: mHomeRb.setChecked(true); break; case 1: mCollectionRb.setChecked(true); break; case 2: mMessageRb.setChecked(true); break; case 3: mCenterRb.setChecked(true); break; } }
case R.id.collection_rb: //先判断用户有没有登录 SharedPreferences sp = getSharedPreferences("info",MODE_PRIVATE); boolean isLogin = sp.getBoolean("is_login",false); if(isLogin){ //切换到第二页 mViewPager.setCurrentItem(1,false); }else{ //跳转到登录界面 Intent intent = new Intent(MainActivity.this, UserLoginActivity.class); startActivity(intent); //并且获取当前的pager onPageSelected(mViewPager.getCurrentItem()); } break;
- 6、在CenterFragment中onResume,判断登录状态以及登录中心的一栏变化(SharedPreferences)
这里加了判断用户登录和判断用户信息对应存储在info文件的信息,因为返回的是JSON字符串,所以把这个信息转换为对象,当对象为空的时候,给它设置信息
@Override public void onResume() { super.onResume(); //判断用户是否登录,显示登录的中心头部,否则显示未登录的中心头部 SharedPreferences sp = mContext.getSharedPreferences("info",Context.MODE_PRIVATE); boolean isLogin = sp.getBoolean("is_login",false); if(isLogin){ mUserLoginedLl.setVisibility(View.VISIBLE); mUserLoginTv.setVisibility(View.GONE); //登录完成后设置用户信息 String userInfoStr = mContext.getSharedPreferences ("info",Context.MODE_PRIVATE).getString("user_info",null); if(TextUtils.isEmpty(userInfoStr)){ //如果为空,把用户信息JSON转换为对象 Gson gson = new Gson(); //转化为哪种UserLoginResult.DataBean UserLoginResult.DataBean userInfo = gson.fromJson(userInfoStr, UserLoginResult.DataBean.class); //设置图片 Glide.with(mContext).load(userInfo.getMember_info().getMember_avatar()).into(mUserHeadIv); //设置名称 mUserNameTv.setText(userInfo.getMember_info().getMember_name()); mUserLocationTv.setText(userInfo.getMember_info().getMember_location_text()); } }else{ //没有登录 mUserLoginTv.setVisibility(View.VISIBLE); mUserLoginedLl.setVisibility(View.GONE); } }
-7、自定义圆角图片,直接拿来用
public class RoundImageView extends ImageView{ private int mBorderThickness = 0; private Context mContext; private int defaultColor = 0xFFFFFFFF; // 如果只有其中一个有值,则只画一个圆形边框 private int mBorderOutsideColor = 0; private int mBorderInsideColor = 0; // 控件默认长、宽 private int defaultWidth = 0; private int defaultHeight = 0; public RoundImageView(Context context) { super(context); mContext = context; } public RoundImageView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; setCustomAttributes(attrs); } public RoundImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; setCustomAttributes(attrs); } private void setCustomAttributes(AttributeSet attrs) { TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.roundedimageview); mBorderThickness = a.getDimensionPixelSize( R.styleable.roundedimageview_border_thickness, 0); mBorderOutsideColor = a .getColor(R.styleable.roundedimageview_border_outside_color, defaultColor); mBorderInsideColor = a.getColor( R.styleable.roundedimageview_border_inside_color, defaultColor); } @Override protected void onDraw(Canvas canvas) { Drawable drawable = getDrawable(); if (drawable == null) { return; } if (getWidth() == 0 || getHeight() == 0) { return; } this.measure(0, 0); if (drawable.getClass() == NinePatchDrawable.class) return; Bitmap b = ((BitmapDrawable) drawable).getBitmap(); Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); if (defaultWidth == 0) { defaultWidth = getWidth(); } if (defaultHeight == 0) { defaultHeight = getHeight(); } // 保证重新读取图片后不会因为图片大小而改变控件宽、高的大小(针对宽、高为wrap_content布局的imageview,但会导致margin无效) // if (defaultWidth != 0 && defaultHeight != 0) { // LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( // defaultWidth, defaultHeight); // setLayoutParams(params); // } int radius = 0; if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {// 定义画两个边框,分别为外圆边框和内圆边框 radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 * mBorderThickness; // 画内圆 drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor); // 画外圆 drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor); } else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {// 定义画一个边框 radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness; drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor); } else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {// 定义画一个边框 radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness; drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderOutsideColor); } else {// 没有边框 radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2; } Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius); canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight / 2 - radius, null); } /** * 获取裁剪后的圆形图片 * * @param radius * 半径 */ public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) { Bitmap scaledSrcBmp; int diameter = radius * 2; // 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片 int bmpWidth = bmp.getWidth(); int bmpHeight = bmp.getHeight(); int squareWidth = 0, squareHeight = 0; int x = 0, y = 0; Bitmap squareBitmap; if (bmpHeight > bmpWidth) {// 高大于宽 squareWidth = squareHeight = bmpWidth; x = 0; y = (bmpHeight - bmpWidth) / 2; // 截取正方形图片 squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight); } else if (bmpHeight < bmpWidth) {// 宽大于高 squareWidth = squareHeight = bmpHeight; x = (bmpWidth - bmpHeight) / 2; y = 0; squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight); } else { squareBitmap = bmp; } if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) { scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true); } else { scaledSrcBmp = squareBitmap; } Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); Paint paint = new Paint(); Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight()); paint.setAntiAlias(true); paint.setFilterBitmap(true); paint.setDither(true); canvas.drawARGB(0, 0, 0, 0); canvas.drawCircle(scaledSrcBmp.getWidth() / 2, scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(scaledSrcBmp, rect, rect, paint); // bitmap回收(recycle导致在布局文件XML看不到效果) // bmp.recycle(); // squareBitmap.recycle(); // scaledSrcBmp.recycle(); bmp = null; squareBitmap = null; scaledSrcBmp = null; return output; } /** * 边缘画圆 */ private void drawCircleBorder(Canvas canvas, int radius, int color) { Paint paint = new Paint(); /* 去锯齿 */ paint.setAntiAlias(true); paint.setFilterBitmap(true); paint.setDither(true); paint.setColor(color); /* 设置paint的 style 为STROKE:空心 */ paint.setStyle(Paint.Style.STROKE); /* 设置paint的外框宽度 */ paint.setStrokeWidth(mBorderThickness); canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint); }}
好了,笔记写好,今天内容有点多,天天防腐的视频教学第二、三天完成,谢谢老师的一番讲解,记录下来,方便以后遇到问题可以查找帮助。下课噜!
- 视频项目笔记(2)
- 视频项目笔记(1)
- 视频项目笔记(3)
- 视频项目笔记(4)
- 视频项目笔记(5)
- MIT algorithm 笔记(视频2)
- 视频笔记2
- OC视频笔记-2
- 笔记十八(视频)
- 搜车记项目演示(视频)
- 基于Z301P摄像头 H.264OK6410的远程视频web监控 项目笔记2
- Eclipse下为Android项目进行单元测试(传智播客视频笔记)
- 基于Z301P摄像头 H.264OK6410的远程视频web监控 项目笔记5(CGI)
- 基于mjpg-streamer远程视频WEB监控 项目笔记一
- 基于mjpg-streamer远程视频WEB监控 项目笔记二
- 基于mjpg-streamer远程视频WEB监控 项目笔记一
- 基于mjpg-streamer远程视频WEB监控 项目笔记二
- 手机影音项目笔记(二)-----视频播放处理
- 3.简单封装ajax
- AI初识
- React native和native交互
- C语言中字符串处理小案例(切割)
- SSH与SSM学习之Spring18——Spring整合JDBC
- 视频项目笔记(2)
- MyBatis框架简单入门
- ionic工程引入cordova plugin camera 插件编译报错问题总结
- 数据库开发技术 课堂笔记8 处理并发
- mac gdb调试 解决warning: unhandled dyld version (15) [Inferior 1 (process 660) exited normally]
- 欢迎使用CSDN-markdown编辑器
- Codeforces Round #443 (Div. 2)
- DBCP数据库连接池的简单使用
- 效果图第二课笔记:几何体建模