视频项目笔记(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);    }}

好了,笔记写好,今天内容有点多,天天防腐的视频教学第二、三天完成,谢谢老师的一番讲解,记录下来,方便以后遇到问题可以查找帮助。下课噜!