[안드로이드] 리스트 뷰(ListView) 4. 컨텍스트 메뉴 달기(Context Menu)

2017. 10. 7. 19:42·IT기술 관련/모바일
반응형


이전 포스트에서 리스트 뷰(ListView)를 만들고

리스트 중 하나의 항목을 클릭하면 해당 데이터를 Toast로 표시하는 예제를 소개했습니다.


이번엔 실제 어플에 좀더 많이 사용되는 예제를 소개합니다.


실제 ListView를 사용하는 어플들을 보면

해당 항목을 오래 눌렀을 때 별도의 메뉴가 팍! 나타나는 것을 보셨을 겁니다.


가장 대표적인 경우가 문자(메세제) 목록 중 하나를 삭제하거나 할 때

해당 목록을 오래 누르고 있으면 메뉴가 팍! 올라와서 선택할 수 있는 것을 말합니다.

많이 사용되겠죠.


Context 메뉴는 이미 이전 포스트에서 소개한 적이 있었습니다.

이를 ListView에 적용해 보도록 하겠습니다.


먼저 동작 결과를 보겠습니다.


스크롤 되는 ListView

  



ListView의 첫번째 항목을 길게 눌러서 Context 메뉴 표시

   



ListView의 세번째 항목을 길게 눌러서 Context 메뉴 표시

   



ListView의 마지막 항목을 길게 눌러서 Context 메뉴 표시

   




소스파일들은 이전 포스트의 아이템 클릭 예제에 몇가지만 추가했습니다.



레이아웃 파일은 이전 포스트와 마찬가지로 ListView 하나입니다. 

 activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="${relativePackage}.${activityClass}" >


    <ListView 

        android:id="@+id/listview"

        android:layout_width="match_parent"

        android:layout_height="200dp"/>


</RelativeLayout>


이번 예제는 Context Menu가 있기에 Menu설계를 위해

res폴더 >> menu폴더 >> menu_listview.xml을 만들었습니다.

(이전 포스트의 Context Menu 참고)


메뉴아이템을 설계하는 XML 리소스를 만듭니다.

(이전 옵션메뉴 포스트의 xml파일을 가져와도 됨)

res폴더 안에 'menu'라는 이름으로 폴더를 만드세요(절대 이름 틀리면 안됨)

만들어진 menu폴더안에 menu_listview.xml 파일을 하나 추가하세요.


메뉴 XML 리소스 파일

 mainmenu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    

    <item android:id="@+id/modify"

        android:title="Modify"/>

    

    <item android:id="@+id/delete"

        android:title="Delete"/>

    

    <item android:id="@+id/info"

        android:title="Info"/>    


</menu>

   


소스 코드는 이전 코드에서 새로 추가만 햇습니다.

이전 예제의 클릭은 당연히 동작하겠죠?


굵은 글씨가 새로 추가된 코드(code) 입니다. 

 MainActivity.java


public class MainActivity extends Activity {

//대량의 문자열 데이터를 저장할 Arraylist 객체 생성

ArrayList<String> mDatas= new ArrayList<String>();

ListView listview; //ListView 참조변수


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//문자열 데이터 ArrayList에 추가

mDatas.add("KOREA");

mDatas.add("CANADA");

mDatas.add("FRANCE");

mDatas.add("MEXICO");

mDatas.add("POLAND");

mDatas.add("SAUDI ARABIA");

//ListView가 보여줄 뷰를 만들어내는 Adapter 객체 생성

//ArrayAdapter : 문자열 데이터들을 적절한 iew로 1:1로 만들어서 List형태로 ListView에 제공하는 객체

//첫번째 파라미터 : Context객체 ->MainActivity가 Context를 상속했기 때문에 this로 제공 가능

//두번째 파라미터 : 문자열 데이터를 보여줄 뷰. ListView에 나열되는 하나의 아이템 단위의 뷰 모양

//세번째 파라미터 : adapter가 뷰로 만들어줄 대량의 데이터들

//본 예제에서는 문자열만 하나씩 보여주면 되기 때문에 두번째 파라미터의 뷰 모먕은 Android 시스템에서 제공하는

//기본 Layout xml 파일을 사용함.

ArrayAdapter adapter= new ArrayAdapter(this, android.R.layout.simple_list_item_1, mDatas);

listview= (ListView)findViewById(R.id.listview);

listview.setAdapter(adapter); //위에 만들어진 Adapter를 ListView에 설정 : xml에서 'entries'속성

//ListView의 아이템 하나가 클릭되는 것을 감지하는 Listener객체 설정 (Button의 OnClickListener와 같은 역할)

listview.setOnItemClickListener(listener);

//ListView를 Context 메뉴로 등록

registerForContextMenu(listview);

}

//Context 메뉴로 등록한 View(여기서는 ListView)가 처음 클릭되어 만들어질 때 호출되는 메소드

@Override

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

// TODO Auto-generated method stub

//res폴더의 menu플더안에 xml로 MenuItem추가하기.

//mainmenu.xml 파일을 java 객체로 인플레이트(inflate)해서 menu객체에 추가

getMenuInflater().inflate(R.menu.menu_listview, menu);

super.onCreateContextMenu(menu, v, menuInfo);

}

//Context 메뉴로 등록한 View(여기서는 ListView)가 클릭되었을 때 자동으로 호출되는 메소드

public boolean onContextItemSelected(MenuItem item) {

//AdapterContextMenuInfo

//AdapterView가 onCreateContextMenu할때의 추가적인 menu 정보를 관리하는 클래스

//ContextMenu로 등록된 AdapterView(여기서는 Listview)의 선택된 항목에 대한 정보를 관리하는 클래스

AdapterContextMenuInfo info= (AdapterContextMenuInfo)item.getMenuInfo();

int index= info.position; //AdapterView안에서 ContextMenu를 보여즈는 항목의 위치

//선택된 ContextMenu의  아이템아이디를 구별하여 원하는 작업 수행

//예제에서는 선택된 ListView의 항목(String 문자열) data와 해당 메뉴이름을 출력함

switch( item.getItemId() ){

case R.id.modify:

Toast.makeText(this, mDatas.get(index)+" Modify", Toast.LENGTH_SHORT).show();

break;

case R.id.delete:

Toast.makeText(this, mDatas.get(index)+" Delete", Toast.LENGTH_SHORT).show();

break;

case R.id.info:

Toast.makeText(this, mDatas.get(index)+" Info", Toast.LENGTH_SHORT).show();

break;

}

return true;

};

//ListView의 아이템 하나가 클릭되는 것을 감지하는 Listener객체 생성 (Button의 OnClickListener와 같은 역할)

OnItemClickListener listener= new OnItemClickListener() {

//ListView의 아이템 중 하나가 클릭될 때 호출되는 메소드

//첫번째 파라미터 : 클릭된 아이템을 보여주고 있는 AdapterView 객체(여기서는 ListView객체)

//두번째 파라미터 : 클릭된 아이템 뷰

//세번째 파라미터 : 클릭된 아이템의 위치(ListView이 첫번째 아이템(가장위쪽)부터 차례대로 0,1,2,3.....)

//네번재 파리미터 : 클릭된 아이템의 아이디(특별한 설정이 없다면 세번째 파라이터인 position과 같은 값)

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

// TODO Auto-generated method stub

//클릭된 아이템의 위치를 이용하여 데이터인 문자열을 Toast로 출력

Toast.makeText(MainActivity.this, mDatas.get(position), Toast.LENGTH_SHORT).show();

}

};

}





출처: http://kitesoft.tistory.com/68 [안드로이드 어플 개발]

반응형
저작자표시 (새창열림)

'IT기술 관련 > 모바일' 카테고리의 다른 글

플러터를 빠르게 배우기 좋은 4개의 사이트  (0) 2019.05.21
flutter run 에러 - Error: No pubspec.yaml file found.This command should be run from the root of your Flutter project.Do not run this command from the root of your git clone of Flutter.  (0) 2019.05.20
[안드로이드] 다중 CheckBox 에서 하나만 선택하게 하기  (0) 2017.10.07
[안드로이드]SQLite date값 9시간 차이나는 문제 해결방법  (0) 2017.10.06
[안드로이드] Fragment 에서 Toast 사용하기  (0) 2017.10.01
'IT기술 관련/모바일' 카테고리의 다른 글
  • 플러터를 빠르게 배우기 좋은 4개의 사이트
  • flutter run 에러 - Error: No pubspec.yaml file found.This command should be run from the root of your Flutter project.Do not run this command from the root of your git clone of Flutter.
  • [안드로이드] 다중 CheckBox 에서 하나만 선택하게 하기
  • [안드로이드]SQLite date값 9시간 차이나는 문제 해결방법
호레
호레
창업 / IT / 육아 / 일상 / 여행
    반응형
  • 호레
    Unique Life
    호레
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 법률
        • 기본
        • 개인정보보호법
        • 정보통신망법
        • 전자금융거래법
        • 전자금융감독규정
        • 신용정보법
        • 온라인투자연계금융업법
      • 창업
        • 외식업 관련
        • 임대업 관련
        • 유통업 관련
        • 세무 관련
        • 마케팅 관련
        • 기타 지식
        • 트렌드
        • Youtube
      • IT기술 관련
        • 모바일
        • 윈도우
        • 리눅스
        • MAC OS
        • 네트워크
        • 빅데이터 관련
        • A.I 인공지능
        • 파이썬_루비 등 언어
        • 쿠버네티스
        • 기타 기술
      • 퍼블릭 클라우드 관련
        • Azure
        • GCP
        • AWS
      • 정보보안 관련
        • QRadar
        • Splunk
        • System
        • Web
      • 기타
        • 세상 모든 정보
        • 서적
      • 게임 관련
        • 유니티
      • 부동산
      • 맛집 찾기
        • 강남역
        • 양재역
        • 판교역
        • ★★★★★
        • ★★★★
        • ★★★
        • ★★
        • ★
      • 결혼_육아 생활
        • 리얼후기
        • 일상
        • 육아
        • 사랑
        • Food
      • 영어
        • 스피킹
        • 문법
        • 팝송
        • 영화
      • K-컨텐츠
        • 드라마
        • 영화
        • 예능
      • 독서
      • 프로젝트 관련 조사
        • 시스템 구축
        • 로그 관련
        • 웹
        • APT
        • 모의 해킹
        • DB
        • 허니팟
        • 수리카타
        • 알고리즘
        • FDS
      • 기업별 구내 식당 평가
        • 한국관광공사
        • KT telecop
        • KT M&S
        • KT powertel
        • KT cs 연수원
        • 진에어
      • 대학 생활
        • 위드윈연구소
        • 진로 고민
        • 채용정보
        • 자동차
        • 주식
        • 악성코드
        • 게임 보안
      • 쉐어하우스
  • 블로그 메뉴

    • 홈
    • 게임 관련
    • IT 기술 관련
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    점심
    대통령
    맛집
    판교역
    무역전쟁
    쥬쥬랜드
    보안가이드
    AWS
    돈까스
    수제버거
    수제버거맛집
    판교맛집
    복리후생
    런치
    이재곧죽습니다
    판교
    상호관세
    유니티
    수제버거존맛
    마케팅
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
호레
[안드로이드] 리스트 뷰(ListView) 4. 컨텍스트 메뉴 달기(Context Menu)
상단으로

티스토리툴바