课堂笔记
搜索页面键盘发起搜索功能
- 给搜索框添加 android:imeOptions 属性,设置键盘搜索功能
    <EditText
        android:id="@+id/search_input_box"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_marginStart="16dp"
        android:layout_toStartOf="@+id/search_cancel"
        android:background="@drawable/shape_edit_box_bg"
        android:hint="@string/text_edit_hint"
        android:imeOptions="actionSearch"
        android:paddingLeft="11dp"
        android:paddingRight="11dp"
        android:singleLine="true"
        android:textSize="12sp" />
    mSearchInputBox.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                String keyword = v.getText().toString().trim();
                if (!TextUtils.isEmpty(keyword)) {
                    toSearch(v.getText().toString().trim());
                }
            }
            return false;
        }
    });
    private void toSearch(String text) {
        if (mSearchPresenter != null) {
            mSearchInputBox.setText(text);
            mSearchInputBox.setSelection(text.length());
            mSearchPresenter.doSearch(text);
            mRvSearchResults.scrollToPosition(0);
        }
    }
搜索按钮发起搜索
    <ImageView
        android:id="@+id/input_clear"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_marginEnd="5dp"
        android:layout_toStartOf="@+id/search_cancel"
        android:padding="7dp"
        android:src="@mipmap/input_clear"
        android:visibility="gone" />
- 给搜索框添加内容改变监听事件,让搜索按钮的文字和清除按钮的显藏随搜索框内容改变而改变
    mSearchInputBox.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
	    // 搜索按钮显示的文字 要去空格判断
            mSearchCancel.setText(TextUtils.isEmpty(s.toString().trim()) ? "取消" : "搜索");
	    // 清除按钮的显藏 不要去空格判断
            mIvInputClear.setVisibility(s.length() == 0 ? View.GONE : View.VISIBLE);
        }
        @Override
        public void afterTextChanged(Editable s) {
        }
    });
    mIvInputClear.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mSearchInputBox.getText().clear();
            switch2HistoryPage();
        }
    });
- 方法 switch2HistoryPage 是隐藏搜索结果,进入搜索历史界面
    private void switch2HistoryPage() {
        if (mSearchPresenter != null) {
            mSearchPresenter.getHistories();
        }
        mSearchRecommendContainer.setVisibility(mRecommendKeysList.size() == 0 ? View.GONE : View.VISIBLE);
        refreshContainer.setVisibility(View.GONE);
    }
- 给搜索按钮设置点击事件,只有当按钮文字为“搜索”时,才进行网络搜索
    mSearchCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if ("搜索".equals(mSearchCancel.getText().toString())) {
                toSearch(mSearchInputBox.getText().toString());
            } else {
                // 如果时“取消”的话,点击返回 **HomeFragment**
                MainActivity mainActivity = (MainActivity) getActivity();
                mainActivity.switch2HomeFragment();
            }
        }
    });
发起搜索后隐藏键盘
public class KeyboardUtil {
    // 隐藏键盘
    public static void hideKeyboard(Context context, View view) {
        InputMethodManager im = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        im.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
    // 显示键盘
    public static void showKeyboard(Context context, View view) {
        InputMethodManager im = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        im.showSoftInput(view, 0);
    }
}
- 给 toSearch 添加隐藏键盘的方法,当搜索时隐藏键盘
    private void toSearch(String text) {
        if (mSearchPresenter != null) {
            mSearchInputBox.setText(text);
            mSearchInputBox.setSelection(text.length());
            mSearchPresenter.doSearch(text);
            KeyboardUtil.hideKeyboard(getContext(), this.getView());
            mRvSearchResults.scrollToPosition(0);
        }
    }
热门推荐和搜索历史点击搜索
    mSearchHistoriesView.setOnFlowTextItemClickListener(this);
    mSearchRecommendView.setOnFlowTextItemClickListener(this);
    @Override
    public void onFlowTextItemClick(String text) {
        toSearch(text);
    }
点击首页搜索跳转到搜索页面
- 新建接口 IMainActivity,隐藏实现方法
public interface IMainActivity {
    // 跳转到搜索页面
    void switch2HomeFragment();
    // 个人加的,点击搜索页面取消时,跳转到首页
    void switch2SearchFragment();
}
- MainActivity 实现接口,并在方法内实现跳转页面的功能
    @Override
    public void switch2SearchFragment() {
        mNavigationView.setSelectedItemId(R.id.search);
    }
    @Override
    public void switch2HomeFragment() {
        mNavigationView.setSelectedItemId(R.id.home);
    }
- 在 HomeFragment 中找到搜索控件,设置点击事件,跳转到搜索页面
    @Override
    protected void initListener() {
        mHomeSearchInputBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentActivity activity = getActivity();
                if (activity instanceof MainActivity) {
                    MainActivity mainActivity = (MainActivity) activity;
                    mainActivity.switch2SearchFragment();
                }
            }
        });
解决重复点击 BottomNavigation 页面为空的问题
- 在切换 fragment 方法里增加一个判断,如果点击的页面为当前页面,则返回方法
    private void switchFragment(BaseFragment targetFragment) {
        FragmentTransaction transaction = mFragmentManager.beginTransaction();
	// 如果点击的页面为当前页面,则返回方法
        if (targetFragment == lastOneFragment) return;
        if (!targetFragment.isAdded()) {
            transaction.add(R.id.main_pager_container, targetFragment);
        } else {
            transaction.show(targetFragment);
        }
        if (lastOneFragment != null) {
            transaction.hide(lastOneFragment);
        }
        lastOneFragment = targetFragment;
        transaction.commit();
    }