티스토리 뷰
(참조 : 안드로이드 스튜디오를 활용한 안드로이드 프로그래밍)
메뉴와 대화상자
- 메뉴
- 토스트
- 대화상자
연습문제 1,2,3 / 예제 (7-6, 7-12, 7-13, 7-27)
-메뉴
## 예제 7-6 (자바 코드만 이용한 옵션 메뉴)
: 옵션 메뉴를 사용할 때 XML 파일 없이 java 코드만으로 생성하여 사용할 수 있다.
OnCreateOptionMenu() 메소드 안에서 메뉴 XML 파일에 접근하는 대신에 직접!! menu.add() 메소드로 메뉴 항목을 추가한다.
package com.example.week2;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button button1;
@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);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) { // 옵션 메뉴를 등록하는 메소드
super.onCreateOptionsMenu(menu);
MenuInflater mInflater = getMenuInflater();
mInflater.inflate(R.menu.menu1, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { // 메뉴를 클릭 했을 때 동작 할 메소드
switch (item.getItemId()){
case R.id.itemRed :
baseLayout.setBackgroundColor(Color.RED);
return true;
case R.id.itemGreen :
baseLayout.setBackgroundColor(Color.GREEN);
return true;
case R.id.itemBlue :
baseLayout.setBackgroundColor(Color.BLUE);
return true;
case R.id.subRotate:
button1.setRotation(45);
return true;
case R.id.subSize:
button1.setScaleX(2);
return true;
}
return false;
}
}
위는 자바 코드로 작성하지 않고 XML을 추가하여 inflate를 사용하여 구현하였다.
위의 코드에서 OnCreateOptionMenu() 메소드만을 변경시켜주면 XML을 추가 하지 않아도 된다.
@Override
public boolean onCreateOptionsMenu(Menu menu) { // 옵션 메뉴를 등록하는 메소드
super.onCreateOptionsMenu(menu);
menu.add(0,1,0, "배경색 (빨강");
menu.add(0,2,0, "배경색 (초록");
menu.add(0,2,0, "배경색 (파랑");
SubMenu sMenu = menu.addSubMenu("버튼 변경 >> ");
sMenu.add(0,4,0, "버튼 45도 회전");
sMenu.add(0,5,0, "버튼 2백 확대");
return true;
}
inflate를 사용하지 않고 menu.add 메소드 사용. SubMenu 클래스를 생성하여 추가메뉴 생성.
- 토스트 : 화면에 잠깐 나왔다 사라지는 메시지
Toast.makeText(Context context, String message, int duration).show();
Toast.setGravity(int gravity, int xOffset, int yOffset);
##예제 7-12, 13 (토스트 연습)
XML 코드
<LinearLayout android:gravity="center">
<Button
android:id="@/id/button1"
android:text="메시지 출력" />
</LinearLayout>
버튼을 생성하여 토스트가 렌덤한 위치에 나오도록 구현.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("토스트 연습");
final Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v){
Toast tMsg = Toast.makeToast(액티비티명.this, "토스트연습", Toast.LENGTH_SHORT);
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay();
int xOffset = (int) (Math.random() * display.getWidth());
int yOffset = (int) (Math.random() * display.getHeight());
tMsg.setGravity(Gravity.TOP | Gravity.LEFT, xOffset, yOffset);
tMst.show();
}
})
}
Toast tMsg를 객체생성하였다.
안드로이드 디스플레이를 getSystemService() 메소드로 구한 후 getWidth와 getHeight를 Math.random() 으로 받는다.
화면의 TOP, LEFT 왼쪽 상단에서 주어진 값으로 부터 떨어진 만큼의 위치에 tMsg.show() 메소드를 실행하여 보여준다.
-대화상자
##예제 7-27 ()
public class MainActivity extends AppCompatActivity {
TextView tvName, tvEmail;
Button button1;
EditText dlgEdtName, dlgEdtEmail;
TextView toastText;
View dialogView, toastView;
@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);
button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//dialog1.xml 을 inflate 해서 dialogView 에 대입한다.
dialogView = (View) View.inflate(MainActivity.this, R.layout.dialog1, null);
//대화상자 생성
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("사용자 정보 입력");
dlg.setView(dialogView);
dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
// 입력한 내용이 메인화면에 나타날 수 있도록.
@Override
public void onClick(DialogInterface dialogInterface, int which) {
dlgEdtName = (EditText) dialogView.findViewById(R.id.dlgEdt1);
dlgEdtEmail = (EditText) dialogView.findViewById(R.id.dlgEdt2);
tvName.setText(dlgEdtName.getText().toString());
tvEmail.setText(dlgEdtEmail.getText().toString());
}
}) ;
// ★★★★ 예제 7-27 ★★★★
// 취소 버튼 누르면 Toast 메시지가 나오도록 설정.
dlg.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
Toast toast = new Toast(MainActivity.this);
// toast 뷰를 inflate 하기
toastView = (View) View.inflate(MainActivity.this, R.layout.toast1, null);
toastText = (TextView) toastView.findViewById(R.id.toastText1);
toastText.setText("취소했습니다.");
toast.setView(toastView);
toast.show();
}
});
}
});
}
}
취소 버튼을 누르면 Toast 메시지가 나오도록 구현.
OnClick 메소드 안에서 Toast 객체를 생성하고 toastView 변수에 xml을 인플레이트 한다.
toastText.setText("메시지") 메소드를 이용해 보여줄 메시지를 작성하고, toast 객체에 보여줄 메시지를 넣는다.
toast.show() => 메시지 보여주기
## 연습문제 1
: OnCreateOptionsMenu() [옵션메뉴]는 키패드의 메뉴 버튼을 누르면 화면 하단에 나오고, OnCreateContextMenu() [컨텍스트메뉴]는 위젯을 롱클릭 하면 나온다.
## 연습문제 2 : '항목1' 과 '항목2' 로 구성된 메뉴 XML 파일을 코딩하시오.
XML
<menu>
<item
android:id="@id/항목1"
android:title="항목1"
</item>
<item
android:id="@id/항목2"
android:title="항목2"
</item>
</menu>
## 연습문제 3 : 위의 2번의 XML 파일에 대응되는 onOptionsItemSelected()를 코딩
onOptionsItemSelected 메소드는 메뉴를 클릭했을 때 동작할 메소드이다.
// XML inflate 하여 구현
@Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater mInflater = getMenuInflater();
mInflater.inflater(R.menu.menu1, menu);
return true;
}
// 자바로만 구현
@Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
menu.add(0,1,0, "항목1");
menu.add(0,2,0, "항목2");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.항목1 : ~~~
case R.id.항목2 : ~~~
return true;
}
return false;
}
'학교공부 > 안드로이드' 카테고리의 다른 글
안드로이드(1) (0) | 2021.10.15 |
---|---|
chapter - 14(서비스와 브로드캐스트 리시버) (0) | 2021.05.15 |
chaper 10 (액티비티와 인텐트) (0) | 2021.04.22 |
chapter 8 (파일처리) (0) | 2021.04.21 |