Просмотр исходного кода

解决 首页搜索控件 焦点问题

ZhangXinYu 6 лет назад
Родитель
Сommit
a1139d2dc9

+ 74 - 13
app/src/main/java/com/webrain/dailypay/ui/activity/MainActivity.java

@@ -1,9 +1,13 @@
 package com.webrain.dailypay.ui.activity;
 
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v7.widget.CardView;
+import android.view.MotionEvent;
 import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
 import android.widget.RelativeLayout;
 
 import com.webrain.baselibrary.AppConstant;
@@ -118,19 +122,6 @@ public class MainActivity extends BaseActivity<MainPresenter> implements MainCon
         EventBus.getDefault().unregister(this);
     }
 
-    /**
-     * tab选中状态
-     *
-     * @param checkView
-     */
-    private void initTabCheck(View checkView) {
-        rlResume.setSelected(false);
-        rlPosition.setSelected(false);
-        rlMe.setSelected(false);
-        rlMsg.setSelected(false);
-        checkView.setSelected(true);
-    }
-
     @Override
     public void onTabItem(List<TabItemBean> tabItemBeanList) {
         if (mAdapter == null) {
@@ -157,4 +148,74 @@ public class MainActivity extends BaseActivity<MainPresenter> implements MainCon
             vRelease.setEnabled(false);
         }
     }
+
+    /**
+     * 清理焦点
+     *
+     * @param ev
+     * @return
+     */
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+            View v = getCurrentFocus();
+            //当isShouldHideInput(v, ev)为true时,表示的是点击输入框区域,则需要显示键盘,同时显示光标,反之,需要隐藏键盘、光标
+            if (isShouldHideInput(v, ev)) {
+
+                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+                if (imm != null) {
+                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+                    //处理Editext的光标隐藏、显示逻辑
+                    if(mAdapter!=null&&mAdapter.getResumeFragment()!=null)
+                        mAdapter.getResumeFragment().clearFocus();
+                }
+            }
+            return super.dispatchTouchEvent(ev);
+        }
+        // 必不可少,否则所有的组件都不会有TouchEvent了
+        if (getWindow().superDispatchTouchEvent(ev)) {
+            return true;
+        }
+        return onTouchEvent(ev);
+    }
+
+    /**
+     * 隐藏显示键盘
+     *
+     * @param v
+     * @param event
+     * @return
+     */
+    public boolean isShouldHideInput(View v, MotionEvent event) {
+        if (v != null && (v instanceof EditText)) {
+            int[] leftTop = {0, 0};
+            //获取输入框当前的location位置
+            v.getLocationInWindow(leftTop);
+            int left = leftTop[0];
+            int top = leftTop[1];
+            int bottom = top + v.getHeight();
+            int right = left + v.getWidth();
+            if (event.getX() > left && event.getX() < right
+                    && event.getY() > top && event.getY() < bottom) {
+                // 点击的是输入框区域,保留点击EditText的事件
+                return false;
+            } else {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * tab选中状态
+     *
+     * @param checkView
+     */
+    private void initTabCheck(View checkView) {
+        rlResume.setSelected(false);
+        rlPosition.setSelected(false);
+        rlMe.setSelected(false);
+        rlMsg.setSelected(false);
+        checkView.setSelected(true);
+    }
 }

+ 6 - 1
app/src/main/java/com/webrain/dailypay/ui/adapter/viewpager/FragmentPageTabAdapter.java

@@ -18,6 +18,7 @@ import java.util.List;
 public class FragmentPageTabAdapter extends FragmentStatePagerAdapter {
     private List<TabItemBean> listTitle;
     private Context mContext;
+    private ResumeFragment resumeFragment;
 
     public FragmentPageTabAdapter(FragmentManager fm, Context mContext, List<TabItemBean> listTitle) {
         super(fm);
@@ -30,7 +31,8 @@ public class FragmentPageTabAdapter extends FragmentStatePagerAdapter {
         //新建一个Fragment来展示ViewPager item的内容,并传递参数
         BaseFragment fragment = null;
         if (TextUtils.equals(listTitle.get(position).getHint(), mContext.getString(R.string.tab_resume))) {
-            fragment = new ResumeFragment();
+            resumeFragment = new ResumeFragment();
+            fragment = resumeFragment;
         } else if (TextUtils.equals(listTitle.get(position).getHint(), mContext.getString(R.string.tab_position))) {
             fragment = new PositionFragment();
         } else if (TextUtils.equals(listTitle.get(position).getHint(), mContext.getString(R.string.tab_msg))) {
@@ -51,4 +53,7 @@ public class FragmentPageTabAdapter extends FragmentStatePagerAdapter {
         return listTitle.size();
     }
 
+    public ResumeFragment getResumeFragment() {
+        return resumeFragment;
+    }
 }

+ 78 - 59
app/src/main/java/com/webrain/dailypay/ui/fragment/ResumeFragment.java

@@ -1,14 +1,17 @@
 package com.webrain.dailypay.ui.fragment;
 
+import android.content.Context;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v7.widget.CardView;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.AbsListView;
 import android.widget.EditText;
 import android.widget.LinearLayout;
@@ -94,62 +97,48 @@ public class ResumeFragment extends BaseFragment<ResumeFragmentPresenter> implem
         return true;
     }
 
-    @Subscribe
-    public void onEvent(StringEvent event) {
-        if (event.getData().equals(EventConstant.EVENT_USER_AUTHENTICATION_STATUS_CHANGE)) {
-            mvpPresenter.init();
-        }
-    }
-
-
-    @OnClick(R.id.sav_search)
-    public void onClick(View view) {
-        if (savSearch.isAnimEnd()) {
-            if (savSearch.isShow())
-                savSearch.hideMenu();
-            else
-                savSearch.showMenu();
-        }
-    }
-
     @Override
     public void onDestroyView() {
         super.onDestroyView();
         EventBus.getDefault().unregister(this);
     }
 
-
     /**
-     * 搜索按钮触发回调
-     *
-     * @param v
-     * @param actionId
-     * @param event
-     * @return
+     * 当尚未成功认证
      */
-    @OnEditorAction(R.id.et_search)
-    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
-            mvpPresenter.setSearchKey(etSearch.getText().toString());
-            mvpPresenter.getHttpPositionList(true, true, true);
+    @Override
+    public void onNoRealAuthentication(int state) {
+        if (state == AppConstant.APPROVE_SUCCESS) {
+            llAuthentication.setVisibility(View.GONE);
+        } else {
+            setLoadingVisible(false);
+            if (mHolder == null) {
+                mHolder = new RealAuthenticationHolder(mContext);
+                llAuthentication.addView(mHolder.getView());
+                llAuthentication.setVisibility(View.VISIBLE);
+            }
+            if (state == AppConstant.APPROVE_NONE || state == AppConstant.APPROVE_FAIL) {
+                mHolder.initAuthenticationState();
+            } else {
+                mHolder.initGoingAuthenticationState();
+            }
         }
-        return false;
     }
 
     /**
-     * 监听ListView 滑动 实现搜索栏状态改变
+     * 清理焦点
      */
-    ScrollListView.OnScrollMoveListener onScrollMoveListener = new ScrollListView.OnScrollMoveListener() {
-        @Override
-        public void onScrollMove(int scrollY) {
-            if (scrollY <= 0) {   //设置标题的背景颜色
-                savSearch.showMenu();
-            } else if (scrollY >= PxUtils.dip2px(57)) { //滑动距离小于banner图的高度时,设置背景和字体颜色颜色透明度渐变
-                savSearch.hideMenu();
-            }
-        }
-    };
+    @Override
+    public void clearFocus() {
+        etSearch.clearFocus();
+    }
 
+    /**
+     * 获得简历列表数据
+     *
+     * @param mData
+     * @param isLastPage
+     */
     @Override
     public void onPositionList(List<ResumeBean> mData, boolean isLastPage) {
         setLoadingVisible(false);
@@ -181,29 +170,58 @@ public class ResumeFragment extends BaseFragment<ResumeFragmentPresenter> implem
 
     }
 
+    @Subscribe
+    public void onEvent(StringEvent event) {
+        if (event.getData().equals(EventConstant.EVENT_USER_AUTHENTICATION_STATUS_CHANGE)) {
+            mvpPresenter.init();
+        }
+    }
+
+
+    @OnClick(R.id.sav_search)
+    public void onClick(View view) {
+        if (savSearch.isAnimEnd()) {
+            if (savSearch.isShow())
+                savSearch.hideMenu();
+            else
+                savSearch.showMenu();
+        }
+    }
+
     /**
-     * 当尚未成功认证
+     * 搜索按钮触发回调
+     *
+     * @param v
+     * @param actionId
+     * @param event
+     * @return
      */
-    @Override
-    public void onNoRealAuthentication(int state) {
-        if (state == AppConstant.APPROVE_SUCCESS) {
-            llAuthentication.setVisibility(View.GONE);
-        } else {
-            setLoadingVisible(false);
-            if (mHolder == null) {
-                mHolder = new RealAuthenticationHolder(mContext);
-                llAuthentication.addView(mHolder.getView());
-                llAuthentication.setVisibility(View.VISIBLE);
-            }
-            if (state == AppConstant.APPROVE_NONE || state == AppConstant.APPROVE_FAIL) {
-                mHolder.initAuthenticationState();
-            } else {
-                mHolder.initGoingAuthenticationState();
-            }
+    @OnEditorAction(R.id.et_search)
+    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+            mvpPresenter.setSearchKey(etSearch.getText().toString());
+            mvpPresenter.getHttpPositionList(true, true, true);
         }
+        return false;
     }
 
     /**
+     * 监听ListView 滑动 实现搜索栏状态改变
+     */
+    ScrollListView.OnScrollMoveListener onScrollMoveListener = new ScrollListView.OnScrollMoveListener() {
+        @Override
+        public void onScrollMove(int scrollY) {
+            if (scrollY <= 0) {   //设置标题的背景颜色
+                if (!etSearch.isFocused())
+                    savSearch.showMenu();
+            } else if (scrollY >= PxUtils.dip2px(57)) { //滑动距离小于banner图的高度时,设置背景和字体颜色颜色透明度渐变
+                if (!etSearch.isFocused())
+                    savSearch.hideMenu();
+            }
+        }
+    };
+
+    /**
      * 监听下拉刷新触发
      */
     OnRefreshListener onRefreshListener = new OnRefreshListener() {
@@ -232,4 +250,5 @@ public class ResumeFragment extends BaseFragment<ResumeFragmentPresenter> implem
                     && (firstVisibleItem + visibleItemCount >= totalItemCount - 1);
         }
     };
+
 }

+ 2 - 0
app/src/main/java/com/webrain/dailypay/ui/mvp/contacts/ResumeFragmentContacts.java

@@ -14,6 +14,8 @@ public class ResumeFragmentContacts {
         void onError();
 
         void onNoRealAuthentication(int state);
+
+        void clearFocus();
     }
 
     public interface IResumeFragmentPresenter extends IPresenter {

+ 2 - 0
app/src/main/res/layout/fragment_resume.xml

@@ -39,6 +39,8 @@
                     android:layout_height="20dp"
                     android:layout_marginRight="14dp"
                     android:background="@drawable/corners_stork_purple_bottom"
+                    android:focusable="true"
+                    android:focusableInTouchMode="true"
                     android:orientation="vertical">
 
                     <EditText