관리 메뉴

java,javascript,android,php,sql,공부용,메모용

안드로이드 앱 액션바, 옵션 메뉴, 컨텍스트 메뉴 / Android Studio / 안드로이드 앱만들기 28 본문

모바일/안드로이드앱

안드로이드 앱 액션바, 옵션 메뉴, 컨텍스트 메뉴 / Android Studio / 안드로이드 앱만들기 28

yy_dd2 2021. 3. 20. 23:39
반응형

옵션메뉴

- 시스템 [메뉴] 버튼을 눌렀을 떄 나타나는 메뉴(앱상단에 위치한) 각 화면마다 설정할 수 있는 주요 메뉴

컨텍스트 메뉴

- 화면을 길게 누르면 나타나는 메뉴 (복사하기,붙여넣기), 텍스트뷰의 편집 상태를 바꿀때 사용함

 

액션바1

- 옵션메뉴는 액션바(Action Bar)에 포함되어 보이도록 만들어져 있다. (액션바는 앱의 제목이 보이는 위쪽부분)

- 옵션메뉴와 컨텍스트 메뉴는 각각의 액티비티마다 설정이 가능한데 액티비티에 추가하고 싶은 경우 아래 메서드를 다시 정의해서 메뉴 아이템을 추가한다.

- 메서드재정의

public boolean onCreateOptionsMenu (Menu menu)

public void onCreateContextMenu (ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo)

 

- add() 메서드 (Menu 와 ContextMenu 객체가 전달되는데 add() 메서드를 사용해 메뉴 아이템을 추가한다 )

MenuItem add(int groupId, int itemId, int order, CharSequence title)

MenuItem add(int groupId, int itemId, int order, int titleRes)

SubMenu addSubMenu (int titleRes)

 

이렇게 코드를 추가할 수 있지만 코드보다 XML에서 메뉴 속성을 정의한 후 객체로 로딩하여 참조하는게 간단함

 

1. SampleOptionMenu

- 패키지명 수정 뒤에 menu

2. /app/res 폴다 안에 menu 폴더 생성 [ New- Directory ]

- menu 폴더에서 우클릭 [ New - Menu resource file ] 메뉴 선택

- name : menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/menu_refresh"
        android:title="새로고침"
        android:icon="@drawable/menu_refresh"
        app:showAsAction="always"/>

    <item android:id="@+id/menu_search"
        android:title="검색"
        android:icon="@drawable/menu_search"
        app:showAsAction="always"/>

    <item android:id="@+id/menu_setting"
        android:title="설정"
        android:icon="@drawable/menu_setting"
        app:showAsAction="always"/>

</menu>

- app: 로 시작되는 속성은 프로젝트에 들어있는 속성이다.

- 외부 라이브러리에서 제공되는 속성도 app:로 참조하면 추가할 수 있다.

 

showAsAction 속성에 설정할 수 있는것

 showAsAction 속성값  설명
 always  항상 액션바에 아이템을 추가하여 표시
 never  액션바에 아이템을 추가하여 표시하지 않음 (디폴트값)
 itRoom  액션바에 여유 공간이 있을 때만 아이템 표시
 withText  title 송성으로 설정된 제목을 같이 표시
 collapseActionView  아이템에 설정한뷰(actionViewLayout 뷰)의 아이콘만 표시

 

MainActivity.java

package com.togapp.smapleoptionmenu;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    // 메서드 재정의
    // ctrl + o  --> onCreateOptionsMenu / onOptionsItemSelected 추가

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //return super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int curId = item.getItemId();
        switch (curId) {
            case R.id.menu_refresh:
                Toast.makeText(this, "새로고침 메뉴가 선택되었습니다.",Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu_search:
                Toast.makeText(this, "검색 메뉴가 선택되었습니다.",Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu_setting:
                Toast.makeText(this, "설정 메뉴가 선택되었습니다.",Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

onPrepareOptionsMenu()

- 화면이 띄워진 후에 메뉴를 바꾸고 싶을때 메서드를 재정의 해서 사용함

- 메뉴가 새로 보일때마다 호출되니 메뉴 항목을 추가하거나 뺄 수 있어서 메뉴 아이템들을 변경 할 수 있음

- 메뉴를 활성화 비활성화로 나눠 앱의 상태에 따라 사용자가 메뉴를 사용하거나 사용하지 못하게 할 수 있음

 

onOptionsItemSelected(MenuItem item)

- 메뉴를 선택했을 때 처리하는 방법으로 사용자가 하나의 메뉴를 선택했을 때 호출되는 메서드를 재정의

- 메뉴 아이템의 id값을 확인하고 그에 맞게 기능을 수정,추가 하면됨

 

컨텍스트 메뉴를 특정뷰에 등록하고 싶을 때

- registerForContextMenu() 메서드 사용

- viud Activity.registerForContextMenu (View view)

이 메서드로 컨텍스트 메뉴를 등록하면 메뉴 아이템을 선택할때 onContextItemSelected() 메서드가 호출된다

메서드의 파라미터로 전달되는 MenuItem 객체를 사용해서 아이템 정보 확인 후 처리 가능

 


 

액션바2

 

액션바는 기본적으로 제목을 보여주는 타이틀의 기능을 한다.

앱의 제목을 보여줄 수 있고, 화면에 보이거나 보이지 않도록 할 수 있다.

 

ActionBar abar = getActionBar();
abar.show();
abar.hide();

java 파일에서 액션바를 감추거나 보이게하기

- show() 메서드를 호출하면 액션바를 보이게 할 수 있음

- hide() 메서드를 호출하면 액션바를 감출 수 있음

 

부제목 달아주기

- setSubtitle()

 

 

1. SampleActionBar1 프로젝트 생성

- 프로젝트 이름 수정 actionbar

2. activity_main.xml 파일에 버튼 추가 "액션바 아이콘 바꾸기"

3. 텍스트뷰 Hello World!

4. activity_main.xml / MainActivity.java  / menu_main.xml 파일은 위에 사용된걸로 그대로 씀

5. MainActivity.java에 새내용 추가

package com.togapp.sampleactionbar1;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;



public class MainActivity extends AppCompatActivity {
    ActionBar actionBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        actionBar = getSupportActionBar();

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                actionBar.setLogo(R.drawable.home);
                actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME| ActionBar.DISPLAY_USE_LOGO);
            }
        });
    }
    // 메서드 재정의
    // ctrl + o  --> onCreateOptionsMenu / onOptionsItemSelected 추가

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //return super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int curId = item.getItemId();
        switch (curId) {
            case R.id.menu_refresh:
                Toast.makeText(this, "새로고침 메뉴가 선택되었습니다.",Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu_search:
                Toast.makeText(this, "검색 메뉴가 선택되었습니다.",Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu_setting:
                Toast.makeText(this, "설정 메뉴가 선택되었습니다.",Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

 

import androidx.appcompat.app.ActionBar;

- ActionBar는 androidx.appcompat.app 패키지 안에 들어있는 클래스를 import한다

 

actionBar.setDisplayOptions(상수)

 디스플레이 옵션 상수  설명
 DISPLAY_USE_LOGO  홈 아이콘 부분에 로고 아이콘을 사용함
 DISPLAY_SHOW_HOME  홈 아이콘을 표시한다
 DISPLAY_HOME_AS_UP  홈 아이콘에 뒤로가기 모양의 < 아이콘을 같이 표시
 DISPLAY_SHOW_TITLE  타이틀을 표시하도록 함

- 로고 아이콘은 매니페스트에 등록된 액티비티 속성으로 지정 가능하다

 

menu_main.xml 파일 수정

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/menu_refresh"
        android:title="새로고침"
        android:icon="@drawable/menu_refresh"
        app:showAsAction="always"
        android:orderInCategory="101"/>

    <item android:id="@+id/menu_search"
        android:title="검색"
        android:icon="@drawable/menu_search"
        app:showAsAction="always|withText"
        android:orderInCategory="102"/>

    <item android:id="@+id/menu_setting"
        android:title="설정"
        android:icon="@drawable/menu_setting"
        app:showAsAction="never"
        android:orderInCategory="103"/>

</menu>

 


1. SampleActionBar2 프로젝트 생성

- 프로젝트 이름 수정 actionbar

2. activity_main.xml 복사~

3. 텍스트뷰 Hello World!

4. activity_main.xml / MainActivity.java  / menu_main.xml 파일도 복사~

menu_main.xml에 새코드 추가

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/menu_refresh"
        android:title="새로고침"
        android:icon="@drawable/menu_refresh"
        app:showAsAction="always"
        android:orderInCategory="101"/>

    <item android:id="@+id/menu_setting"
        android:title="설정"
        android:icon="@drawable/menu_setting"
        app:showAsAction="never"
        android:orderInCategory="103"/>

    <item android:id="@+id/menu_search"
        android:title="검색"
        android:icon="@drawable/menu_search"
        app:showAsAction="always|withText"
        app:actionLayout="@layout/search_layout"
        android:orderInCategory="102"/>

</menu>

5. search_layout.xml 생성

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="검색"
        android:textColor="#FFC107"
        android:textSize="16sp" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:layout_margin="4dp"
        android:imeActionId="1337"
        android:imeOptions="actionDone"/>
</LinearLayout>

 

6. MainActivity.java에 새내용 추가

 

    // 메서드 재정의
    // ctrl + o  --> onCreateOptionsMenu / onOptionsItemSelected 추가

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.menu_main, menu);

        View view = menu.findItem(R.id.menu_search).getActionView();
        if (view != null){
            editText = view.findViewById(R.id.editText);

            if(editText != null){
                editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
                        Toast.makeText(getApplicationContext(), "입력됨", Toast.LENGTH_LONG).show();
                        return true;
                    }
                });
            }
        }
        return true;
    }

실행결과

반응형
Comments