开发上遇到的一些小问题
近段时间在开发上遇到了一些小问题,之前在利用Google等搜索引擎都已经解决,现在在博客上总结一些这下问题的解决方案,虽然在技术上没什么难度,不过倒是挺实用的。
1.如何让EditText不自动获取焦点
我们知道在自己的项目当中,经常会从一个页面进入另外一个页面,例如从ActivityA –> ActivityB,如果ActivityB的布局中含有EditText控件,那么它会自动获取焦点而弹出输入法,但是考虑到用户体验我们不想让其自动弹出输入法,可以用一下的方法解决:
在EditText的父级控件上找到一下两个属性并修改为true
-android:foucusable=”true”
-android:foucusableInTouchMode=”true”
这样就可以把EditText的默认获取焦点行为给截断。
2.ScrollView中嵌套滑动控件ListView无法显示所有条目
前段时间做做了一个O2O类项目有这样的需求在ScrollView中嵌套了ListView,Google本不建议滑动控件之间进行嵌套,但是因为项目需求只有找解决办法,在Stackoverflow上找到了一个解决办法:
//动态测量ListViewItem的高度 解决ScrollView嵌套ListView嵌套问题
private void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = lv.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);//获得每一个listview的条目
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
以上代码通过动态的测量每个item的高度在加上所有分割线的高度得到总高度,然后将总高度通过params设置给ListView固定ListView的宽高即可显示所有的条目。
3. Fragment显示隐藏调用的方法
//fragment 显示和隐藏时调用该方法
//参数boolean hidden 为true代表隐藏
@Override
public void onHiddenChanged(boolean hidden) {
//TODO:Do something
}
4.Home键监听封装工具类
/**
* Author: lihongxiang
* Time: 上午 11:13
* Email:lihongxiangleo@163.com
* <p/>
* HOME键监听封装工具类
*/
public class HomeWatcher {
private final Context mContext;
private final IntentFilter mFilter;
private OnHomePressedListener mListener;
private InnerRecevier mReciever;
//回调接口
public interface OnHomePressedListener {
public void onHomePressed();
public void onHomeLongPressed();
}
public HomeWatcher(Context context) {
mContext = context;
mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
}
public void setOnHomePressedListener(OnHomePressedListener listener) {
mListener = listener;
mReciever = new InnerRecevier();
}
/**
* 开始监听注册广播
*/
public void statWatch() {
if (mReciever != null) {
mContext.registerReceiver(mReciever, mFilter);
}
}
/**
* 结束监听注销广播
*/
public void stopWatch() {
if (mReciever != null) {
mContext.unregisterReceiver(mReciever);
}
}
/**
* 广播接收者
*/
class InnerRecevier extends BroadcastReceiver {
final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (reason != null) {
if (mListener != null) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
// 短按home键
mListener.onHomePressed();
} else if (reason
.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
// 长按home键
mListener.onHomeLongPressed();
}
}
}
}
}
}
}
5.自定义dialog遇到的问题
通常情况下自定义dialog需要去掉下图的白色背景边框如下图
如果要去掉这个背景边框调用以下代码即可:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
AlertDialog alertDialog = builder.create();
//View view = LayoutInflater.from(this).inflate(R.layout.icon_layout, null);
//alertDialog.setView(view);
alertDialog.show();
Window window = alertDialog.getWindow();
**window.setBackgroundDrawableResource(android.R.color.transparent);**
WindowManager.LayoutParams attributes = window.getAttributes();
window.setContentView(R.layout.icon_layout);
通过window将背景设置呈透明即可,效果图如下:
同时我还有一个疑惑,通过alertDialog.setView();方法设置布局和window.setContentView();设置布局可以达到相同的效果,但是不知道这两者之间的区别,希望大神们来指点。
以上是最近遇到的一些小问题,以后还会把遇到的一些问题和解决办法写在这篇博文归纳总结,增加自己的记忆和理解。