检索小项目总结

第一次自己做小的app,虽然只有搜索功能,就是对数据库的查功能,但还是遇到很多问题.
首先在做首页ui的时候需要一个类似于浏览器扩展功能图标,使用之前常用LinearLayout不能实现,然后第一次接触了约束布局,真好用,四个方位只要定义三个方位就不会报红.

想仿照大多浏览器的样子,点击首页搜索框然后跳转到真正可以搜索的界面,然后在下方设置recyclerview.当时的疑问是recyclerview的数据绑定,已经解决,很简单,只需要注意notify的位置即可.现在还有一个问题是,在item布局我使用的是cardview布局,是继承framelayout的布局,然后在recyclerview中我设置了两列item显示,那么我怎么定义item之间的间距和边界的间距? 少用margin!!!太影响适配了,最后快写完了发现不能适配太痛苦了.使用padding或者比例.

数据库的使用,使用了郭霖大神参与编写的android框架LitePal,方便好多哦,官网看下文档就可以使用了,第一次添加数据,手动填的,累死,填了好久,下次考虑一下使用可视化工具添加,应该挺省时间的.这方面痛苦的是,我添加完了,我找不到数据库文件…然后有个学长给我说litepal是本地数据库我人都傻了,最后幸好我数据导入在手机上一部分,在data\data\包名中就可以找到啦,把它拉到raw文件夹中,如果没有的话自己新建一个,然后再打包就可以把数据库打包进apk啦.

下面是部分搬运过来的代码
隐藏Navigationbar

//隐藏navigationbar
        View decorView = getWindow().getDecorView();
        int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(option);

这里很多方法都过时了,不过还可以用.

使用高斯库进行图像圆角设置和模糊设置.

//设置背景磨砂效果
        Glide.with(this).load(R.drawable.head)
                .apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3)))
                .into(blurImageView);
            //设置圆形图像
        Glide.with(this).load(R.drawable.head)
                .apply(RequestOptions.bitmapTransform(new CropCircleWithBorderTransformation())).into(avatarImageView);

弹出软键盘.

//弹出软键盘
et_path.setFocusable(true);
et_path.setFocusableInTouchMode(true);
et_path.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(et_path,0);

搜索框中一键删除的实现

 et_path.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                if (et_path.length() > 0){
                    iv_clear.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
        iv_clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                et_path.setText("");
            }
        });
    }

    public void search_back(View view) {
        startActivity(new Intent(SearchAciticity.this, MainActivity.class));
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {


// 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点)
            View v = getCurrentFocus();


            if (isShouldHideInput(v, ev)) {
                hideSoftInput(v.getWindowToken());
            }
        }
        return super.dispatchTouchEvent(ev);
    }


    /**
     * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏
     *
     * @param v
     * @param event
     * @return
     */
    private boolean isShouldHideInput(View v, MotionEvent event) {
        if (v != null && (v instanceof EditText)) {
            int[] l = { 0, 0 };
            v.getLocationInWindow(l);
            int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
                    + v.getWidth();
            if (event.getX() > left && event.getX() < right
                    && event.getY() > top && event.getY() < bottom) {
// 点击EditText的事件,忽略它。
                return false;
            } else {
                return true;
            }
        }
// 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点
        return false;
    }
    private void hideSoftInput(IBinder token) {
        if (token != null) {
            InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

将raw中数据库文件打入手机

private void copyDataBaseToPhone() {
        DataBaseUtil util = new DataBaseUtil(this);
        // 判断数据库是否存在
        boolean dbExist = util.checkDataBase();

        if (dbExist) {
            Log.i("tag", "The database is exist.");
        } else {// 不存在就把raw里的数据库写入手机
            try {
                util.copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

使用URL访问网络图片

//子线程请求网络,Android4.0以后访问网络不能放在主线程中
                    new Thread() {
                        private HttpURLConnection conn;
                        private Bitmap bitmap;

                        public void run() {
                            // 连接服务器 get 请求 获取图片
                            try {
                                //创建URL对象
                                URL url = new URL(path);
                                // 根据url 发送 http的请求
                                conn = (HttpURLConnection) url.openConnection();
                                // 设置请求的方式
                                conn.setRequestMethod("GET");
                                //设置超时时间
                                conn.setConnectTimeout(5000);

                                // 得到服务器返回的响应码
                                int code = conn.getResponseCode();//TODO 此处未执行。
                                //请求网络成功后返回码是200
                                if (code == 200) {
                                    //获取输入流
                                    InputStream is = conn.getInputStream();
                                    //将流转换成Bitmap对象
                                    bitmap = BitmapFactory.decodeStream(is);
                                    //将更改主界面的消息发送给主线程
                                    Message msg = new Message();
                                    msg.what = CHANGE_UI;
                                    msg.obj = bitmap;
                                    handler.sendMessage(msg);
                                } else {
                                    //返回码不等于200 请求服务器失败
                                    Message msg = new Message();
                                    msg.what = ERROR;
                                    handler.sendMessage(msg);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                Message msg = new Message();
                                msg.what = ERROR;
                                handler.sendMessage(msg);
                            }
                            //关闭连接
                            conn.disconnect();
                        }
                    }.start();

启动页延迟跳转

    // 创建Handler对象,处理接收的消息
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case WHAT_DELAY:// 延时3秒跳转
                    goHome();
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        // 调用handler的sendEmptyMessageDelayed方法
        handler.sendEmptyMessageDelayed(WHAT_DELAY, DELAY_TIME);

    }

    /**
     * 跳转到主页面
     */
    private void goHome() {
        Intent intent = new Intent(SplashActivity.this, Sign_in_Activity.class);
        startActivity(intent);
        finish();// 销毁当前活动界面
    }

现在仍未解决的问题是,item的布局与点击recyclerview跳转到对应的详情页面,昨天看了一下,貌似不能直接在点击事件中设置intent跳转,好像是需要回调函数?待解决.
已解决.

新问题,如果显示出点击的图片,传到详情页.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值