티스토리 뷰

학교공부/안드로이드

chapter 7 (메뉴와 대화상자)

날따라해봐요요롷게 2021. 4. 21. 21:17

(참조 : 안드로이드 스튜디오를 활용한 안드로이드 프로그래밍)

 

메뉴와 대화상자

 

- 메뉴

- 토스트

- 대화상자

 

연습문제 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함