[안드로이드]옵션메뉴, 컨텍스트메뉴, 토스트

[안드로이드]옵션메뉴, 컨텍스트메뉴, 토스트

메뉴

  • 사용자가 여러 개 중 하나를 선택하도록 하여 사용자의 명령을 받아들이는 간편한 방식.
  • 안드로이드메뉴 종류 : 옵션메뉴, 컨텍스트 메뉴
  • 종류별로 xml과 함께이용하거나 xml없이 자바코드만으로도 만들 수 있다




옵션메뉴 : xml이용

  • 키패드의 메뉴 버튼을 누를때 나타난다
  • 작성 순서
    1. res에 menu폴더와 menu1.xml파일 생성 후 메뉴 코딩
    2. 자바코딩 : onCreateOptionMenu()메소드 오버라이딩
    3. 자바코딩 : onOptionItemSelected() 메소드 오버라이딩

https://lktprogrammer.tistory.com/161




컨텍스트 메뉴 : xml이용

  • 위젯을 롱클릭했을때 화면 중앙에 나타난다.
  • windows 팝업창과 비슷
  • 작성순서
    1. res에 menu폴더와 menu1.xml파일 생성 후 메뉴 코딩
    2. 자바코딩 : onCreate()안에 registerForContextMenu()로 위젯등록
    3. 자바코딩 : onCreateContextMenu()메소드 오버라이딩
      • 위젯별로 별도의 파일을 만들어야한다.
      • if문을 통해 위젯별 컨텍스트 메뉴를 등록해야한다.
    4. 자바코딩 : onContextItemSelected() 메소드 오버라이딩

activity_main.xml 코드 작성

  • 소스코드 생략
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/itemRed"
android:title="빨간 배경">
</item>
<item
android:id="@+id/itemBlue"
android:title="파란 배경">
</item>
<item
android:id="@+id/itemRGreen"
android:title="초록 배경">
</item>
<item
android:id="@+id/itemOrig"
android:title="배경 초기화">
</item>
</menu>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item
android:id="@+id/subRotate"
android:title="버튼 90도 회전">
</item>
<item
android:id="@+id/subSize"
android:title="버튼 3배로 확대">
</item>
<item
android:id="@+id/subSize2"
android:title="버튼 원래대로">
</item>
</menu>

MainActivity.java 자바코딩

  • 전역변수 생략
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("배경색바꾸기(컨텍스트 메뉴활용)");
baseLayout = (LinearLayout) findViewById(R.id.baseLayout);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
//버튼 2개를 컨택스트메뉴에 등록하기
registerForContextMenu(button1);
registerForContextMenu(button2);
}//end of onCreate()

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
//view는 롱클릭한 위젯
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater mi = getMenuInflater();
if(v == button1){
menu.setHeaderTitle("배경색 변경");
mi.inflate(R.menu.menu1, menu);
}
if (v == button2){
mi.inflate(R.menu.menu2, menu);
}
}//end of ContextMenu()

@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {

switch (item.getItemId()){
case R.id.itemRed: baseLayout.setBackgroundColor(Color.RED);
return true;
case R.id.itemBlue: baseLayout.setBackgroundColor(Color.BLUE);
return true;
case R.id.itemRGreen: baseLayout.setBackgroundColor(Color.GREEN);
return true;
case R.id.itemOrig: baseLayout.setBackgroundColor(Color.TRANSPARENT);
return true;
case R.id.subRotate: button2.setRotation(90);
return true;
case R.id.subSize: button2.setScaleX(3);
return true;
case R.id.subSize2:
button2.setScaleX(1);
button2.setRotation(0);
return true;
}
return false;
}




인플레이터(Inflater)

인플레이터는 자전거 등의 공기 펌프라는 뜻으로 풍선에 바람을 넣어서 실제 객체를 만들어 사용한다는 의미이다.
정적으로 존재하는 xml을 java코드에서 가져와서 실제 객체로 만들어 사용하는 것이다.
메뉴 인플레이터 : 메뉴xml파일을 java코드에 가져와 사용하는 것
레이아웃 인플레이터 : 레이아웃xml을 java코드에 가져와 사용하는 것
출처 : Android Studio를 활용한 안드로이드 프로그래밍 5판 p287




토스트

  • 화면에 잠깐 나타났다가 사라지는 메시지
  • 기본적인 사용형태
    1
    Toast.makeText(Context context, String message, int duratioin).show();
  • duratioin 속성 : LENGTH_SHORT와 LENGTH_LONG 둘 중 하나를 사용
  • setGravity(int gravity, int xOffset, int yOffset) 메서드
    • gravity 선택값 : TOP, LEFT, RIGTH, BOTTOM, CENTER
    • Offset은 떨어진 거리를 나타냄

activity_main.xml 코드 작성

  • 소스코드 생략

toast2.xml 생성 및 코드 작성

1
2
3
4
5
6
7
8
9
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:src="@drawable/oreo"
android:layout_width="wrap_content"
android:layout_height="100dp"/>

</LinearLayout>

MainActivity.java 자바코딩

  • 전역변수 생략
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("사용자 정보 입력");
tvName = (TextView) findViewById(R.id.tvName);
tvEmail = (TextView) findViewById(R.id.tvEmail);
btn1 = (Button) findViewById(R.id.btn1);

btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dlgV = (View) View.inflate(MainActivity.this, R.layout.dialog, null);
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("사용자 정보 입력");
dlg.setIcon(R.drawable.ic_menu_allfriends);
dlg.setView(dlgV);
dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dlgEdtName = (EditText) dlgV.findViewById(R.id.dlgEdt1);
dlgEdtEmail = (EditText) dlgV.findViewById(R.id.dlgEdt2);
tvName.setText(dlgEdtName.getText().toString());
tvEmail.setText(dlgEdtEmail.getText().toString());
}
});
dlg.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast toast = new Toast(MainActivity.this);
toastV = (View) View.inflate(MainActivity.this,
R.layout.toast1, null);
toastText = (TextView) toastV.findViewById(R.id.toastText1);
toastText.setText("취소했습니다");
toast.setView(toastV);
toast.show();
}
});
dlg.show();
}
});
}