课堂笔记
搜索页面键盘发起搜索功能
- 给搜索框添加 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();
}