开发问题总结

开发上遇到的一些小问题

近段时间在开发上遇到了一些小问题,之前在利用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();设置布局可以达到相同的效果,但是不知道这两者之间的区别,希望大神们来指点。
将window背景设置为透明后的效果


以上是最近遇到的一些小问题,以后还会把遇到的一些问题和解决办法写在这篇博文归纳总结,增加自己的记忆和理解。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值