반응형



어플을 종료하거나 특정작업을 수행할 때 사용자알림의 목적으로 다이얼 로그(Dialog)가 사용되는 경우가 있죠.


이번 예제소스는 안드로이드 어플에서 많이 사용되어지는 AlertDialog

사용자가 원하는 모양으로 커스터마이즈(Customize)하는 예제 입니다.


이 예제는 회원명단 추가를 위해 이름과 국적을 입력할 수 있는 Dialog를 만들어 보여주는 예제입니다.


'이름'은 EditText를 이용하여 입력받습니다.

'국적'은 RadioButton을 통해 선택하도록 하였습니다.


버튼을 누르면 멤버정보를 입력할 수 있는 Dialog를 보여주고

입력을 완료하면

메인화면의 TextView에 추가된 멤버들의 정보를 보여줍니다.


우선 어떻게 동작하는 지 먼저 살펴보고 소스코드를 소개하겠습니다.


실행화면


Button 1개와 TextView1개로 된 메인화면과 버튼을 클릭했을 때 보여지는 커스텀 다이얼로그(Custom AlertDialog) 

 


'이름'으로 'Hong' 입력하고 Korea Radio 버튼선택 후 '완료'버튼 클릭

 


다시 'Add Member...'버튼 클릭하여 'Robin' 입력완료

  


계속해서 '기욤 패드리' 입력 완료

 


입력을 취소할 때

 




먼저 메인 레이아웃 파일입니다.
Button 1개와 TextView 1개로 이루어진 간단한 레이아웃입니다.

 

 activity_main.xml

 <LinearLayout 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"

    android:orientation="vertical" >

    

    <Button 

        android:id="@+id/btn_add_member"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="Add Member Dialog show"

        android:onClick="mOnClick"/>

    

    <TextView 

        android:id="@+id/text"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:textSize="18sp"

        android:textStyle="bold"

        android:padding="5dp"/>   


</LinearLayout>

 



다음으로 Custom Dialog에 보여질
'이름' 입력 EditText와 '국적'입력 RadioButton 들의 배치를 설계한
레이아웃 파일 입니다.

res폴더>>layout폴더>>dialog_addmember.xml 로 만들었습니다.

 

 dialog_addmember.xml

<?xml version="1.0" encoding="utf-8"?>

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

    android:layout_width="250dp"

    android:layout_height="wrap_content"

    android:orientation="vertical"

    android:padding="5dp" >

    

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="30dp"

        android:orientation="horizontal"

        android:weightSum="5">

        

        <TextView 

            android:layout_width="0dp"

            android:layout_height="match_parent"

            android:layout_weight="1.5"

            android:text="NAME"

            android:textSize="12sp"

            android:gravity="center"/>

        

        <EditText

            android:id="@+id/dialog_edit" 

            android:layout_width="0dp"

            android:layout_height="match_parent"

            android:layout_weight="3.5"

            android:hint="input name"

            android:textSize="12sp"

            android:gravity="center"/>

        

    </LinearLayout>

    

    <LinearLayout 

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="horizontal"

        android:weightSum="5">

        

        <TextView 

            android:layout_width="0dp"

            android:layout_height="match_parent"

            android:layout_weight="1.5"

            android:text="NATION"

            android:textSize="12sp"

            android:gravity="center"/>

        

        <RadioGroup 

        android:id="@+id/dialog_rg"

        android:layout_width="0dp"

        android:layout_height="match_parent"

        android:layout_weight="3.5"

        android:orientation="vertical">            

        

        <RadioButton 

            android:id="@+id/dialog_rb_korea"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="KOREA"

            android:textSize="12sp"/>

        

        <RadioButton 

            android:id="@+id/dialog_rb_canada"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="CANADA"

            android:textSize="12sp"/>

        

        <RadioButton 

            android:id="@+id/dialog_rb_france"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="FRANCE"

            android:textSize="12sp"/>

        

        <RadioButton 

            android:id="@+id/dialog_rb_mexico"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="MEXICO"

            android:textSize="12sp"/>

        

        <RadioButton 

            android:id="@+id/dialog_rb_poland"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="POLAND"

            android:textSize="12sp"/>

        

        <RadioButton 

            android:id="@+id/dialog_rb_saudi"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="SAUDI ARABIA"

            android:textSize="12sp"/>

        

    </RadioGroup>

        

    </LinearLayout>


</LinearLayout>  

 



다음은 소스파일입니다.
주석이 많아서 그렇지 사실 작업내용은 얼마 안됩니다.
빽빽한 코드의 모습에 미리 한숨쉬지 않길 바랍니다.

 MainActivity.java


public class MainActivity extends Activity {

TextView text;//Dialog를 통해 입력된 멤버의 정보를 출력하는 TextView 참조변수

String str="";//빈 문자열 String 객체


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

text= (TextView)findViewById(R.id.text);

}

//onClick 속성이 부여된 View를 클릭했을 때 자동으로 호출되는 메소드

public void mOnClick(View v){

switch( v.getId() ){

case R.id.btn_add_member://멤버 추가(데이터 추가)

//Dialog에서 보여줄 입력화면 View 객체 생성 작업

//Layout xml 리소스 파일을 View 객체로 부불려 주는(inflate) LayoutInflater 객체 생성

LayoutInflater inflater=getLayoutInflater();

//res폴더>>layout폴더>>dialog_addmember.xml 레이아웃 리소스 파일로 View 객체 생성

//Dialog의 listener에서 사용하기 위해 final로 참조변수 선언

final View dialogView= inflater.inflate(R.layout.dialog_addmember, null);

//멤버의 세부내역 입력 Dialog 생성 및 보이기

AlertDialog.Builder buider= new AlertDialog.Builder(this); //AlertDialog.Builder 객체 생성 

buider.setTitle("Member Information"); //Dialog 제목

buider.setIcon(android.R.drawable.ic_menu_add); //제목옆의 아이콘 이미지(원하는 이미지 설정)

buider.setView(dialogView); //위에서 inflater가 만든 dialogView 객체 세팅 (Customize)

buider.setPositiveButton("Complite", new OnClickListener() {

//Dialog에 "Complite"라는 타이틀의 버튼을 설정

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

//멤버 정보의 입력을 완료하고 TextView에 추가 하도록 하는 작업 수행

//dialogView 객체 안에서 NAME을 입력받는 EditText 객체 찾아오기(주의: dialaogView에서 find 해야함)

EditText edit_name= (EditText)dialogView.findViewById(R.id.dialog_edit);

//dialogView 객체 안에서 NATION을 입력받는 RadioGroup 객체 찾아오기

RadioGroup rg= (RadioGroup)dialogView.findViewById(R.id.dialog_rg);

//EditText에 입력된 이름 얻어오기

String name= edit_name.getText().toString();

//선택된 RadioButton의 ID를 RadioGroup에게 얻어오기

int checkedId= rg.getCheckedRadioButtonId();

//Check 된 RadioButton의 ID로 라디오버튼 객체 찾아오기

RadioButton rb= (RadioButton)rg.findViewById(checkedId);

String nation= rb.getText().toString();//RadionButton의 Text 얻어오기

//TextView의 이전 Text에 새로 입력된 멤버의 데이터를 추가하기

//TextView로 멤버리스트를 보여주는 것은 바람직하지 않음.다음 포스트에서 ListView로 처리합니다.

String s= name+"   "+nation+"\n";

str+= s;

text.setText(str);

//TextView에 추가작업을 완료 하였기에 '완료'했다는 메세지를 Toast로 출력

Toast.makeText(MainActivity.this, "새로운 멤버를 추가했습니다", Toast.LENGTH_SHORT).show();

}

});

buider.setNegativeButton("Cancel", new OnClickListener() {

//Dialog에 "Cancel"이라는 타이틀의 버튼을 설정

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

//멤버 정보의 입력을 취소하고 Dialog를 종료하는 작업

//취소하였기에 특별한 작업은 없고 '취소'했다는 메세지만 Toast로 출력

Toast.makeText(MainActivity.this, "멤버 추가를 취소합니다", Toast.LENGTH_SHORT).show();

}

});

//설정한 값으로 AlertDialog 객체 생성

AlertDialog dialog=buider.create();

//Dialog의 바깥쪽을 터치했을 때 Dialog를 없앨지 설정

dialog.setCanceledOnTouchOutside(false);//없어지지 않도록 설정

//Dialog 보이기

dialog.show();

break;

}//switch

}//mOnClickMethod

}


 

 

반응형
반응형



이전 까지 ListView를 통해 많은 데이터를 표시하는  예제를 소개했었습니다.


리스트뷰는 많은 어플에서 실제로 활용도가 높아

많이 사용됩니다.


특히 액티비티 화면전체가 리스트형태로 되어 있는 경우도 많습니다.

해서 ListView를 만들필요없이

액티비티(Activity)가 기본적으로 ListView를 보유하도록 만들었습니다.


이렇게 만들어진 것이 ListActivity 입니다.


즉, ListView가 이미 설정되어 있는 액티비티라고 보면 됩니다.


여기서 중요한 것은

 이미 이 액티비티는 화면에 보여 줄 View객체가 설정되어 있다는 것입니다.


다들 아시다시피

액티비티는 setContentView() 메소드를 통해 보여줄 View를 설정합니다.

ListActivity는 이 작업을 하지 않는다는 거죠.


코드가 간단하니 소스코드만 소개하겠습니다.

참고로 setContentView()메소드가 없는 만큼 xml 레이아웃 파일은 필요없네요.


리스트를 보여주고 선택하면 해당 문자열 데이터가 Toast로 출력되는 예제소소입니다.



리스트 액티비티(ListActivity)에서 주요한 역할을 하는 코딩 부분은 굵게 표시했습니다. 

 MainActivity.java


public class MainActivity extends ListActivity {

//ListActivity- Activity가 보여줄 View로 이미 ListView를 설정한 Activity

//일반 Activity와 다르게 setContentView()메소드를 사용하지 않음

//이미 ListView 객체가 설정되어 있음

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

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


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//여기에 자동으로 써있는 setContentView()메소드 삭제

//문자열 데이터 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);

//ListActivity가 가지고 있는 ListView에 Adapter 설정

//getListView() 메소드로 보유하고 있는 ListView 객체를 얻어올 수 있음

setListAdapter(adapter);

}

//ListActivity의 List를 클릭했을 때 자동으로 호출되는 메소드

//첫번째 파라미터 : ListActivity가 보유하고 있는 ListView 객체

//두번째 파라미터 : List중에 선택된 아이템 뷰(View)

//세번째 파라미터 : 클릭된 아이템의 위치

//네번째 파라미터 : 클릭된 아이템의 아이디(기본값은 position과 동일)

@Override

protected void onListItemClick(ListView l, View v, int position, long id) {

// TODO Auto-generated method stub

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

super.onListItemClick(l, v, position, id);

}

}




결과화면


   


반응형
반응형



이전 포스트에서 소개한

ListView에 Context Menu 달기 예제에서

Context Menu는 오래 누르면 나오는 메뉴입니다.


그래서

ListView의 한 항목을 오래 누르는 것을 감지하여

자동으로 콜백 메소드를 호출하는

OnItemLongClickListener를 이용해서 이전 예제를 만들어 보겠습니니다.


선택한 항목에 메뉴가 만들어져야 하기에

Popup Menu를 사용하였습니다.


이전 Context Menu 예제에서는 메뉴가 보여지는 위치가

누른 항목과 상관없이 가운데 였습니다.


이에 비해 이번 예제에서 메뉴가 나타나는 위치는

선택한 항목에서 보여지게 되어 보다

해당 항목의 메뉴라는 느낌이 명확합니다.


다른 부분은 모두 이전 예제와 같고 소스코드만 다르기에

결과만 잠시 보고

소스 코드만 포스팅합니다.


실행화면


Context Menu와 ItemLongClick을 이용한 Popup Menu 차이

  

 



이전 포스트의 Context 메뉴관련 코드를 모두 제거하고

LongClick에 반응하는 코드를 추가합니다.


굵은 글씨가 새로 추가한 코드입니다.

 

 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의 아이템 하나가 오래 눌러지는 것을 감지하는 Listener객체 생성(위의 OnItemClickListener같은 역할)

listview.setOnItemLongClickListener(new OnItemLongClickListener() {

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

//첫번째 파라미터 : 오래 눌러진 아이템을 보여주고 있는 AdapterView 객체(여기서는 ListView객체)

//두번째 파라미터 : 오래 눌러진 아이템 뷰

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

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

@Override

public boolean onItemLongClick(AdapterView<?> parent, View view,

int position, long id) {

// TODO Auto-generated method stub

//PopupMenu객체 생성. 

     //생성자함수의 첫번재 파라미터 : Context

     //생성자함수의 두번째 파라미터 : Popup Menu를 붙일 anchor 뷰

     PopupMenu popup= new PopupMenu(MainActivity.this, view);//view는 오래 눌러진 뷰를 의미

    

     //Popup Menu에 들어갈 MenuItem 추가.

     //이전 포스트의 컨텍스트 메뉴(Context menu)처럼 xml 메뉴 리소스 사용

     //첫번재 파라미터 : res폴더>>menu폴더>>menu_listview.xml파일 리소스

     //두번재 파라미터 : Menu 객체->Popup Menu 객체로 부터 Menu 객체 얻어오기

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

    

     //Popup menu의 메뉴아이템을 눌렀을  때 보여질 ListView 항목의 위치

//Listener 안에서 사용해야 하기에 final로 선언

final int index= position;

     //Popup Menu의 MenuItem을 클릭하는 것을 감지하는 listener 설정

     popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {

@Override

public boolean onMenuItemClick(MenuItem item) {

// TODO Auto-generated method stub

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

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

switch( item.getItemId() ){

case R.id.modify:

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

case R.id.delete:

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

break;

case R.id.info:

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

break;

}

return false;

}

});

        

     popup.show();//Popup Menu 보이기 

return false;

}

});

}

//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();

}

};

}




반응형
반응형



이전 포스트에서 리스트 뷰(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();

}

};

}




반응형
반응형



이전 포스트에서 Java에서 생성된 데이터들을 

리스트 뷰(ListView)에 표시하는 예제 소스를 보여드렸습니다.


이번 예제소스는


리스트 뷰(ListView)에 표시된 데이터들(여기서는 문자열들(Strings))을

선택했을 때 해당 아이템의 문자열을 Toast로 출력하는 예제소스입니다.


이전 예제에서 Java 소스만 조금 추가하면 됩니다.


Button 뷰(View) 작업할 때 OnClickListener를 사용해 보셨다면

아주 쉬울 겁니다.


ListView에 OnItemClickListener 만 설정해주시면 됩니다.


xml파일을 이전 포스트와 동일하면

Java 파일도 이전 포스트에서 클릭처리 부분만 추가하였습니다.


 

 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>



굵은 글씨가 새로 추가된 코드(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의 아이템 하나가 클릭되는 것을 감지하는 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();

}

};

}



결과화면입니다. 클릭해서 토스트(Toast) 출력도 합니다.


  


  



반응형
반응형



이전 포스트에서는 대량의 데이터가 xml에 있을 때의 ListView 예제였습니다.


이번 예제는 대량의 데이터가 .java 에서 생산된 경우의 예제입니다.


실제로 대다수의 어플을 만들 때 데이터들을 xml에서 미리 만드는 경우보다는

데이터 베이스에 있거나 이번 예제처럼 java 언어에서 직접 만들어지는 경우가 많습니다.


Java에서 ListView 객체에 데이터를 설정할 때는

대량의 데이터를 그에 맞는 적절한 뷰로 자동으로 변환하는 'Adapter' 객체가 필요합니다.

우선 간단한 문자열 데이터의 배열이기에 단순 리스트 형태로 변환하는

ArrayAdapter를 만들어 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>



 

 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 크기보다 데이터 양을 많이 했습니다.


  


반응형
반응형



문자열 배열이나 데이터베이스의 자료처럼

대량의 데이터를 화면에 나타낼때 유용한 뷰 그룹(View Group)인 어뎁터 뷰(Adapter View)


이 아답터 뷰는 보여주는 형태에 따라 몇가지 종류가 있죠.


1. 가장 많이 사용하는 단순 목록 나열 형식의 ListView

2. 콤보박스나 드롭다운박스로 불려지는 Spinner

3. 사진이나 그림들을 격자 형태로 보여줄 때 유요한 GridView

4. Gellary도 있지만 요즘은 GridView로 대체




우선 가장 많이 사용하는 ListView에 대한 예제 소스입니다.


먼저 대량의 데이터가 단순히 문자열 배열일때의 예제입니다.


문자열 배열을 res폴더>>values>>arrays.xml 리소스 파일에 만들어 놨습니다.


잘 알시다시피 안드로이드는 문자열(String)도 xml 리소스(Resource)로 처리하는 것을 선호합니다.

당연히 문자열 배열(String-Array)도 xml 리소스로 만들 수 있겠죠.


단, 단일 문자열은 strings.xml에 만들지만

배열은 arrays.xml에 만들어야 한다는 것만 주의하세요.


혹시나 해서 만드는 과정을 그림으로 소개하겠습니다.



  



파일이름이 틀리면 안됩니다. 주의하세요.



만들어지 arrays.xml 파일안에 문자열 배열 하나를 추가합니다.

 arrays.xml

 <resources>

    <string-array name="datas">

        <item >KOREA</item>

        <item >CANADA</item>

        <item >FRANCE</item>

        <item >MEXICO</item>        

    </string-array>

    

</resources>


이렇게 만들어진 문자열 배열 리소스 파일을

ListView의 'android:entries:'속성에 설정합니다.


 

 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="300dp"

        android:entries="@array/datas"/>


</RelativeLayout>


'@array/datas' 에서 datas가 arrays.xml 파일안에 만든

문자열 배열의 'name='속성에 지정한 이름입니다.


가장 간단하게 문자열 데이터들을 화면에 표시하는 방법입니다.


실행결과화면입니다.


 


ListView 의 크기보다 보여줘야할 데이터의 양이 많으면

자동으로 스크롤이 만들어집니다.


다음 포스트에서는 Java 언어에서 문자열 배열을 만들어서

ListView에 표시하는 예제를 포스팅합니다.

반응형
반응형



Popup Menu : 특정 명령에 따라 특정 위치에 팝업(Popup)되어 서브 메뉴용도로 사용할 수 있는 메뉴


버튼(Button) 을 누르면 그 버튼에 Popup Menu가 나타납니다.

특정 메뉴 아이템을 선택하면 해당하는 Toast가 표시되는 예제소스입니다.



먼저 실행 화면입니다.


         메인화면                             버튼 클릭으로 Popup Menu 발생

  


  

 팝업 메뉴(Popup Menu)의 각 menuItem 선택시의 Toast



소스코드

 MainActivity.java

 public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

//Button 클릭시에 자동으로 호출되는 callback Method...

    public void mOnClick(View v){

    

     switch( v.getId() ){

     case R.id.btn_popupmenu:

    

     //PopupMenu객체 생성. 

     //생성자함수의 첫번재 파라미터 : Context

     //생성자함수의 두번째 파라미터 : Popup Menu를 붙일 anchor 뷰

     PopupMenu popup= new PopupMenu(this, v);//v는 클릭된 뷰를 의미

    

     //Popup Menu에 들어갈 MenuItem 추가.

     //이전 포스트의 컨텍스트 메뉴(Context menu)처럼 xml 메뉴 리소스 사용

     //첫번재 파라미터 : res폴더>>menu폴더>>mainmenu.xml파일 리소스

     //두번재 파라미터 : Menu 객체->Popup Menu 객체로 부터 Menu 객체 얻어오기

     getMenuInflater().inflate(R.menu.mainmenu, popup.getMenu());

    

     //Popup Menu의 MenuItem을 클릭하는 것을 감지하는 listener 설정

     popup.setOnMenuItemClickListener(listener);

         

     popup.show();//Popup Menu 보이기

    

     break;

     }

    

    }//mOnClick Method..

  

    //Popup Menu의 MenuItem을 클릭하는 것을 감지하는 listener 객체 생성

    //import android.widget.PopupMenu.OnMenuItemClickListener 가 되어있어야 합니다.

    //OnMenuItemClickListener 클래스는 다른 패키지에도 많기 때문에 PopupMenu에 반응하는 패키지를 임포트하셔야 합니다.

    OnMenuItemClickListener listener= new OnMenuItemClickListener() {

@Override

public boolean onMenuItemClick(MenuItem item) {

// TODO Auto-generated method stub

switch( item.getItemId() ){//눌러진 MenuItem의 Item Id를 얻어와 식별

case R.id.save:

Toast.makeText(MainActivity.this, "SAVE", Toast.LENGTH_SHORT).show();

break;

case R.id.search:

Toast.makeText(MainActivity.this, "SEARCH", Toast.LENGTH_SHORT).show();

break;

case R.id.setting:

Toast.makeText(MainActivity.this, "SETTING", Toast.LENGTH_SHORT).show();

break;

}

return false;

}

};

    

}




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

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

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

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


메뉴 XML 리소스 파일

 mainmenu.xml

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

    

    <item

        android:id="@+id/save" 

        android:title="SAVE"

        android:icon="@android:drawable/ic_menu_save" />

    

    <item

        android:id="@+id/search" 

        android:title="SEARCH"

        android:icon="@android:drawable/ic_menu_search" />

    

    <item

        android:id="@+id/setting" 

        android:title="SETTING"

        android:icon="@android:drawable/ic_menu_edit" />


</menu>

   

반응형
반응형



Context Menu : 특정 뷰(View)를 오래 누르고 있으면 나타나는 메뉴(일반 PC에서 마우스 오른쪽버튼의 역할)


버튼(Button) 뷰를 하나 만들고 이 버튼에 컨텍스트 메뉴를 만들겁니다.


 짧게 클릭하면 'Normal Cliking'이라는 글씨가 보입니다.


이 버튼을 길게 누르고 있으면 Context Menu가 나타납니다.

특정 메뉴 아이템을 선택하면 해당하는 Toast가 표시되는 예제소스입니다.



먼저 실행 화면입니다.


             메인화면                    일반적인 버튼클릭             길게눌러서 Context Menu 발생

    


  

 컨텍스트 메뉴(Context Menu)의 각 menuItem 선택시의 Toast



소스코드

 MainActivity.java

 public class MainActivity extends Activity {

Button btn_Contextmenu;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//Button View 객체 참조

btn_Contextmenu= (Button)findViewById(R.id.btn_contextmenu);

//btn_Contextmenu 버튼 뷰를 Context Menu로 등록

//어떠한 View 객체도 Context Menu로 등록 가능

registerForContextMenu(btn_Contextmenu);

}

//컨텍스트 메뉴(Context Menu)로 등록된 View(btn_contextmenu)가 길게 눌러질때 호출되는 메소드

@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.mainmenu, menu);

super.onCreateContextMenu(menu, v, menuInfo);

}

//컨텍스트 메뉴(Context Menu)의 MenuItem을 선택했을 때 자동으로 호출되는 메소드

@Override

public boolean onContextItemSelected(MenuItem item) {

// TODO Auto-generated method stub

switch( item.getItemId() ){//눌러진 MenuItem의 Item Id를 얻어와 식별

case R.id.save:

Toast.makeText(this, "SAVE", Toast.LENGTH_SHORT).show();

break;

case R.id.search:

Toast.makeText(this, "SEARCH", Toast.LENGTH_SHORT).show();

break;

case R.id.setting:

Toast.makeText(this, "SETTING", Toast.LENGTH_SHORT).show();

break;

}

return super.onContextItemSelected(item);

}

    //Button 클릭시에 자동으로 호출되는 callback Method...

    public void mOnClick(View v){

    

     switch( v.getId() ){

    

     case R.id.btn_contextmenu: //일반적인 버튼의 짧은 클릭시 토스트 (Toast) 발생

    

     Toast.makeText(this, "Normal Clicking", Toast.LENGTH_SHORT).show();    

    

     break;

     }

    

    }

}




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

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

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

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


메뉴 XML 리소스 파일

 mainmenu.xml

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

    

    <item

        android:id="@+id/save" 

        android:title="SAVE"

        android:icon="@android:drawable/ic_menu_save" />

    

    <item

        android:id="@+id/search" 

        android:title="LOAD"

        android:icon="@android:drawable/ic_menu_search" />

    

    <item

        android:id="@+id/setting" 

        android:title="SETTING"

        android:icon="@android:drawable/ic_menu_edit" />


</menu>

  

반응형
반응형

안드로이드는 기본적으로 세가지 메뉴를 가지고 있습니다.


1. Option Menu : 디바이스의 하드웨어 menu키(일부 기기에서는 소프트키로 되어 있습니다.)를 눌렀을 때 아래에서 쑥 올라오는 메뉴

2. Context Menu : 특정 뷰(View)를 오래 누르고 있으면 나타나는 메뉴(일반 PC에서 마우스 오른쪽버튼의 역할)-다음 포스트에서 소개

3. Popup Menu : 특정 명령에 따라 특정 위치에 팝업(Popup)되어 서브 메뉴용도로 사용할 수 있는 메뉴-다다음 포스트에서 소개


이번 포스트는 옵션 메뉴를 만드는 예제소스입니다.

참고로 허니콤(api 10)버전 이후부터 액션바(ActionBar)의 개념이 생기면서 Option 메뉴의 위치가 변경되었습니다.


옵션메뉴(Option Menu)를 액션바 메뉴(Action Bar)메뉴로 사용하게 하였습니다.

안드로이드 폰 중에서 하드웨어 키로 Menu나 Home버튼이 있는 경우는 여전히 아래에서 옵션메뉴가 나타납니다.

반면에 소프트키로 menu나 Home 버튼이 있는 일부 기기(LG g3 등)에서는 액션바(Action Bar)에서 옵션메뉴가 아래로 펼쳐집니다.


아. 물론 하드웨어 키가 있는 기기에서도 옵션메뉴를 눌렀을 때 액션바(Action Bar)에서 나타나게 할 수 있습니다.


먼저 실행 화면입니다.


      하드웨어 메뉴키(GenyMotion)            아래쪽에서 나타나는 옵션메뉴(Option Menu)

     


    

각각의 아이템을 눌렀을 때 Toast 발생



먼저 Java 코드만으로 옵션메뉴를 보여주도록 했습니다.


Menu의 아이템들을 XML의 리소스로 제작하는 방식은 아래 코드에서 주석처리 되어있습니다.

xml 리소스로 메뉴를 제작하실 때는

menu.add() 메소드를 주석처리하시고

getMenuInflater().inflate(R.menu.mainmenu, menu); 부분의 주석을 해제하세요.

그리고 아래 onOptionsItemSelected() 메소드의

2개의 switch문의 주석을 서로 바꾸세요.


소스코드

 MainActivity.java

 public class MainActivity extends Activity {

public static final int DATA_SAVE=1;

public static final int DATA_SEARCH=2;

public static final int DATA_SETTING=3;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

//디바이스의 Menu 버튼이 처음 눌러졋을 때 한번 호출되는 메소드

//Menu의 MenuItem을 설정하는 메소드

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// TODO Auto-generated method stub

//java언어에서 바로 MenuItem 추가하기..

//add( Group Id, Item Id, 배치순서, 메튜타이틀);

//Group Id : 메튜아이템을 그룹으로 관리할 때 그룹의 식별값

//Item Id : 각각의 MenuItem을 구별하기 위한 고유 식별값: 위에 final 살수로 선언

//배치순서(order) : add한 순서와 상관없이 배치순서를 정할 대 사용

menu.add(0, DATA_SAVE, 0, "SAVE");

menu.add(0, DATA_SEARCH, 0, "SEARCH");

menu.add(0, DATA_SETTING, 0, "SETTING");

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

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

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

*/

return super.onCreateOptionsMenu(menu);

}

//디바이스의 Menu 버튼이 눌러질때 마다 매번 호출되는 메소드

//처음 create 할때의 메뉴의 내용을 변경하고 싶을 대 사용하는 메소드

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

// TODO Auto-generated method stub

return super.onPrepareOptionsMenu(menu);

}

//OptionMenu의 MenuItem 중 하나를 눌렀을 때 자동으로 호출되는 메소드

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// TODO Auto-generated method stub

switch( item.getItemId() ){//눌러진 MenuItem의 Item Id를 얻어와 식별

case DATA_SAVE:

Toast.makeText(this, "SAVE", Toast.LENGTH_SHORT).show();

break;

case DATA_SEARCH:

Toast.makeText(this, "SEARCH", Toast.LENGTH_SHORT).show();

break;

case DATA_SETTING:

Toast.makeText(this, "SETTING", Toast.LENGTH_SHORT).show();

break;

}

/* mainmenu.xml을 사용했을때의 switch 문

switch( item.getItemId() ){//눌러진 MenuItem의 Item Id를 얻어와 식별

case R.id.save:

Toast.makeText(this, "SAVE", Toast.LENGTH_SHORT).show();

break;

case R.id.search:

Toast.makeText(this, "SEARCH", Toast.LENGTH_SHORT).show();

break;

case R.id.setting:

Toast.makeText(this, "SETTING", Toast.LENGTH_SHORT).show();

break;

}

*/

return super.onOptionsItemSelected(item);

}

}




만약 메뉴아이템의 설계를 XML 리소스로 하신다면

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

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


메뉴 XML 리소스 파일

 mainmenu.xml

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

    

    <item

        android:id="@+id/save" 

        android:title="SAVE"

        android:icon="@android:drawable/ic_menu_save" />

    

    <item

        android:id="@+id/search" 

        android:title="LOAD"

        android:icon="@android:drawable/ic_menu_search" />

    

    <item

        android:id="@+id/setting" 

        android:title="SETTING"

        android:icon="@android:drawable/ic_menu_edit" />


</menu>

 


이 메뉴아이템들에는 추가적으로 아이콘(icon)를 설정해 주었습니다.

참고로 위의 자바파일에서는 setIcon()메소드로 아이콘을 추가할 수도 있습니다.

다만 최신 버전의 기기에서는 아래에서 나오는 옵션메뉴를 지양는 추세여서 아이콘이 보이지 않습니다.


아이콘이 보이려면 액션바(Action Bar) 메뉴로 나타나도록 해야 합니다.

방법은 간단합니다.

XML 리소르 아이템(item)를 작성할 때 showAsAction:속성만 추가해주면 됩니다.

제어하는 방식은 위의 소스코드와 동일합니다.


Action Bar 메뉴 XML 리소스 파일

 mainmenu.xml

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

    

    <item

        android:id="@+id/save" 

        android:title="SAVE"

        android:icon="@android:drawable/ic_menu_save"

        android:showAsAction="ifRoom" />

    

    <item

        android:id="@+id/search" 

        android:title="LOAD"

        android:icon="@android:drawable/ic_menu_search"        

        android:showAsAction="ifRoom" />

    

    <item

        android:id="@+id/setting" 

        android:title="SETTING"

        android:icon="@android:drawable/ic_menu_edit"

        android:showAsAction="ifRoom" />


</menu>

 


ShowAsAction : 주요속성값

 ifRoom

 액션바에 공간이 있다면 보이도록 함(아이콘만 보임)-가장많이 사용

 never 

 액션바의 공간과 상관없이 무조건 숨겨져 있도록 함(메뉴키 또는 Overflow를 눌렀을 때 보임)-Default 값

 always 

 무조건 보이도록 함( 공간이 없다면 겹침. 비추)

 withText

 텍스트와 아이콘을 같이 보이도록 함



액션바 메뉴(Action Bar Menu)로 사용하는 옵션메뉴




반응형

+ Recent posts