당신은 주제를 찾고 있습니까 “안드로이드 스튜디오 검색 기능 – 안드로이드 앱 만들기 #50 주소 검색 기능 API 연동 – 쉽게 앱 만드는 방법 (현직 개발자 설명) , android studio easy tutorial“? 다음 카테고리의 웹사이트 you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 hongdroid홍드로이드 이(가) 작성한 기사에는 조회수 2,963회 및 좋아요 23개 개의 좋아요가 있습니다.
안드로이드 스튜디오 검색 기능 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 안드로이드 앱 만들기 #50 주소 검색 기능 API 연동 – 쉽게 앱 만드는 방법 (현직 개발자 설명) , android studio easy tutorial – 안드로이드 스튜디오 검색 기능 주제에 대한 세부정보를 참조하세요
★★★ 강의 진행에 필요한 파일을 다운로드 ! – 주소 검색 API index.html 파일
https://url.kr/dpen2x
★★★홍드로이드의 수익창출 앱 강의
https://edu.goorm.io/lecture/18156/홍드로이드의-수익창출-앱-개발
★★★홍드로이드의 취준생을 위한 앱 강의
https://class101.page.link/QTDj
★★★홍드로이드 멤버십 가입
https://www.youtube.com/channel/UCEdsGM2ALcUGkUCNSMAthLg/join
제휴 \u0026 문의 이메일
[email protected]
홍드로이드 질문\u0026답변 카카오 오픈채팅 링크
https://open.kakao.com/o/gWIiEKWc
후원 (Toonation) : 기업은행 078-191404-01-012 이홍철
강의 진행당시 Android Studio 버전 : Bumblebee 2021.1.1 Patch
==============================
시청 해주신 모든분들 감사드리며,
구독 \u0026 좋아요는 저를 힘이나게 한답니다
모두들사랑해요 ! ♡
#안드로이드 #AndroidStudio #앱만드는법
안드로이드 스튜디오 검색 기능 주제에 대한 자세한 내용은 여기를 참조하세요.
[안드로이드] 리스트뷰 검색 기능 구현 (android ListView search)
리스트뷰(ListView)에 많은 데이터 값(data value)들이 들어간다. 그 수많은 데이터 값들 중에 우리가 필요한 데이터 값만 검색하였으면 하는 기능이 …
Source: sharp57dev.tistory.com
Date Published: 10/29/2022
View: 8671
검색 인터페이스 만들기 | Android 개발자
검색 대화상자 및 위젯에 사용할 수 있는 다른 기능은 다음과 같습니다. 음성 검색; 최근 검색어 기반의 추천 검색어; 애플리케이션 데이터의 실제 결과와 …
Source: developer.android.com
Date Published: 6/7/2022
View: 2548
[안드로이드] 동물 리스트(ListView) 검색(SearchView) 기능 …
본문 제목. [안드로이드] 동물 리스트(ListView) 검색(SearchView) 기능 추가 방법. 안드로이드. by aries574 2021. 12. 25. 16:25 …
Source: aries574.tistory.com
Date Published: 4/14/2021
View: 7654
[안드로이드][맛집찾기][2] 키워드 검색화면 구현하기 – 베이글
[안드로이드][맛집찾기][2] 키워드 검색화면 구현하기. sryang628 2021. 7. 20. 16:45. 화면 설계에서 정의한 기능을 하나씩 구현해나가보도록 하겠습니다.Source: srandroid.tistory.com
Date Published: 6/29/2022
View: 3190
[Android Studio] 리스트뷰에 검색기능 추가하기 – IT, I Think
안드로이드앱을 만들면서 가장 많이 쓰는 기능중에 하나인 커스텀 리스트뷰에 검색기능을 추가해보겠습니다. 아무래도 일련의 데이터를 나열해주는 …
Source: cholol.tistory.com
Date Published: 1/23/2021
View: 5132
[Android] AutoCompleteTextView를 이용하여 검색기능 구현하기
그 중 하나의 방법으로 AutoCompleteTextView를 사용하면, 특별한 알고리즘 구현없이 간편하게 검색을 할 수 있는 기능이 얻어집니다!
Source: velog.io
Date Published: 8/24/2021
View: 7459
안드로이드 – 프로젝트8. 회원 검색 기능 추가 – 가카리의 공부방
예제 출처 : https://www.inflearn.com/course 예제 소스 : https://github.com/GaKaRi/gakari_andro/tree/master/Proj_Manager_v8 이전예제 …
Source: gakari.tistory.com
Date Published: 1/3/2021
View: 4792
주제와 관련된 이미지 안드로이드 스튜디오 검색 기능
주제와 관련된 더 많은 사진을 참조하십시오 안드로이드 앱 만들기 #50 주소 검색 기능 API 연동 – 쉽게 앱 만드는 방법 (현직 개발자 설명) , android studio easy tutorial. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 안드로이드 스튜디오 검색 기능
- Author: hongdroid홍드로이드
- Views: 조회수 2,963회
- Likes: 좋아요 23개
- Date Published: 2022. 3. 26.
- Video Url link: https://www.youtube.com/watch?v=I6sjUmcfCuU
[안드로이드] 리스트뷰 검색 기능 구현 (android ListView search)
반응형
리스트뷰(ListView)에 많은 데이터 값(data value)들이 들어간다.
그 수많은 데이터 값들 중에 우리가 필요한 데이터 값만 검색하였으면 하는 기능이 필요할 때가 있다.
검색할 단어를 Input창에 입력하면 그 단어가 포함된 단어 또는 문장이 검색되는것이다.
이 기능은 의외로 간단한 코드로 이루어져있다.
리스트뷰(ListView)를 사용할 줄 안다면 쉽게 구현이 가능하다.
우선 리스트뷰에 연결할 아답터부터 작업한다.
* row_listview.xml
xml version= "1.0" encoding= "utf-8" ?>
리스트뷰의 셀에 데이터를 노출할 TextView를 정의한다.
* SearchAdapter.java
package com.studio572.searchlistview ;
import android.content.Context ;
import android.view.LayoutInflater ;
import android.view.View ;
import android.view.ViewGroup ;
import android.widget.BaseAdapter ;
import android.widget.TextView ;
import java.util.List ;
/**
* Created by Administrator on 2017-08-07.
*/
public class SearchAdapter extends BaseAdapter {
private Context context ;
private List
list ; private LayoutInflater inflate ;
private ViewHolder viewHolder ;
public SearchAdapter (List
list , Context context){ this . list = list ;
this . context = context ;
this . inflate = LayoutInflater. from (context) ;
}
@Override
public int getCount () {
return list .size() ;
}
@Override
public Object getItem ( int i) {
return null;
}
@Override
public long getItemId ( int i) {
return 0 ;
}
@Override
public View getView ( int position , View convertView , ViewGroup viewGroup) {
if (convertView == null ){
convertView = inflate .inflate(R.layout. row_listview ,null ) ;
viewHolder = new ViewHolder() ;
viewHolder . label = (TextView) convertView.findViewById(R.id. label ) ;
convertView.setTag( viewHolder ) ;
} else {
viewHolder = (ViewHolder)convertView.getTag() ;
}
// 리스트에 있는 데이터를 리스트뷰 셀에 뿌린다.
viewHolder . label .setText( list .get(position)) ;
return convertView ;
}
class ViewHolder{
public TextView label ;
}
}
아답터의 기본기능만 코딩하면 된다.
기본 오버라이드 메소드를 정의한다.
그리고 검색된 String 데이터 값을 노출할 부분을 아래와 같이 추가한다.
viewHolder . label .setText( list .get(position)) ;
다음은 메인 액티비티이다.
* activity_main.xml
xml version= "1.0" encoding= "utf-8" ?>
검색어를 입력할 EditText와 검색된 결과 데이터 값을 보여줄 ListView를 정의한다
* MainActivity.java
package com.studio572.searchlistview;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.ScheduledExecutorService;
public class MainActivity extends AppCompatActivity {
private List
list; // 데이터를 넣은 리스트변수 private ListView listView; // 검색을 보여줄 리스트변수
private EditText editSearch; // 검색어를 입력할 Input 창
private SearchAdapter adapter; // 리스트뷰에 연결할 아답터
private ArrayList
arraylist; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editSearch = (EditText) findViewById(R.id.editSearch);
listView = (ListView) findViewById(R.id.listView);
// 리스트를 생성한다.
list = new ArrayList
(); // 검색에 사용할 데이터을 미리 저장한다.
settingList();
// 리스트의 모든 데이터를 arraylist에 복사한다.// list 복사본을 만든다.
arraylist = new ArrayList
(); arraylist.addAll(list);
// 리스트에 연동될 아답터를 생성한다.
adapter = new SearchAdapter(list, this);
// 리스트뷰에 아답터를 연결한다.
listView.setAdapter(adapter);
// input창에 검색어를 입력시 “addTextChangedListener” 이벤트 리스너를 정의한다.
editSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
// input창에 문자를 입력할때마다 호출된다.
// search 메소드를 호출한다.
String text = editSearch.getText().toString();
search(text);
}
});
}
// 검색을 수행하는 메소드
public void search(String charText) {
// 문자 입력시마다 리스트를 지우고 새로 뿌려준다.
list.clear();
// 문자 입력이 없을때는 모든 데이터를 보여준다.
if (charText.length() == 0) {
list.addAll(arraylist);
}
// 문자 입력을 할때..
else
{
// 리스트의 모든 데이터를 검색한다.
for(int i = 0;i < arraylist.size(); i++) { // arraylist의 모든 데이터에 입력받은 단어(charText)가 포함되어 있으면 true를 반환한다. if (arraylist.get(i).toLowerCase().contains(charText)) { // 검색된 데이터를 리스트에 추가한다. list.add(arraylist.get(i)); } } } // 리스트 데이터가 변경되었으므로 아답터를 갱신하여 검색된 데이터를 화면에 보여준다. adapter.notifyDataSetChanged(); } // 검색에 사용될 데이터를 리스트에 추가한다. private void settingList(){ list.add("채수빈"); list.add("박지현"); list.add("수지"); list.add("남태현"); list.add("하성운"); list.add("크리스탈"); list.add("강승윤"); list.add("손나은"); list.add("남주혁"); list.add("루이"); list.add("진영"); list.add("슬기"); list.add("이해인"); list.add("고원희"); list.add("설리"); list.add("공명"); list.add("김예림"); list.add("혜리"); list.add("웬디"); list.add("박혜수"); list.add("카이"); list.add("진세연"); list.add("동호"); list.add("박세완"); list.add("도희"); list.add("창모"); list.add("허영지"); } } ListView와 Adapter를 정의하고 검색에 필요한 단어를 리스트에 추가 시킨다. EidtText의 listener인 addTextChangedListener에서 문자를 입력 받을때마다 search() 메소드를 호출해 리스트에서 검색을 수행한다. 그리고 검색된 단어는 리스트에 추가되어 리스트뷰에 노출된다. 이 검색 기능구현은 간단하다. 기존 리스트뷰에 EdixtText의 addTextChangedListener 와 위에 정의된 search() 메소드만 추가하면된다. 반응형
검색 인터페이스 만들기
애플리케이션에 검색 기능을 추가할 준비가 되면 Android는 활동 창 상단에 표시되는 검색 대화상자 또는 레이아웃에 삽입할 수 있는 검색 위젯이 포함된 사용자 인터페이스를 구현하도록 지원합니다. 검색 대화상자와 위젯은 모두 사용자의 검색어를 애플리케이션의 특정 활동에 전달할 수 있습니다. 이렇게 하면 사용자는 검색 대화상자 또는 위젯을 사용할 수 있는 활동에서 검색을 시작할 수 있으며 시스템은 적합한 활동을 시작하여 검색하고 결과를 표시합니다.
검색 대화상자 및 위젯에 사용할 수 있는 다른 기능은 다음과 같습니다.
음성 검색
최근 검색어 기반의 추천 검색어
애플리케이션 데이터의 실제 결과와 일치하는 추천 검색어
이 가이드에서는 Android 시스템에서 지원되며 검색 대화상자나 검색 위젯을 사용하는 검색 인터페이스를 통해 검색어를 전달하도록 애플리케이션을 설정하는 방법을 설명합니다.
관련 리소스
기본 사항
그림 1. 애플리케이션의 검색 대화상자 스크린샷
시작하기 전에, 검색 인터페이스를 구현하기 위해 검색 대화상자를 사용할지 검색 위젯을 사용할지 결정해야 합니다. 검색 대화상자와 검색 위젯은 동일한 검색 기능을 제공하지만 그 방식이 약간 다릅니다.
검색 대화상자 는 Android 시스템에서 제어하는 UI 구성요소입니다. 사용자가 활성화하면 검색 대화상자가 활동의 상단에 표시됩니다(그림 1 참조). Android 시스템은 검색 대화상자의 모든 이벤트를 제어합니다. 사용자가 쿼리를 제출하면 검색을 처리하도록 개발자가 지정한 활동에 이 쿼리가 전달됩니다. 대화상자에서는 사용자가 입력하는 동안 추천 검색어가 제공될 수도 있습니다.
는 Android 시스템에서 제어하는 UI 구성요소입니다. 사용자가 활성화하면 검색 대화상자가 활동의 상단에 표시됩니다(그림 1 참조). 검색 위젯은 레이아웃의 임의의 위치에 배치할 수 있는 SearchView 인스턴스입니다. 기본적으로 검색 위젯은 표준 EditText 위젯처럼 동작하며 아무것도 하지 않습니다. 하지만 Android 시스템이 모든 입력 이벤트를 처리하고, 적합한 활동에 쿼리를 전달하고, 추천 검색어를 제공(검색 대화상자처럼)하도록 위젯을 구성할 수 있습니다. 참고: 원하는 경우 개발자는 다양한 콜백 메서드와 리스너를 사용하여 검색 위젯의 모든 사용자 입력을 직접 처리할 수 있습니다. 하지만 이 문서에서는 지원 검색 구현을 위해 시스템과 검색 위젯을 통합하는 방법을 주로 다룹니다. 모든 사용자 입력을 직접 처리하려면 SearchView 및 중첩된 인터페이스에 관한 참조 문서를 확인하세요.
사용자가 검색 대화상자나 검색 위젯에서 검색을 실행하면 시스템은 Intent 를 생성하고 여기에 사용자 쿼리를 저장합니다. 그런 다음 시스템은 개발자가 검색을 처리하도록 선언한 활동(‘검색 가능 활동’)을 시작하고 이 활동에 인텐트를 전달합니다. 이러한 종류의 지원 검색이 가능하도록 애플리케이션을 설정하려면 다음이 필요합니다.
검색 가능한 구성 검색 대화상자 또는 위젯의 일부 설정을 구성하는 XML 파일입니다. 여기에는 음성 검색, 추천 검색어, 검색창 힌트 텍스트와 같은 기능의 설정이 포함됩니다.
검색 가능 활동 검색어를 수신하고, 개발자의 데이터를 검색하고, 검색결과를 표시하는 Activity 입니다.
검색 인터페이스로서 다음 중 하나에서 제공됩니다. 검색 대화상자 기본적으로 검색 대화상자는 숨겨지지만 onSearchRequested() 를 호출하면(사용자가 검색 버튼을 누름) 화면 상단에 표시됩니다. 또는 SearchView 위젯 검색 위젯을 사용하면 활동의 임의의 위치에 검색창을 배치할 수 있습니다. 활동 레이아웃에 배치하는 대신 일반적으로 SearchView 를 앱 바의 작업 뷰로 사용해야 합니다.
이 문서의 나머지 부분에서는 검색 가능한 구성 및 검색 가능 활동을 만들고 검색 대화상자나 검색 위젯이 포함된 검색 인터페이스를 구현하는 방법을 설명합니다.
검색 가능한 구성 만들기
가장 먼저 필요한 것은 검색 가능한 구성이라는 XML 파일입니다. 이 파일은 검색 대화상자 또는 위젯의 특정 UI 요소를 구성하고 추천 검색어 및 음성 검색과 같은 기능의 작동 방식을 정의합니다. 이 파일은 일반적으로 이름이 searchable.xml 이며 res/xml/ 프로젝트 디렉터리에 저장해야 합니다.
참고: 시스템에서는 이 파일을 사용하여 SearchableInfo 객체를 인스턴스화하지만 개발자는 런타임에 직접 이 객체를 만들 수 없습니다. 검색 가능한 구성을 XML로 선언해야 합니다.
검색 가능한 구성 파일은
요소를 루트 노드로 포함하고 속성을 하나 이상 지정해야 합니다. 예를 들어 다음과 같습니다.
android:label 속성은 유일한 필수 속성으로서 문자열 리소스(애플리케이션 이름이어야 함)를 가리킵니다. 이 라벨은 개발자가 빠른 검색창용 추천 검색어를 사용 설정하기 전까지는 사용자에게 실제로 표시되지 않습니다. 사용 설정하면 이 라벨은 시스템 설정에서 검색 가능 항목 목록에 표시됩니다.
필수 사항은 아니지만, 사용자가 쿼리를 입력하기 전에 검색창에 힌트 문자열을 제공하는 android:hint 속성을 항상 포함하는 것이 좋습니다. 힌트는 검색할 수 있는 정보에 관해 사용자에게 중요한 단서를 제공하기 때문에 중요합니다.
도움말: 다른 Android 애플리케이션 간의 일관성을 위해 android:hint 의 문자열을 ‘Search
‘ 형식으로 지정해야 합니다. 예를 들어 ‘Search songs and artists’ 또는 ‘Search YouTube’입니다.
요소는 다른 속성도 허용합니다. 그러나 대부분의 속성은 추천 검색어 및 음성 검색과 같은 기능을 추가한 후에만 필요합니다. 검색 가능한 구성 파일에 관한 자세한 내용은 검색 가능한 구성 참조 문서를 확인하세요. 검색 가능 활동 만들기
검색 가능 활동은 애플리케이션에서 쿼리 문자열을 기반으로 검색하고 검색결과를 표시하는 Activity 입니다.
사용자가 검색 대화상자 또는 위젯에서 검색을 실행하면 시스템에서 검색 가능 활동을 시작하고 ACTION_SEARCH 작업을 통해 Intent 에 포함하여 검색어를 전달합니다. 검색 가능 활동은 인텐트의 QUERY extra에서 쿼리를 검색한 후 데이터를 검색하고 결과를 표시합니다.
개발자가 검색 대화상자 또는 위젯을 애플리케이션의 다른 활동에 포함할 수도 있으므로 시스템은 어느 활동이 검색 가능 활동인지 알아야 검색어를 제대로 전달할 수 있습니다. 따라서 먼저 Android manifest 파일에서 검색 가능 활동을 선언해야 합니다.
검색 가능 활동 선언하기
검색하고 결과를 표시할 Activity 가 아직 없다면 만드세요. 검색 기능은 아직 구현하지 않아도 됩니다. manifest에서 선언할 수 있는 활동을 만들면 됩니다. manifest의
요소 내부에서 다음과 같이 하세요. ACTION_SEARCH 인텐트를 허용하는 활동을
요소에서 선언합니다. 사용할 검색 가능한 구성을 요소에서 지정합니다. 예를 들어 다음과 같습니다.
…
요소는 android:name 속성(값 “android.app.searchable” 사용)을 포함하고 검색 가능한 구성 파일(이 예에서는 res/xml/searchable.xml 파일을 나타냄)의 참조와 함께 android:resource 속성을 포함해야 합니다. 참고:
에는 DEFAULT 값을 가진 가 필요 없습니다(일반적으로 요소에는 존재함). 왜냐하면 시스템에서 구성요소 이름을 사용해 명시적으로 ACTION_SEARCH 인텐트를 검색 가능 활동에 전달하기 때문입니다. 검색하기
manifest에서 검색 가능 활동을 선언하고 나면 다음 3개 단계를 통해 검색 가능 활동에서 검색이 이루어집니다.
일반적으로 검색결과는 ListView 에 표시되므로 검색 가능 활동이 ListActivity 를 확장해야 할 수도 있습니다. 이 활동은 단일 ListView 와 함께 기본 레이아웃을 포함하며 ListView 작업을 위한 다수의 편의 메서드를 제공합니다.
쿼리 수신하기
사용자가 검색 대화상자 또는 위젯에서 검색을 실행하면 검색 가능 활동이 시작되고 이 활동에 ACTION_SEARCH 인텐트가 전송됩니다. 이 인텐트는 QUERY 문자열 extra에 검색어를 포함하고 있습니다. 활동이 시작될 때 이 인텐트를 확인하고 문자열을 추출해야 합니다. 예를 들어 검색 가능 활동이 시작될 때 검색어를 가져올 수 있는 방법은 다음과 같습니다.
Kotlin override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) // Verify the action and get the query if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> doMySearch(query) } } } 자바 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); // Get the intent, verify the action and get the query Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); } }
QUERY 문자열은 항상 ACTION_SEARCH 인텐트와 함께 포함됩니다. 이 예에서는 쿼리가 검색되어 실제 검색 작업이 완료되는 로컬 doMySearch() 메서드에 전달됩니다.
데이터 검색하기
데이터를 저장하고 검색하는 프로세스는 애플리케이션에 따라 다릅니다. 다양한 방법으로 데이터를 저장하고 검색할 수 있지만, 이 가이드에서는 데이터를 저장하고 검색하는 방법을 설명하지는 않습니다. 데이터 저장 및 검색은 요구사항과 데이터 형식의 측면에서 신중하게 고려해야 합니다. 다음은 적용할 수 있는 도움말입니다.
데이터가 기기의 SQLite 데이터베이스에 저장되는 경우 전체 텍스트를 검색하면( LIKE 쿼리 대신 FTS3 사용) 텍스트 데이터를 더욱 안정적으로 찾을 수 있으며 훨씬 더 빠르게 결과를 생성할 수 있습니다. Android의 SQLite에 관해 자세히 알아보려면 sqlite.org에서 FTS3 및 SQLiteDatabase 클래스 관련 내용을 확인하세요.
쿼리 대신 FTS3 사용) 텍스트 데이터를 더욱 안정적으로 찾을 수 있으며 훨씬 더 빠르게 결과를 생성할 수 있습니다. Android의 SQLite에 관해 자세히 알아보려면 sqlite.org에서 FTS3 및 클래스 관련 내용을 확인하세요. 데이터가 온라인으로 저장되는 경우 인식되는 검색 성능은 사용자의 데이터 연결에 의해 저하될 수 있습니다. 검색에서 결과가 반환될 때까지 회전하는 진행률 동그라미를 표시해야 할 수 있습니다. 네트워크 API 참조는 android.net 을 확인하고, 진행률 동그라미를 표시하는 방법에 관한 자세한 내용은 진행률 대화상자 만들기를 참고하세요.
결과 표시하기
데이터의 위치 및 데이터를 검색하는 방법과 관계없이 검색결과는 Adapter 를 통해 검색 가능 활동에 반환하는 것이 좋습니다. 이렇게 하면 모든 검색결과를 ListView 에 쉽게 표시할 수 있습니다. 데이터가 SQLite 데이터베이스 쿼리에서 제공되는 경우 CursorAdapter 를 사용하여 결과를 ListView 에 적용할 수 있습니다. 데이터가 다른 유형의 형식으로 제공되는 경우 BaseAdapter 의 확장자를 만들 수 있습니다.
Adapter 는 데이터 세트의 각 항목을 View 객체에 바인딩합니다. Adapter 가 ListView 에 적용되면 각 데이터는 개별 뷰로 목록에 삽입됩니다. Adapter 는 인터페이스일 뿐이므로, CursorAdapter ( Cursor 의 데이터를 바인딩하는 용도)와 같은 구현이 필요합니다. 기존 구현이 데이터에 적합하지 않은 경우 BaseAdapter 에서 고유하게 구현할 수 있습니다.
검색 가능 활동이 ListActivity 를 확장해야 할 수도 있습니다. 이런 경우에는 setListAdapter() 를 호출하고 데이터에 바인딩된 Adapter 를 전달하면 됩니다. 그러면 모든 검색결과가 ListView 활동에 삽입됩니다.
결과를 목록으로 표시하는 방법에 관해 추가 도움말을 보려면 ListActivity 문서를 참고하세요.
검색 대화상자 사용하기
검색 대화상자는 왼쪽에 애플리케이션 아이콘이 표시된 플로팅 검색창을 화면 상단에 제공합니다. 검색 대화상자는 사용자가 입력할 때 추천 검색어를 제공할 수 있으며, 사용자가 검색을 실행하면 시스템에서는 검색을 실행하는 검색 가능 활동에 검색어를 전송합니다. Android 3.0을 실행하는 기기용 애플리케이션을 개발하는 경우에는 검색 대화상자 대신 검색 위젯을 고려하세요(검색 위젯 사용하기 섹션 참고).
검색 대화상자는 사용자가 활성화할 때까지 기본적으로 항상 숨겨집니다. 애플리케이션은 onSearchRequested() 를 호출하여 검색 대화상자를 활성화할 수 있습니다. 하지만 이 방법은 활동에 검색 대화상자를 사용 설정한 후에만 작동합니다.
검색 대화상자를 사용 설정하려면 검색이 이루어지기 위해서는 어느 검색 가능 활동이 검색 대화상자의 검색어를 수신해야 하는지를 시스템에 알려야 합니다. 예를 들어 이전 섹션인 검색 가능 활동 만들기에서 SearchableActivity 라는 검색 가능 활동을 만들었습니다. 검색 대화상자를 표시하고 검색어를 SearchableActivity 에 전달하는 OtherActivity 라는 별도의 활동을 만들려면 SearchableActivity 가 OtherActivity 의 검색 대화상자에 사용할 검색 가능 활동이라는 것을 manifest에서 선언해야 합니다.
활동의 검색 대화상자를 위한 검색 가능 활동을 선언하려면 개별 활동의
요소 내부에 요소를 추가합니다. 요소에는 검색 가능 활동의 클래스 이름을 지정하는 android:value 속성과 android:name 속성(값 “android.app.default_searchable” 사용)을 포함해야 합니다. 예를 들어 다음은 검색 가능 활동 SearchableActivity 및 다른 활동 OtherActivity (검색 대화상자에서 실행된 검색을 를 사용해 수행함)를 모두 선언합니다.
… 현재 OtherActivity 에는 검색에 사용할 검색 가능 활동을 선언하는
요소가 포함되어 있으므로, 활동은 검색 대화상자를 사용 설정한 상태입니다. 사용자가 이 활동에 있는 동안 onSearchRequested() 메서드는 검색 대화상자를 활성화합니다. 사용자가 검색을 실행하면 시스템에서 SearchableActivity 가 시작되고 ACTION_SEARCH 인텐트가 이 활동에 전달됩니다. 참고: 검색 가능 활동 자체가 기본적으로 검색 대화상자를 제공하므로 개발자는 이 선언을 SearchableActivity 에 추가할 필요가 없습니다.
애플리케이션의 모든 활동에서 검색 대화상자를 제공하려면 각
대신 위의 요소를 요소의 하위 요소로 삽입하세요. 이렇게 하면 모든 활동이 값을 상속하고, 검색 대화상자를 제공하며, 동일한 검색 가능 활동에 검색어를 전달합니다. 검색 가능 활동이 여러 개인 경우 개별 활동 내부에 다른 선언을 배치하여 기본 검색 가능 활동을 재정의할 수 있습니다. 이제 활동에 관해 검색 대화상자를 사용 설정했으므로 애플리케이션에서 검색할 준비가 되었습니다.
검색 대화상자 호출하기
일부 기기에서 전용 검색 버튼을 제공하지만 버튼의 동작은 기기마다 다를 수 있으며, 대부분의 기기는 검색 버튼을 제공하지 않습니다. 따라서 검색 대화상자를 사용할 때는 onSearchRequested() 호출을 통해 검색 대화상자를 활성화하는 검색 버튼을 UI에 제공해야 합니다.
예를 들어 옵션 메뉴 또는 onSearchRequested() 를 호출하는 UI 레이아웃에 검색 버튼을 추가합니다. Android 시스템 및 다른 앱과의 일관성을 위해 Android 검색 아이콘을 사용해 버튼에 라벨을 지정해야 합니다. 이 아이콘은 작업 모음 아이콘 팩에서 구할 수 있습니다.
참고: 앱에 앱 바가 사용되는 경우 검색 인터페이스로 검색 대화상자를 사용해서는 안 됩니다. 대신 검색 위젯을 앱 바에서 축소할 수 있는 뷰로 사용하세요.
‘입력하여 검색’ 기능을 사용 설정할 수도 있으며, 이 경우 사용자가 키보드에서 입력하기 시작하면 검색 대화상자가 활성화되어 키 입력이 검색 대화상자에 삽입됩니다. 활동의 onCreate() 메서드 중에 setDefaultKeyMode ( DEFAULT_KEYS_SEARCH_LOCAL )를 호출하면 활동에 관해 ‘입력하여 검색’ 기능을 사용 설정할 수 있습니다.
검색 대화상자가 활동 수명 주기에 미치는 영향
검색 대화상자는 화면 상단에 표시되는 플로팅 Dialog 입니다. 이 대화상자로 인해 활동 스택이 변경되지는 않으므로, 검색 대화상자가 표시되어도 onPause() 와 같은 수명 주기 메서드가 호출되지 않습니다. 입력 포커스는 검색 대화상자에 표시되므로, 활동에 위치한 입력 포커스가 사라질 뿐입니다.
검색 대화상자가 활성화되었을 때 알림을 받으려면 onSearchRequested() 메서드를 재정의합니다. 시스템에서 이 메서드를 호출하면 이는 입력 포커스가 활동에서 검색 대화상자로 옮겨졌으며 이벤트에 적합한 모든 작업(예: 게임 일시중지)을 할 수 있다는 것을 나타냅니다. 검색 문맥 데이터를 전달(아래에서 설명)하지 않는 경우 슈퍼클래스 구현을 호출하여 메서드를 종료해야 합니다. 예를 들어 다음과 같습니다.
Kotlin override fun onSearchRequested(): Boolean { pauseSomeStuff() return super.onSearchRequested() } 자바 @Override public boolean onSearchRequested() { pauseSomeStuff(); return super.onSearchRequested(); }
사용자가 뒤로 버튼을 눌러 검색을 취소하면 검색 대화상자가 닫히고 활동에 입력 포커스가 다시 표시됩니다. setOnDismissListener() 및/또는 setOnCancelListener() 를 사용하면 검색 대화상자가 닫힐 때 알림을 받도록 등록할 수 있습니다. 검색 대화상자가 닫힐 때마다 호출되는 OnDismissListener 만 등록하면 됩니다. OnCancelListener 는 사용자가 명시적으로 검색 대화상자를 종료한 경우에만 적용되며 검색이 실행된 경우에는 호출되지 않습니다(검색 대화상자가 저절로 사라짐).
현재 활동이 검색 가능 활동이 아닌 경우에는 사용자가 검색을 실행하면 일반 활동 수명 주기 이벤트가 트리거됩니다(현재 활동은 활동 문서의 설명대로 onPause() 등을 수신함). 이와 달리, 현재 활동이 검색 가능 활동인 경우에는 다음 둘 중 하나가 발생합니다.
기본적으로 검색 가능 활동은 onCreate() 호출이 있는 ACTION_SEARCH 인텐트를 수신하며 활동의 새 인스턴스가 활동 스택의 맨 위에 표시됩니다. 이제 활동 스택에 검색 가능 활동의 인스턴스 2개가 있으므로 뒤로 버튼을 누르면 기존 검색 가능 활동이 종료되는 것이 아니라 이전 검색 가능 활동 인스턴스로 돌아갑니다. android:launchMode 를 “singleTop” 으로 설정하는 경우 검색 가능 활동은 onNewIntent(Intent) 호출이 있는 ACTION_SEARCH 인텐트를 수신하고 여기에 새 ACTION_SEARCH 인텐트를 전달합니다. 예를 들어, 검색 가능 활동의 실행 모드가 “singleTop” 일 때 이런 경우를 처리하는 방법은 다음과 같습니다. Kotlin override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) handleIntent(intent) } override fun onNewIntent(intent: Intent) { setIntent(intent) handleIntent(intent) } private fun handleIntent(intent: Intent) { if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> doMySearch(query) } } } 자바 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); handleIntent(getIntent()); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); doMySearch(query); } } 검색 수행하기 섹션의 예제 코드와 비교할 때, 검색 인텐트를 처리하는 모든 코드가 이제 onCreate() 및 onNewIntent() 모두에서 실행될 수 있도록 handleIntent() 메서드에 배치되었습니다. 시스템에서 onNewIntent(Intent) 를 호출하는 시점에 활동이 아직 다시 시작되지 않았으므로 getIntent() 메서드는 onCreate() 에서 수신된 것과 동일한 인텐트를 반환합니다. 이러한 이유로 onNewIntent(Intent) 내부에서 setIntent(Intent) 를 호출해야 합니다(활동이 저장한 인텐트가 이후 getIntent() 를 호출하는 경우 업데이트됨).
“singleTop” 실행 모드를 사용하는 두 번째 시나리오는 대체로 이상적입니다. 검색이 완료된 후에 사용자가 추가 검색을 수행할 가능성이 높기 때문입니다. 이때 애플리케이션에서 검색 가능 활동 인스턴스를 여러 개 만드는 경우에는 검색 환경이 저하될 수 있습니다. 그러므로 애플리케이션 manifest에서 검색 가능 활동을 “singleTop” 실행 모드로 설정하는 것이 좋습니다. 예를 들어 다음과 같습니다.
검색 문맥 데이터 전달하기
경우에 따라서는 검색할 때마다 검색 가능 활동 내에서 검색어를 필요한 대로 수정할 수 있습니다. 그러나 사용자가 검색을 수행하는 활동을 기반으로 검색 기준을 조정하려면 시스템이 검색 가능 활동에 전송하는 인텐트에 추가 데이터를 제공하면 됩니다. ACTION_SEARCH 인텐트에 포함되는 APP_DATA Bundle 로 추가 데이터를 전달할 수 있습니다.
이런 종류의 데이터를 검색 가능 활동에 전달하려면 사용자가 검색을 수행할 수 있는 활동에 관한 onSearchRequested() 메서드를 재정의하고, 추가 데이터가 있는 Bundle 을 만들고, startSearch() 를 호출해 검색 대화상자를 활성화합니다. 예를 들어 다음과 같습니다.
Kotlin override fun onSearchRequested(): Boolean { val appData = Bundle().apply { putBoolean(JARGON, true) } startSearch(null, false, appData, false) return true } 자바 @Override public boolean onSearchRequested() { Bundle appData = new Bundle(); appData.putBoolean(SearchableActivity.JARGON, true); startSearch(null, false, appData, false); return true; }
‘true’가 반환되면 이 콜백 이벤트를 성공적으로 처리했으며 startSearch() 를 호출해 검색 대화상자를 활성화했다는 의미입니다. 사용자가 쿼리를 제출하면 이 쿼리는 개발자가 추가한 데이터와 함께 검색 가능 활동에 전달됩니다. APP_DATA Bundle 에서 추가 데이터를 추출하여 검색 범위를 더 좁힐 수 있습니다. 예를 들어 다음과 같습니다.
Kotlin val jargon: Boolean = intent.getBundleExtra(SearchManager.APP_DATA)?.getBoolean(JARGON) ?: false 자바 Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA); if (appData != null) { boolean jargon = appData.getBoolean(SearchableActivity.JARGON); }
주의: onSearchRequested() 콜백 메서드 외부에서 startSearch() 메서드를 호출하지 마세요. 활동에서 검색 대화상자를 활성화하려면 항상 onSearchRequested() 를 호출하세요. 그러지 않으면 onSearchRequested() 가 호출되지 않으며 맞춤설정(예: 위 예에서 appData 추가)이 누락됩니다.
검색 위젯 사용하기
그림 2. 작업 모음의 ‘작업 뷰’인 SearchView 위젯
SearchView 위젯은 Android 3.0 이상에서 사용할 수 있습니다. 검색 위젯을 사용하기로 하고 Android 3.0용 애플리케이션을 개발하는 중이면 검색 대화상자를 사용하지 말고, 검색 위젯을 활동 레이아웃에 배치하는 대신 앱 바에 작업 뷰로 삽입하는 것이 좋습니다. 예를 들어 그림 2는 앱 바의 검색 위젯을 보여줍니다.
검색 위젯은 검색 대화상자와 동일한 기능을 제공합니다. 사용자가 검색을 실행하면 적합한 활동을 시작하며 추천 검색어를 제공하고 음성 검색을 실행할 수 있습니다. 작업 모음에 검색 위젯을 배치하지 않는 경우 활동 레이아웃의 어딘가에 검색 위젯을 배치할 수 있습니다.
참고: 검색 위젯을 작업 뷰로 사용할 때에도 검색 위젯이 작업 모음에 맞지 않는 경우를 위해 검색 대화상자 사용을 지원해야 할 수 있습니다. 아래의 위젯과 대화상자 모두 사용하기 섹션을 참고하세요.
검색 위젯 구성하기
검색 가능한 구성 및 검색 가능 활동을 만든 후에는 위의 설명대로 각 SearchView 의 지원 검색을 사용 설정해야 합니다. setSearchableInfo() 를 호출하여 검색 가능한 구성을 나타내는 SearchableInfo 객체에 전달하면 됩니다.
SearchManager 에 관해 getSearchableInfo() 를 호출하여 SearchableInfo 참조를 가져올 수 있습니다.
예를 들어 SearchView 를 앱 바의 작업 뷰로 사용 중인 경우 onCreateOptionsMenu() 콜백 도중에 위젯을 사용 설정해야 합니다.
Kotlin override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the options menu from XML val inflater = menuInflater inflater.inflate(R.menu.options_menu, menu) // Get the SearchView and set the searchable configuration val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager (menu.findItem(R.id.menu_search).actionView as SearchView).apply { // Assumes current activity is the searchable activity setSearchableInfo(searchManager.getSearchableInfo(componentName)) setIconifiedByDefault(false) // Do not iconify the widget; expand it by default } return true } 자바 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the options menu from XML MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); // Get the SearchView and set the searchable configuration SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); // Assumes current activity is the searchable activity searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default return true; }
완료되었습니다. 이제 검색 위젯이 구성되었고 시스템은 검색 가능 활동에 검색어를 전달하게 됩니다. 검색 위젯에 추천 검색어를 사용하도록 설정할 수도 있습니다.
참고: 모든 사용자 입력을 직접 처리하려면 일부 콜백 메서드와 이벤트 리스너를 사용하면 됩니다. 자세한 내용은 SearchView 및 중첩된 인터페이스에 관한 참조 문서에서 적절한 이벤트 리스너를 확인하세요.
작업 모음의 작업 뷰에 관한 자세한 내용은 작업 뷰 및 작업 제공자를 참고하세요.
기타 검색 위젯 기능
SearchView 위젯은 개발자에게 필요할 수도 있는 다음과 같은 추가 기능을 제공합니다.
제출 버튼 기본적으로 검색어를 제출하는 버튼이 없으며 사용자가 키보드의 ‘Return’ 키를 눌러야 검색이 시작됩니다. setSubmitButtonEnabled(true) 를 호출하여 ‘제출’ 버튼을 추가할 수 있습니다. 추천 검색어의 쿼리 조정 추천 검색어를 사용 설정했다면 일반적으로 사용자가 단순히 추천 검색어를 선택하기를 기대합니다. 하지만 사용자는 추천된 검색어를 조정할 수도 있습니다. setQueryRefinementEnabled(true) 를 호출하면 사용자가 조정할 수 있게 추천 검색어를 검색창에 삽입하는 버튼을 추가하여 각 추천 검색어와 함께 표시할 수 있습니다. 검색창 표시 여부를 전환하는 기능 기본적으로 검색 위젯은 ‘아이콘화’되어 검색 아이콘(돋보기)으로만 표시되며 사용자가 터치하면 위젯이 확장되어 검색창이 표시됩니다. 위에 예처럼 setIconifiedByDefault(false) 를 호출하면 기본적으로 검색 창을 표시할 수 있습니다. setIconified() 를 호출하여 검색 위젯 디자인을 전환할 수도 있습니다.
SearchView 클래스에는 검색 위젯을 맞춤설정할 수 있는 다른 API가 몇 가지 있습니다. 하지만 그중 대부분은 Android 시스템을 사용하여 검색어를 전달하고 추천 검색어를 표시하는 대신 모든 사용자 입력을 직접 처리할 때만 사용됩니다.
위젯과 대화상자 모두 사용하기
검색 위젯을 작업 모음에 작업 뷰로 삽입하고 ‘공간이 있을 때’ 작업 모음에 표시되도록 설정하는( android:showAsAction=”ifRoom” 설정) 경우 검색 위젯이 작업 뷰로 표시되지 않고 메뉴 항목이 더보기 메뉴에 표시될 수 있습니다. 예를 들어 작은 화면에서 애플리케이션을 실행할 때는 작업 모음에 공간이 부족하여 다른 작업 항목 또는 탐색 요소와 함께 검색 위젯이 표시되지 않을 수 있으며 이 경우 대신 더보기 메뉴에 메뉴 항목이 표시됩니다. 더보기 메뉴에 배치된 항목은 일반적인 메뉴 항목처럼 작동하며 작업 뷰(검색 위젯)를 표시하지 않습니다.
이러한 상황을 처리하기 위해서는 검색 위젯에 연결한 메뉴 항목을 사용자가 더보기 메뉴에서 선택하면 검색 대화상자가 활성화되어야 합니다. 그러려면 ‘검색’ 메뉴 항목을 처리하도록 onOptionsItemSelected() 를 구현하고 onSearchRequested() 를 호출하여 검색 대화상자를 열어야 합니다.
작업 모음의 항목이 작동하는 방식 및 이 상황을 처리하는 방법을 자세히 알아보려면 작업 모음 개발자 가이드를 참고하세요.
음성 검색 추가하기
검색 가능한 구성에 android:voiceSearchMode 속성을 추가하여 검색 대화상자 또는 위젯에 음성 검색 기능을 추가할 수 있습니다. 그러면 음성 안내를 시작하는 음성 검색 버튼이 추가됩니다. 사용자가 말하기를 마치면 텍스트로 변환된 검색어가 검색 가능 활동에 전달됩니다.
예를 들어 다음과 같습니다.
값 showVoiceSearchButton 은 음성 검색을 사용 설정하는 데 필요하고, 두 번째 값 launchRecognizer 는 음성 검색 버튼이 변환된 텍스트를 검색 가능 활동에 반환하는 인식기를 실행해야 한다는 것을 지정합니다.
예상되는 언어 및 반환할 최대 검색결과 수와 같이 음성 검색 동작을 지정하는 추가 속성을 제공할 수 있습니다. 사용할 수 있는 속성에 관한 자세한 내용은 검색 가능한 구성 참조를 확인하세요.
참고: 음성 검색이 애플리케이션에 적합한지 여부를 신중하게 고려하세요. 음성 검색 버튼을 사용한 모든 검색은 사용자가 텍스트 변환된 쿼리를 검토할 기회 없이 즉시 검색 가능 활동에 전송됩니다. 음성 인식을 충분히 테스트하여 사용자가 애플리케이션 내에서 제출할 수 있는 유형의 쿼리를 음성 인식에서 이해하는지 확인하세요.
추천 검색어 추가하기
그림 3. 검색 대화상자의 맞춤 추천 검색어 스크린샷
검색 대화상자와 검색 위젯은 모두 사용자가 입력할 때 Android 시스템의 지원을 통해 추천 검색어를 제공할 수 있습니다. 시스템에서는 추천 검색어 목록을 관리하고 사용자가 추천 검색어를 선택하면 이벤트를 처리합니다.
두 가지 추천 검색어를 제공할 수 있습니다.
[안드로이드] 동물 리스트(ListView) 검색(SearchView) 기능 추가 방법
반응형
2021.12.24 – [안드로이드] – [안드로이드] ListView 동물 리스트 만드는 방법
이전 시간에 ListView를 통해 동물 리스트를 만들어 보았습니다.
이번 시간에는 동물 리스트에 조회 기능을 추가해 보겠습니다.
1. 메인 화면 구성 activity_main.xml
기존 만들었던 화면에 SearchView 태그가 추가되었습니다.
queryHint는 검색 아이콘을 누르면 미리 보여주는 문구입니다.
2. 메인 코드 구현 MainActivity.java
onCreate 메서드에 searchAnimal() 함수를 입력하고
searchAnimal 함수를 추가하였습니다.
public class MainActivity extends AppCompatActivity { public static ArrayList
animalList = new ArrayList (); ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); searchAmimal(); setUpData(); //데이터 셋팅 setUpList(); //리스트 셋팅 setUpOnClickListener();// 상세 페이지 이벤트 } private void searchAmimal(){ SearchView searchView = findViewById(R.id.animal_search_view); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { ArrayList filterAnimal = new ArrayList<>(); for(int i = 0; i < animalList.size(); i++){ Animal animal = animalList.get(i); //데이터와 비교해서 내가 쓴 동물 이름이 있다면 if(animal.getName().toLowerCase().contains(newText.toLowerCase())){ filterAnimal.add(animal); } } AnimalAdapter adapter = new AnimalAdapter(getApplicationContext(), 0, filterAnimal); listView.setAdapter(adapter); return false; } }); } private void setUpData() { Animal elephant = new Animal("0", "elephant", R.drawable.elephant); animalList.add(elephant); Animal lion = new Animal("1", "lion", R.drawable.lion); animalList.add(lion); Animal monkey = new Animal("2", "monkey", R.drawable.monkey); animalList.add(monkey); Animal mouse = new Animal("3", "mouse", R.drawable.mouse); animalList.add(mouse); Animal rabbit = new Animal("4", "rabbit", R.drawable.rabbit); animalList.add(rabbit); Animal elephant2 = new Animal("5", "elephant2", R.drawable.elephant); animalList.add(elephant2); Animal lion2 = new Animal("6", "lion2", R.drawable.lion); animalList.add(lion2); Animal monkey2 = new Animal("7", "monkey2", R.drawable.monkey); animalList.add(monkey2); Animal mouse2 = new Animal("8", "mouse2", R.drawable.mouse); animalList.add(mouse2); Animal rabbit2 = new Animal("9", "rabbit2", R.drawable.rabbit); animalList.add(rabbit2); } private void setUpList() { listView = findViewById(R.id.animal_listView); AnimalAdapter adapter = new AnimalAdapter(getApplicationContext(), 0, animalList); listView.setAdapter(adapter); } private void setUpOnClickListener() { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView> adapterView, View view, int position, long l) { Animal selectAnimal = (Animal)listView.getItemAtPosition(position); Intent showDetail = new Intent(getApplicationContext(), DetailActivity.class); showDetail.putExtra(“id”, selectAnimal.getId()); startActivity(showDetail); } }); } } 3. 실행화면
li를 입력하자 li가 포함된 정보만 조회가 되고 있습니다.
2021.12.23 – [안드로이드] – [안드로이드] NumberPicker 숫자 선택하는 방법 알아보기
2021.12.20 – [안드로이드] – [안드로이드] Material Floating Action Button 쉽게 만드는 방법
2021.12.21 – [안드로이드] – [안드로이드] Material Floating Action Button Animation 적용하는 방법
반응형
[안드로이드][맛집찾기][2] 키워드 검색화면 구현하기
화면 설계에서 정의한 기능을 하나씩 구현해나가보도록 하겠습니다.
https://srandroid.tistory.com/292?category=977094
화면구조
맛집찾기화면은 FindFragment, 키워드 검색화면은 SearchFragment라고 정의하였습니다.
NavigationComponent를 이용하여 구현하였습니다. navigation graph 툴을 사용하여 화면 이동을 직관적으로 이해 할 수 있습니다.
검색어 입력 위젯 구현
입력기 검색버튼 설정
Edittext에서 아래 옵션을 설정해주면 그림과 같이 검색버튼이 나오게 설정 할 수 있습니다.
검색어 버튼 데이터바인딩
입력기의 검색버튼을 클릭 시 이벤트를 따로 설정해줘야합니다. 이를 데이터바인딩을 커스텀하여 사용하면 보다 편리하게 이벤트를 구현 할 수 있습니다.
@BindingAdapter(“app:OnEditorAction”) fun onEditorAction(editText: EditText, unit: () -> Unit) { editText.setOnEditorActionListener { v, actionId, event -> if (actionId == EditorInfo.IME_ACTION_SEARCH) { unit.invoke() true } false } }
안드로이드앱을 만들면서 가장 많이 쓰는 기능중에 하나인 커스텀 리스트뷰에 검색기능을 추가해보겠습니다. 아무래도 일련의 데이터를 나열해주는 리스트뷰이기 때문에 검색기능이 필수적으로 필요한데요.. 검색기능을 넣는 방법은 여러가지가 있지만 여기서는 검색어를 입력하는 EditText창이 변할때마다 리스트뷰가 바뀌는 방식으로 구현해보도록 하겠습니다.
아마 대부분 위와같은 형태의 뷰를 만들지 않을까…? 하고 조심스럽게 추측합니다. ㅎㅎㅎ
검색할수있는 EditText부분과 그 아래 보여지는 커스텀 뷰가 있겠죠. 그럼 어떻게 이 두개를 연결할까요?
여기서는 EditText의 TextChangeListener를 활용합니다. TextChangeListener는 말 그대로 EditText의 입력된 글이 변할때마다 호출되는 CallBack메소드로 TextWatcher라는 인터페이스를 사용할 수 있습니다. TextWatcher는 다음과 같은 내부 메소드를 가지고 있습니다.
Public methods abstract void afterTextChanged(Editable s) This method is called to notify you that, somewhere within s , the text has been changed. abstract void beforeTextChanged(CharSequence s, int start, int count, int after) This method is called to notify you that, within s , the count characters beginning at start are about to be replaced by new text with length after . abstract void onTextChanged(CharSequence s, int start, int before, int count) This method is called to notify you that, within s , the count characters beginning at start have just replaced old text that had length before .
영어로 되어있지만 메소드 이름만 봐도 어떤역할인지 아실겁니다.. ㅎㅎ after~의 경우 글자가 바뀌고 난후, before는 글짜가 바뀌기 전, on~은 바뀌는 순간에 실행되죠. 이렇게 메소드만 봐서는 머 어떻게하는건지 모르니까 실제로 어떻게 사용하는지 보겠습니다.
et_searchText .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) {
}
@Override
public void afterTextChanged (Editable s) {
String searchText = et_searchText .getText().toString() ;
adapter .fillter(searchText) ;
}
}) ;
여기서 et_searchText는 EditText 객체 입니다. 여기서는 텍스트를 입력하고 난 뒤에 리스트 뷰가 갱신되기 때문에 afterTextChanged 아래 필요한 메소드를 적었습니다.
일단 커스텀 리스트뷰를 생성하는 것을 알고있다는 가정 하에 진행하도록 하겠습니다.
(혹시 모른다면 참조 – http://cholol.tistory.com/300 )
텍스트뷰가 바뀌었을 경우 리스트뷰가 바뀌는 메소드를 filler라는 이름으로 구현하도록 하겠습니다. fillter는 리스트뷰를 뿌려주는 역할을 하는 listviewadapter부분에 생성하게 됩니다.
public void fillter (String searchText) {
displayListItem .clear() ;
if (searchText.length() == 0 )
{
displayListItem .addAll( listItem ) ;
}
else
{
for ( BookListItem item : listItem )
{
if (item.getBookName().contains(searchText))
{
displayListItem .add(item) ;
}
}
}
notifyDataSetChanged() ;
}
위 코드가 adapter부분에 구현된 fillter메소드입니다. 메소드가 실행되면 인풋인 searchText를 현재 가지고 있는 리스트와 비교하여 리스트의 텍스트가 searchText를 포함하고 있다면 리스트뷰에 보여주도록 짜여있습니다. 여기서 기존 리스트뷰 어댑터와 다른점은 List객체를 두 개를 만들었다는 점입니다.
보통 커스텀리스트뷰를 만들 때, 리스트에 추가하는 List객체는 하나를 사용하는데, 여기서는 listItem이라는 List와 displayListItem이라는 List 두 개를 사용했습니다. listItem의 경우는 실제로 전체의 내용을 담고있는 listItem이며 displayListItem은 리스트뷰를 통해 보여줄 리스트입니다. 이렇게 사용하는 이유는 검색어에 따라 화면에 보여주는 List가 다르기 때문입니다. (검색어가 없을경우 전체를 보여주지만 검색어가 있을경우 전체리스트중에 해당하는 리스트만 보여줘야하기 때문에)
따라서 전체의 리스트를 보여줄때에는 listItem = displayListItem이지만 그외의 경우에는 항상 listItem > displayListItem입니다.
fillter 마지막에 있는 notifyDataSetChanged()메소드는 리스트뷰의 데이터가 바뀌었으니 갱신해야한다는 것을 리스트뷰에 알리는 메소드입니다.
소스를 적용하고 실행하면 다음과 같이 검색되는 것을 확인 할 수 있습니다.
검색어가 입력되는 순간 리스트뷰가 갱신되는 것을 확인할 수 있습니다~
반응형
프로젝트8. 회원 검색 기능 추가
반응형
예제 출처 : https://www.inflearn.com/course
예제 소스 : https://github.com/GaKaRi/gakari_android/tree/master/Proj_Manager_v8
이전예제
이번에는 관리자 계정으로 원하는 계정을 검색하는 기능을 추가하는 예제입니다.
먼저 admin으로 로그인을 합니다.
여기서 MANAGE 버튼을 누릅니다.
search창에서 aa를 검색해봅시다.
aa로 검색하면 다음과 같이 aa계정이 검색됩니다. 그후 삭제 버튼을 누르고 다시 사용자 계정 리스트를 보면
다음과 같이 aa계정이 삭제됬음을 알 수 있습니다.
activity_management.xml
여기서 검색창으로 사용할 EditText를 추가해줍니다.
< ?xml version = "1.0" encoding = "utf-8" ? >
android:layout_width = “match_parent”
android:layout_height = “match_parent”
tools:context = “com.example.kch.proj_manager_v8.ManagementActivity” >
< LinearLayout android:layout_width = "368dp" android:layout_height = "495dp" android:orientation = "vertical" android:background = "#d1d1d1" tools:layout_editor_absoluteY = "8dp" tools:layout_editor_absoluteX = "8dp" >
< EditText android:id = "@+id/search" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:hint = "search" / >
< ListView android:layout_width = "match_parent" android:layout_height = "match_parent" android:id = "@+id/listView" android:layout_marginTop = "10dp" android:layout_marginRight = "15dp" android:layout_marginLeft = "15dp" android:dividerHeight = "10dp" android:divider = "#d1d1d1" >
ListView >
LinearLayout >
android.support.constraint.ConstraintLayout >
ManagementActivity.java
위에서 추가한 EditText 객체를 만들고 리스너를 등록합니다.
package com.example.kch.proj_manager_v8;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.ListView;
import android.content.Intent;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class ManagementActivity extends AppCompatActivity {
private ListView listView;
private UserListAdapter adapter;
private List < User > userList;
private List < User > saveList; // 회원검색 기능용 복사본
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_management);
/* TextView userListTextView = (TextView)findViewById(R.id.listView);
//ManagementActivity 는 MainActivity 에서 호출되므로 호출시 넘겨준 데이터를 뿌려주는 역할을 한다
Intent intent = getIntent();
//intent.putExtra(“userList”, result); 에서 userList 에 저장했으므로 아래와 같이 쓰게됨
userListTextView.setText(intent.getStringExtra(“userList”));*/
Intent intent = getIntent();
listView = (ListView)findViewById(R.id.listView);
userList = new ArrayList < User > ();
saveList = new ArrayList < User > ();
// 어댑터 초기화부분 userList 와 어댑터를 연결해준다 .
// 회원 삭제 및 관리자 기능 아래 부분 수정됨
//adapter = new UserListAdapter(getApplicationContext(), userList);
adapter = new UserListAdapter(getApplicationContext(), userList, this , saveList); // 로 수정됨
listView.setAdapter(adapter);
try {
//intent 로 값을 가져옵니다 이때 JSONObject 타입으로 가져옵니다
JSONObject jsonObject = new JSONObject(intent.getStringExtra( “userList” ));
//List.php 웹페이지에서 response 라는 변수명으로 JSON 배열을 만들었음 ..
JSONArray jsonArray = jsonObject.getJSONArray( “response” );
int count = 0 ;
String userID, userPassword, userName, userAge;
//JSON 배열 길이만큼 반복문을 실행
while (count < jsonArray. length ()){ //count 는 배열의 인덱스를 의미 JSONObject object = jsonArray.getJSONObject(count); userID = object.getString( "userID" ); // 여기서 ID 가 대문자임을 유의 userPassword = object.getString( "userPassword" ); userName = object.getString( "userName" ); userAge = object.getString( "userAge" ); // 값들을 User 클래스에 묶어줍니다 User user = new User(userID, userPassword, userName, userAge); if ( ! userID. equals ( "admin" )) // 관리자계정은 삭제하지않게 하기위해서 씀 { userList. add (user); // 리스트뷰에 값을 추가해줍니다 saveList. add (user); // 여기도 똑같이 값을 추가해줍니다 . 회원검색기능용 } count ++ ; } } catch (Exception e){ e.printStackTrace(); } EditText search = (EditText)findViewById(R.id.search); search.addTextChangedListener( new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { searchUser(charSequence. toString ()); // 회원 검색 기능용 } @Override public void afterTextChanged(Editable editable) { } }); } public void searchUser( String search){ userList.clear(); for ( int i = 0 ; i < saveList.size(); i ++ ){ if (saveList.get(i).getUserID().contains(search)){ //contains 메소드로 search 값이 있으면 true 를 반환함 userList. add (saveList.get(i)); } } adapter.notifyDataSetChanged(); // 어댑터에 값일 바뀐것을 알려줌 } } UserListAdapter.java saveList는 원래 사용자계정 리스트의 원본이고 userList는 실제 리스트뷰로 보여주는 사용자계정 리스트이므로 그점에 유의해서 아래와 같이 구현합니다. package com.example.kch.proj_manager_v8; import android.app.Activity; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.TextView; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.toolbox.Volley; import org.json.JSONObject; import java.util.List; /** * Created by kch on 2018. 2. 17.. */ public class UserListAdapter extends BaseAdapter { private Context context; private List < User > userList;
private Activity parentActivity; // 회원삭제 강의때 추가
private List < User > saveList;
// 여기서 Actvitivy parentActivity 가 추가됨 회원삭제 및 관리자기능 예제
public UserListAdapter(Context context, List < User > userList, Activity parentActivity, List < User > saveList){
this .context = context;
this .userList = userList;
this .parentActivity = parentActivity; // 회원삭제 강의때 추가
this .saveList = saveList; // 회원검색 강의때 추가
}
// 출력할 총갯수를 설정하는 메소드
@Override
public int getCount() {
return userList.size();
}
// 특정한 유저를 반환하는 메소드
@Override
public Object getItem( int i) {
return userList.get(i);
}
// 아이템별 아이디를 반환하는 메소드
@Override
public long getItemId( int i) {
return i;
}
// 가장 중요한 부분
//int i 에서 final int i 로 바뀜 이유는 deleteButton.setOnClickListener 에서 이 값을 참조하기 때문
@Override
public View getView( final int i, View view, ViewGroup viewGroup) {
View v = View.inflate(context, R.layout.user, null );
// 뷰에 다음 컴포넌트들을 연결시켜줌
//final 추가 안붙이면 에러남 리스너로 전달하고 싶은 지역변수는 final 로 처리해야됨
final TextView userID = (TextView)v.findViewById(R.id.userID);
TextView userPassword = (TextView)v.findViewById(R.id.userPassword);
TextView userName = (TextView)v.findViewById(R.id.userName);
TextView userAge = (TextView)v.findViewById(R.id.userAge);
userID.setText(userList.get(i).getUserID());
userPassword.setText(userList.get(i).getUserPassword());
userName.setText(userList.get(i).getUserName());
userAge.setText(userList.get(i).getUserAge());
// 이렇게하면 findViewWithTag 를 쓸 수 있음 없어도 되는 문장임
v.setTag(userList.get(i).getUserID());
// 삭제 버튼 객체 생성
Button deleteButton = (Button)v.findViewById(R.id.deleteButton);
deleteButton.setOnClickListener( new View.OnClickListener(){
@Override
public void onClick(View view) {
//4. 콜백 처리부분 (volley 사용을 위한 ResponseListener 구현 부분 )
Response.Listener < String > responseListener = new Response.Listener < String > (){
@Override
public void onResponse( String response) {
try {
JSONObject jsonResponse = new JSONObject(response);
boolean success = jsonResponse.getBoolean( “success” );
// 받아온 값이 success 면 정상적으로 서버로부터 값을 받은 것을 의미함
if (success){
userList.remove(i); // 리스트에서 해당부분을 지워줌
//saveList 는 찾아서 해줘야됨 이게 기준이기 때문임
for ( int i = 0 ; i < saveList.size(); i ++ ){ if (saveList.get(i).getUserID(). equals (userID.getText(). toString ())){ saveList.remove(i); break ; } } notifyDataSetChanged(); // 데이터가 변경된 것을 어댑터에 알려줌 } } catch (Exception e){ e.printStackTrace(); } } }; //volley 사용법 //1. RequestObject 를 생성한다 . 이때 서버로부터 데이터를 받을 responseListener 를 반드시 넘겨준다 . // 위에서 userID 를 final 로 선언해서 아래 처럼 가능함 DeleteRequest deleteRequest = new DeleteRequest(userID.getText(). toString (), responseListener); //2. RequestQueue 를 생성한다 . // 여기서 UserListAdapter 는 Activity 에서 상속받은 클래스가 아니므로 Activity 값을 생성자로 받아서 사용한다 RequestQueue queue = Volley.newRequestQueue(parentActivity); //3. RequestQueue 에 RequestObject 를 넘겨준다 . queue. add (deleteRequest); } //onclick }); // 만든뷰를 반환함 return v; } } 반응형
키워드에 대한 정보 안드로이드 스튜디오 검색 기능
다음은 Bing에서 안드로이드 스튜디오 검색 기능 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 안드로이드 앱 만들기 #50 주소 검색 기능 API 연동 – 쉽게 앱 만드는 방법 (현직 개발자 설명) , android studio easy tutorial
- android
- android studio
- 안드로이드
- 앱 만들기
- 안드로이드 앱
- 안드로이드 앱 만드는 법
- 앱 만드는 법
- 안드로이드 스튜디오
- 홍드로이드
- 안드로이드 주소 검색
안드로이드 #앱 #만들기 ##50 #주소 #검색 #기능 #API #연동 #- #쉽게 #앱 #만드는 #방법 #(현직 #개발자 #설명) #, #android #studio #easy #tutorial
YouTube에서 안드로이드 스튜디오 검색 기능 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 안드로이드 앱 만들기 #50 주소 검색 기능 API 연동 – 쉽게 앱 만드는 방법 (현직 개발자 설명) , android studio easy tutorial | 안드로이드 스튜디오 검색 기능, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.