第一次自己做小的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跳转,好像是需要回调函数?待解决.
已解决.
新问题,如果显示出点击的图片,传到详情页.