1月23日修改:搜索歷史界面可以清除搜索歷史仰泻;關鍵詞聯想界面聯想詞提示
本次設計需求是實現一個搜索界面:
- 進入搜索界面,搜索框下方顯示搜索歷史滩届,可以編輯搜索歷史集侯;
- 點擊搜索框輸入關鍵詞后,會自動根據關鍵詞聯想呈現包含輸入的列表;
- 點擊搜索框棠枉,輸入關鍵后浓体,搜索框右側出現“x”,點擊清除當前全部搜索詞辈讶;
- 搜索框右側有搜索按鈕命浴,點擊顯示搜索結果。
1月23日新增功能 - 搜索歷史界面的搜索歷史可以點擊刪除
-
搜索提示詞點擊進行搜索(關鍵詞高亮功能待完善)
界面如下:
搜索歷史搜索提示詞
博主的大體思路是利用fragment實現三個界面贱除,根據activity中輸入框內的文字變化來判斷切換界面生闲。
主activity的輸入框是我自定義的一個ClearEditText,輸入文字后會在右側顯示"X",點擊可以清除文字月幌。
搜索歷史界面FragmentSearchHistory中有三個空間碍讯,分別為一個textview,顯示“歷史紀錄”扯躺,一個button捉兴,顯示“全部清除”,一個listview缅帘,顯示搜索記錄轴术。通過點擊“全部清除”和每條搜索記錄右側的“x”,可以清除搜索記錄钦无。
聯想詞提示界面FragmentSearchKeyWords布局就是一個listview逗栽,通過點擊每個item,可以自動填充到輸入框失暂,并進行搜索彼宠。
搜索界面界面FragmentSearchResult目前只有一個listview,數據是固定的弟塞。
SearchPage
搜索界面凭峡,包含三個fragment,通過clearEditText.addTextChangedListener
監(jiān)聽輸入框狀態(tài)决记,根據輸入框狀態(tài)來顯示fragment摧冀,這里切換fragment用的replace方式,每次切換都會重新加載fragment系宫。
代碼如下:
package com.example.zyk97.infotest.Activity;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import com.example.zyk97.infotest.Fragment.FragmentSearchHistory;
import com.example.zyk97.infotest.Fragment.FragmentSearchKeyWords;
import com.example.zyk97.infotest.Fragment.FragmentSearchResult;
import com.example.zyk97.infotest.R;
import com.example.zyk97.infotest.Update.UpdateSearch;
import com.example.zyk97.infotest.Utils.ClearEditText;
import java.util.ArrayList;
import java.util.List;
public class SearchPage extends AppCompatActivity {
private List<UpdateSearch> updateSearchList = new ArrayList<>();
private Button back;//返回按鈕索昂,清楚文字按鈕
private ClearEditText clearEditText;//搜索輸入框
private Button searchconfirm;
private FragmentSearchHistory f1;//搜索歷史
private FragmentSearchKeyWords f2;//關鍵字聯想
private FragmentSearchResult f3;//搜索結果
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.searchpage);
initView();
backToPre();
initFragment();
}
public void initView() {
clearEditText = findViewById(R.id.input);
searchconfirm = findViewById(R.id.confirm);
}
private void initFragment() {
f1 = new FragmentSearchHistory();
f2 = new FragmentSearchKeyWords();
f3 = new FragmentSearchResult();
//開啟事務
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(R.id.content, f1);
// ft.add(R.id.content,f2).hide(f2);
// ft.add(R.id.content,f3).hide(f3);
ft.commit();
showKeyWords();
showResult();
}
//判斷顯示哪一個Fragment
private void showKeyWords() {
clearEditText.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) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
if (clearEditText.getText().toString().length() > 0) {
ft.replace(R.id.content, f2);//輸入框有文字,顯示聯想詞提示界面
} else {
ft.replace(R.id.content, f1);//輸入框無文字扩借,顯示搜索歷史界面
}
ft.commit();
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
//監(jiān)聽搜索按鈕椒惨,點擊顯示搜索結果
private void showResult() {
searchconfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.content, f3);
ft.commit();
}
});
}
//返回鍵
private void backToPre() {
back = findViewById(R.id.back);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
FragmentSearchHistory
界面,要注意到潮罪,實現點擊listview每個item中的不同控件康谆,響應不同事件领斥,這里每個item是由一個textview(搜索歷史)+button(x)組成,點擊“x”可以刪除搜索歷史沃暗。
package com.example.zyk97.infotest.Fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import com.example.zyk97.infotest.Adapter.SearchHistoryAdapter;
import com.example.zyk97.infotest.R;
import com.example.zyk97.infotest.Update.UpdateSH;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
public class FragmentSearchHistory extends Fragment implements SearchHistoryAdapter.clickinview {
protected Button button;
protected TextView textView;
protected ListView listView;
protected TextView allDelete;
protected List<UpdateSH> list = new ArrayList<>();
Unbinder unbinder;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_searchhistory, container, false);
initView(view);
list = initinfo();
SearchHistoryAdapter adapter = new SearchHistoryAdapter(getActivity(), R.layout.searchhistoryitem, list, FragmentSearchHistory.this);
listView.setAdapter(adapter);
unbinder = ButterKnife.bind(this, view);
motionEvent();
return view;
}
private void motionEvent() {
allDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.clear();
SearchHistoryAdapter adapter = new SearchHistoryAdapter(getActivity(), R.layout.searchhistoryitem, list, FragmentSearchHistory.this);
listView.setAdapter(adapter);
}
});
}
private void initView(View view) {
listView = view.findViewById(R.id.list_search_history);
button = view.findViewById(R.id.sh_delete);
textView = view.findViewById(R.id.sh_search);
allDelete=view.findViewById(R.id.all_delete);
}
@Override
public void click_delete(View view) {
int values = (int) view.getTag();
UpdateSH updateSH = list.get(values);
list.remove(updateSH);
SearchHistoryAdapter adapter = new SearchHistoryAdapter(getActivity(), R.layout.searchhistoryitem, list, FragmentSearchHistory.this);
listView.setAdapter(adapter);
}
@Override
public void click_search(View view) {
int values = (int) view.getTag();
}
//數據集
public List<UpdateSH> initinfo() {
List<UpdateSH> updateSearchHistoryList = new ArrayList<UpdateSH>();
UpdateSH one = new UpdateSH("海淀五大時間");
UpdateSH two = new UpdateSH("菜單是怎么煉成的");
updateSearchHistoryList.add(one);
updateSearchHistoryList.add(two);
return updateSearchHistoryList;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
SearchHistoryAdapter
是搜索歷史listview的適配器月洛,在其中定義了一個接口,用于實現點擊item中不同控件相應不同事件描睦。
package com.example.zyk97.infotest.Adapter;
import android.content.Context;
import android.support.v7.widget.LinearLayoutCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.zyk97.infotest.R;
import com.example.zyk97.infotest.Update.UpdateSH;
import org.w3c.dom.Text;
import java.util.List;
import butterknife.OnClick;
public class SearchHistoryAdapter extends BaseAdapter {
Context context;
int layout;
List<UpdateSH> list;
clickinview clickinview;
public SearchHistoryAdapter(Context context, int layout, List<UpdateSH> list,clickinview clickinview){
this.context=context;
this.layout=layout;
this.list=list;
this.clickinview=clickinview;
}
public interface clickinview
{
void click_delete(View view);
void click_search(View view);
}
@Override
public int getCount(){
return list.size();
}
@Override
public Object getItem(int position){
return list.get(position);
}
@Override
public long getItemId(int position){
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
convertView= LayoutInflater.from(context).inflate(layout,null);
Button button=convertView.findViewById(R.id.sh_delete);
TextView textView=convertView.findViewById(R.id.sh_search);
button.setTag(position);
textView.setText(list.get(position).getText());
textView.setTag(position);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickinview.click_delete(v);
}
});
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickinview.click_search(v);
}
});
return convertView;
}
}
FragmentSearchKeyWords
界面要住的是動態(tài)刷新數據膊存,這里博主是通過final ClearEditText input = getActivity().findViewById(R.id.input);
獲取activity中的輸入框导而,然后根據輸入框的文字狀態(tài)來動態(tài)刷新數據忱叭。
博主實現這個功能時遇到一個坑:第一次輸入關鍵詞時,listview不顯示今艺,但之后可以正常響應韵丑。經過仔細研究發(fā)現,是因為第一次輸入文字時虚缎,是activity中輸入框監(jiān)聽方法的響應了事件撵彻,但是FragmentSearchKeyWords的監(jiān)聽方法沒有響應,但切換到FragmentSearchKeyWords界面后实牡,獲取的輸入框監(jiān)聽方法正常工作陌僵。所以博主在frgament的onCreateView方法中,獲取第一次輸入的關鍵詞创坞,并根據這個關鍵詞刷新數據碗短,這樣這個功能目前完成無bug。
這里有一個值得注意的地方是從一個fragment跳轉到另一個fragment的實現:
//從搜索聯想詞提示界面跳轉到搜索歷史界面
FragmentSearchResult fragmentSearchResult=new FragmentSearchResult();
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction ft=fragmentManager.beginTransaction();
ft.replace(R.id.content,fragmentSearchResult);
ft.commit();
下面是代碼:
package com.example.zyk97.infotest.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.example.zyk97.infotest.Adapter.SearchKeyWordAdapter;
import com.example.zyk97.infotest.R;
import com.example.zyk97.infotest.Utils.ClearEditText;
import com.example.zyk97.infotest.Utils.KeyWordMatch;
import java.util.ArrayList;
import java.util.List;
public class FragmentSearchKeyWords extends Fragment {
final String TAG = "cheat";
private ListView listView;
private List<String> list = new ArrayList<>();//后臺數據集
private List<String> matchList = new ArrayList<>();//顯示的關聯詞數據集
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_searchkeywords, container, false);
initlist();//從后臺獲取數據集
listView = view.findViewById(R.id.list_search_key);
SearchKeyWordAdapter adapter = new SearchKeyWordAdapter(getActivity(), R.layout.searchkeyworditem, matchList);
listView.setAdapter(adapter);
/*首次頁面跳轉時判斷應顯示的提示次
因為input監(jiān)聽事件第一次不觸發(fā)
*/
final ClearEditText input = getActivity().findViewById(R.id.input);
if(input.getText().toString().length()>0) {
KeyWordMatch keyWordMatch = new KeyWordMatch();
matchList.clear();
matchList.addAll(keyWordMatch.getHighlightMatch(list, input.getText().toString()));
}
changeMatchList(view);
adapter.notifyDataSetChanged();
return view;
}
private void changeMatchList(View view) {
final ClearEditText input = getActivity().findViewById(R.id.input);
input.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) {
if (s.toString().length() > 0) {
KeyWordMatch keyWordMatch = new KeyWordMatch();
matchList.clear();
matchList.addAll(keyWordMatch.getHighlightMatch(list, s.toString())); SearchKeyWordAdapter adapter = new SearchKeyWordAdapter(getActivity(), R.layout.searchkeyworditem, matchList);
listView.setAdapter(adapter);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ClearEditText input = getActivity().findViewById(R.id.input);
// Button confirm = getActivity().findViewById(R.id.confirm);
input.setText(listView.getAdapter().getItem(position).toString());
FragmentSearchResult fragmentSearchResult=new FragmentSearchResult();
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction ft=fragmentManager.beginTransaction();
ft.replace(R.id.content,fragmentSearchResult);
ft.commit();
}
});
}
private void initlist() {
/*當輸入框為空時题涨,fragment會變?yōu)樗阉鳉v史fragment偎谁,再次輸入文字,
又會變成聯想詞fragment纲堵,因為使用了replace巡雨,所以會重新加載,所以
每次都要清空list席函,再重新添加
*/
list.clear();
list.add("海爾");
list.add("格力");
list.add("美的");
list.add("訊飛");
list.add("大疆");
list.add("奎格");
}
}
SearchKeyWordAdapter
是搜索聯想詞界面的listview的適配器铐望,博主為了實現關鍵詞高亮功能,準備用Html符號來改變關鍵詞顏色茂附。在給listview加載數據時正蛙,使用searchSKW.setText(Html.fromHtml(updateSKW,1));
。在判斷顯示的聯想詞時何之,在判斷算法中跟畅,給符合要求的聯想詞中的關鍵字前后加上<font color='#FF0000'>keyword</font>
,以此實現關鍵詞高亮。目前關鍵詞高亮功能還有bug(只能亮一個字溶推;點擊提示詞后徊件,顯示在輸入框的聯想詞帶有html符號)奸攻。
代碼如下:
import android.content.Context;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.example.zyk97.infotest.R;
import java.util.List;
public class SearchKeyWordAdapter extends ArrayAdapter {
private final int resourcedId;
public SearchKeyWordAdapter(Context context, int textViewResourcedId, List<String> objects) {
super(context, textViewResourcedId, objects);
resourcedId = textViewResourcedId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String updateSKW = (String) getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourcedId, null);
TextView searchSKW = view.findViewById(R.id.searchkeyword_item);
//通過html格式來設置字體顏色
searchSKW.setText(Html.fromHtml(updateSKW,1));
return view;
}
}
KeyWordMatch
判斷算法如下:
package com.example.zyk97.infotest.Utils;
import java.util.ArrayList;
import java.util.List;
public class KeyWordMatch {
public void KeyEordMatch() {
}
;
/**
* @param list 主串數組list
* @param sub 字串
* @return 返回一個匹配完成的數組list
*/
public List<String> getMatch(List<String> list, String sub) {
List<String> matchList = new ArrayList<>();
for (int i = 0; i <list.size(); i++) {
if (list.get(i).contains(sub)) {
matchList.add(list.get(i));
}
}
return matchList;
}
//高亮關鍵詞(通過增加html語句實現高亮)
public List<String> getHighlightMatch(List<String> list, String sub) {
StringBuilder sb;
String s;
List<String> matchList = new ArrayList<>();
for (int i = 0; i <list.size(); i++) {
if (list.get(i).contains(sub)) {
s=list.get(i);
sb=new StringBuilder(s);
sb.insert(s.indexOf(sub),"<font color='#FF0000'>");
sb.insert(s.indexOf(sub)+23,"</font>");//24為<font color='#FF0000'>的長度
s=sb.toString();
matchList.add(s);
}
}
return matchList;
}
}
FragmentSearchHistory
搜索歷史界面代碼很簡單,就是現實一個listview:
package com.example.zyk97.infotest.Fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import com.example.zyk97.infotest.Adapter.SearchHistoryAdapter;
import com.example.zyk97.infotest.R;
import com.example.zyk97.infotest.Update.UpdateSH;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
public class FragmentSearchHistory extends Fragment implements SearchHistoryAdapter.clickinview {
protected Button button;
protected TextView textView;
protected ListView listView;
protected TextView allDelete;
protected List<UpdateSH> list = new ArrayList<>();
Unbinder unbinder;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_searchhistory, container, false);
initView(view);
list = initinfo();
SearchHistoryAdapter adapter = new SearchHistoryAdapter(getActivity(), R.layout.searchhistoryitem, list, FragmentSearchHistory.this);
listView.setAdapter(adapter);
unbinder = ButterKnife.bind(this, view);
motionEvent();
return view;
}
private void motionEvent() {
allDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.clear();
SearchHistoryAdapter adapter = new SearchHistoryAdapter(getActivity(), R.layout.searchhistoryitem, list, FragmentSearchHistory.this);
listView.setAdapter(adapter);
}
});
}
private void initView(View view) {
listView = view.findViewById(R.id.list_search_history);
button = view.findViewById(R.id.sh_delete);
textView = view.findViewById(R.id.sh_search);
allDelete=view.findViewById(R.id.all_delete);
}
@Override
public void click_delete(View view) {
int values = (int) view.getTag();
UpdateSH updateSH = list.get(values);
list.remove(updateSH);
SearchHistoryAdapter adapter = new SearchHistoryAdapter(getActivity(), R.layout.searchhistoryitem, list, FragmentSearchHistory.this);
listView.setAdapter(adapter);
}
@Override
public void click_search(View view) {
int values = (int) view.getTag();
}
//數據集
public List<UpdateSH> initinfo() {
List<UpdateSH> updateSearchHistoryList = new ArrayList<UpdateSH>();
UpdateSH one = new UpdateSH("海淀五大時間");
UpdateSH two = new UpdateSH("菜單是怎么煉成的");
updateSearchHistoryList.add(one);
updateSearchHistoryList.add(two);
return updateSearchHistoryList;
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
}
SearchAdapter
搜索歷史界面的適配器:
package com.example.zyk97.infotest.Adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import com.example.zyk97.infotest.R;
import com.example.zyk97.infotest.Update.UpdateSearch;
import java.util.List;
public class SearchAdapter extends ArrayAdapter {
private final int resourceId;
public SearchAdapter(Context context, int textViewResourceId, List<UpdateSearch> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
UpdateSearch updateSearch = (UpdateSearch) getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
TextView searchResult = view.findViewById(R.id.search_item);
searchResult.setText(updateSearch.getSearch());
return view;
}
}
以上就是全部的代碼虱痕,下面給出相應的布局文件:
searchpage.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/dark_blue"
android:orientation="horizontal">
<Button
android:id="@+id/back"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_weight="0.01"
android:background="@mipmap/back" />
<com.example.zyk97.infotest.Utils.ClearEditText
android:id="@+id/input"
android:layout_width="300dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_weight="1"
android:background="@drawable/textview_round_border"
android:hint="請輸入關鍵字"
android:maxLength="28"
android:maxLines="1"
android:paddingLeft="10dp"
android:textSize="13sp" />
<Button
android:id="@+id/confirm"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center"
android:layout_marginLeft="5dp"
android:layout_marginRight="15dp"
android:layout_weight="0.01"
android:background="@mipmap/search" />
</LinearLayout>
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</FrameLayout>
</LinearLayout>
frag_searchhistory.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:textSize="18sp"
android:paddingTop="5dp"
android:paddingLeft="20dp"
android:text="歷史紀錄"
android:textColor="@color/dark_blue"/>
<TextView
android:id="@+id/all_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全部清除"
android:gravity="center"
android:layout_marginLeft="250dp"
android:textColor="@color/gray2"
android:layout_gravity="center"/>
</LinearLayout>
<ListView
android:id="@+id/list_search_history"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
searchhistoryitem.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/sh_search"
android:layout_width="350dp"
android:layout_height="40dp"
android:gravity="center_vertical"
android:layout_marginLeft="20dp"
android:textSize="18sp" />
<Button
android:id="@+id/sh_delete"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@color/white"
android:stateListAnimator="@null"
android:text="X"
android:textColor="@color/gray4"
android:textSize="15sp" />
</LinearLayout>
frag_searchkeywords.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_search_key"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
searchkeyworditem.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/searchkeyword_item"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginLeft="20dp"
android:drawableLeft="@mipmap/searchcompany"
android:drawablePadding="10dp"
android:gravity="center_vertical"
android:paddingLeft="20dp"
android:text="default"
android:textColor="@color/black"
android:textSize="18sp" />
</LinearLayout>
frag_searchresult.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_search_result"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
searchitem.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/search_item"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginLeft="20dp"
android:gravity="center_vertical"
android:text="default"
android:textColor="@color/black"
android:textSize="18sp" />
</LinearLayout>
以上就是我實現搜索界面的所有代碼睹耐,這次搜索界面還有很多需求,下次實現后部翘,再來補
本文樣例完整代碼InfoTest
本文參考:
- 《Android輸入框中加入清除按鈕》硝训,陽春面
- 《Listview列表的內部點擊事件使用》,weixin_39028072
- 《從一個Fragment跳轉到另一個Fragment
》新思,我要一直往前走 - 《Android 一個TextView中設置文字不同字體大小和顏色的最完整方法
》窖梁,qq_32320807