훈련 첫 달. 메뉴를 자세히 살펴보겠습니다. 이전 Android 2.3 기기와 새로운 Android 4.0 휴대전화가 모두 고려됩니다.

옵션 메뉴

메뉴를 담당하는 클래스 android.view.메뉴. 각 활동은 하나의 메뉴 개체와 연결됩니다. 메뉴 자체에는 메뉴 항목(클래스 android.view.MenuItem) 및 하위 메뉴(클래스 android.view.SubMenu).

버튼을 누르면 메뉴구형 전화기에서는 메뉴 항목 세트가 활동에 첨부되어 나타납니다. 메뉴에는 아이콘이 포함될 수 있습니다. 이러한 메뉴에는 일반적으로 6개의 항목이 포함될 수 있습니다. 항목이 6개 이상이면 확장 메뉴를 사용합니다. 이 경우 6번째 항목이 아닌 항목이 나타납니다. 옵션(더). 이 항목을 누르면 옵션 선택 메뉴의 주요 부분에 맞지 않는 항목 목록과 함께 확장 메뉴가 표시됩니다.

메뉴가 처음 열릴 때 Android는 메서드를 호출합니다. onCreateOptions 메뉴(), 객체를 매개변수로 전달 메뉴. 메뉴는 XML 파일의 리소스로 만들거나 다음을 사용할 수 있습니다. 추가하다().

표준 프로젝트에서 일반 템플릿을 선택할 때 이미 원포인트 메뉴에 대한 공백이 있습니다. 설정메뉴에 대한 메서드 호출(이미 알고 있는 내용).

리소스를 사용하여 메뉴 만들기

리소스를 통해 메뉴 작업을 고려하십시오. 메뉴를 생성하기 위해서는 XML 파일에 저장해야 하는 리소스가 사용됩니다. 파일 자체는 폴더에 있어야 합니다. 해상도/메뉴/당신의 프로젝트. 메뉴 구성 다음 항목:

메뉴 항목을 포함할 메뉴를 지정합니다. 요소 파일의 XML 구조에서 루트 요소여야 하며 하나 이상의 요소를 포함할 수 있습니다. 그리고 메뉴 항목을 직접 생성합니다. 이 요소는 중첩 요소를 가질 수 있습니다. 하위 메뉴를 만들려면 선택적으로 보이지 않는 요소 컨테이너를 사용할 수도 있습니다. . 이것은 당신이 몇 가지 효과를 얻을 수 있습니다

어떤 게임에 메뉴를 사용하기로 결정했다고 가정합니다. 만들자 새로운 파일 game_menu.xml:

두 가지 항목으로 메뉴를 만들었습니다. 각 항목에는 다음 속성이 포함됩니다.

Android:id 사용자가 메뉴 항목을 선택할 때 애플리케이션이 인식할 수 있는 메뉴 항목의 식별자 android:title 메뉴에 표시될 텍스트

요소에 대한 다른 속성이 있습니다. 안건, 예를 들어 android:icon="@drawable/home"메뉴 항목에 대한 아이콘도 표시하고 안드로이드:활성화="거짓"메뉴 항목을 사용할 수 없도록 할 수 있습니다.

기인하다 android:titleCondensed일반 제목이 너무 넓어서 선택한 메뉴 항목에 "맞지" 않을 때 사용됩니다.

기인하다 안드로이드:orderInCategory MenuItems 메뉴 항목이 표시되는 순서를 정의합니다.

메뉴를 만들 때 문자열 리소스를 가리켰습니다. @string/new_game그리고 @문자열/도움말. 파일에 새 줄을 추가해야 합니다. 문자열.xml:

새로운 게임 참조

이제 메뉴가 표시될 활동 클래스를 변경해야 합니다. 프로그램은 우리가 만든 메뉴 리소스를 프로그램 개체로 변환해야 합니다. 이를 위한 특별한 방법이 있습니다. MenuInflater.inflate(), 특별한 메소드에서 호출되는 콜백 onCreateOptions 메뉴(). 이 메서드는 버튼을 눌렀을 때 메뉴를 표시하도록 설계되었습니다. 메뉴기기에서:

@Override public 부울 onCreateOptionsMenu( 메뉴 메뉴) ( MenuInflater 팽창기 = getMenuInflater(); 팽창기.inflate(R.menu.game_menu, 메뉴); 반환 true; )

코드를 붙여넣고 나면 개발 환경에서 누락된 네임스페이스를 가져오도록 요청합니다.

android.view.Menu 가져오기; import android.view.MenuInflater;

방법 onCreateOptions 메뉴()이 메서드는 화면에서 메뉴의 첫 번째 모양을 시작하고 Menu 개체를 매개 변수로 사용합니다(이전 장치의 경우). 메뉴에 대한 링크를 저장하고 코드의 어느 곳에서든 사용할 수 있습니다. onCreateOptions 메뉴()다시 호출되지 않습니다. 필요한 경우 메뉴에 추가 시스템 항목이 자동으로 포함되기 때문에 항상 이 핸들러의 상위 클래스 구현을 사용해야 합니다. 새 장치에서는 활동이 생성될 때 메서드가 호출됩니다. 메서드는 값을 반환해야 합니다. 진실메뉴가 화면에 보이도록 합니다.

프로그램 시작 후 버튼을 누르면 메뉴생성된 메뉴를 보려면 에뮬레이터에서

방법 getMenuInflater()클래스의 인스턴스를 반환 메뉴 팽창기, XML에서 메뉴 데이터를 읽는 데 사용합니다.

보시다시피 화면 하단에 메뉴가 나타납니다. 총 6개의 메뉴 항목을 동시에 표시할 수 있습니다. 더 많은 포인트가 있는 경우 5포인트에 6포인트를 더한 값이 표시됩니다. , 그러면 나머지 항목을 볼 수 있습니다. 새로운 메뉴 항목을 테스트하고 추가해 보겠습니다.

먼저 6점을 추가해 보겠습니다.

메뉴에 항목이 7개 있도록 항목을 하나 더 추가해 보겠습니다.

메뉴 항목 선택

메뉴를 만드는 방법을 배웠습니다. 그러나 메뉴 항목이 우리의 클릭에 어떤 식으로든 반응하지 않기 때문에 지금까지는 쓸모가 없습니다. 이 메서드는 메뉴 항목에 대한 클릭을 처리하는 데 사용됩니다. onOptionsItemSelected(). 방법은 사용자가 선택한 항목을 통해 메뉴 아이템. 이제 다음을 호출하여 선택한 항목을 결정할 수 있습니다. getItemId(), 메뉴 항목의 ID를 반환합니다. 더 나아가 운영자를 통해 스위치필요한 명령을 정의하는 것은 우리에게 남아 있습니다.

@Override public boolean onOptionsItemSelected(MenuItem item) ( // 선택한 메뉴 항목에 대한 작업 전환 (item.getItemId()) ( case R.id.new_game: newGame(); return true; case R.id.help: showHelp( ) ; 반환 true, 기본값: 반환 super.onOptionsItemSelected(item); ) ) public void newGame() ( edtext.setText("New game selected"); ) public void showHelp() ( edtext.setText("Help selected" ) ; )

애플리케이션을 실행하고 메뉴를 불러온 다음 첫 번째 또는 두 번째 메뉴 항목을 선택합니다. 텍스트 상자에 메시지가 표시되어야 합니다.

주어진 예에서 getItemId()선택한 메뉴 항목의 ID를 요청하고 스위치 선택 문을 통해 XML 리소스에 설정한 ID와 비교하기 시작합니다. 필요한 식별자를 찾으면 주어진 메뉴 항목에 대한 핸들러가 실행됩니다. 프로그램이 아무것도 찾지 못하면 명령문이 실행됩니다. 기본, 슈퍼 클래스를 반환합니다.

Android 3.0에서는 속성을 추가할 수 있습니다. 안드로이드:onclick메뉴 리소스에서 더 이상 사용할 필요가 없습니다. onOptionsItemSelected(). 도움으로 안드로이드:onclick메뉴 항목을 선택할 때 원하는 방법을 지정할 수 있습니다.

// 메뉴 항목 속성을 android:onClick="onMenuClick"으로 설정 public void onMenuClick(MenuItem item)( edtext.setText("고양이에게 먹이주기"); )

프로그래밍 방식으로 메뉴 생성

고려하다 소프트웨어 생성완성도를 위한 메뉴. 메뉴 항목에 대해 몇 가지 상수를 정의해야 합니다.

// 메뉴 항목의 식별자 private static final int IDM_OPEN = 101; 개인 정적 최종 int IDM_SAVE = 102; public boolean onCreateOptionsMenu(메뉴 메뉴) ( // 메뉴 항목 추가 menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "열기"); menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "저장") ; )

방법에서 추가하다()네 가지 옵션이 있습니다.

  • 그룹 식별자 - 메뉴 항목을 이 메뉴의 다른 항목 그룹과 연결할 수 있습니다.
  • 메뉴 항목 선택 이벤트 핸들러의 항목 식별자
  • 메뉴의 항목 순서 - 메뉴의 위치를 ​​결정할 수 있습니다. 기본적으로(Menu.NONE 또는 0) 항목은 코드에 지정된 순서대로 이동합니다.
  • title - 메뉴 항목에 표시되는 텍스트. 문자열 리소스를 사용할 수 있습니다.

메서드는 객체를 반환합니다. 메뉴 아이템, 아이콘 설정, 단축키 등과 같은 추가 속성을 설정하는 데 사용할 수 있습니다.

아이콘이 있는 메뉴를 만들려면 다음 방법을 사용하십시오. 세트 아이콘()

Menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "열기") .setIcon(R.drawable.icon_menu_open);

아이콘은 6개의 메뉴 항목에만 추가할 수 있음을 다시 상기하십시오(항목이 6개 이상인 경우 5개).

방법 onCreateOptions메뉴메뉴가 생성될 때 시스템에서 한 번만 호출됩니다. 프로그램이 실행되는 동안 메뉴를 업데이트해야 하는 경우 콜백 메서드를 사용하십시오. onPrepareOptionsMenu().

메뉴 항목이 선택되면 메서드가 호출됩니다. onOptionsItemSelected, 객체를 전달 메뉴 아이템- 사용자가 선택한 메뉴 항목. 방법 사용 getItemId선택한 메뉴 항목의 ID를 얻을 수 있습니다. 메뉴 항목을 식별한 후 메뉴 선택 이벤트를 처리하는 코드를 작성할 수 있습니다.

Public boolean onOptionsItemSelected(MenuItem item) ( switch (item.getItemId()) case IDM_OPEN: return true; case IDM_SAVE: return true; return false; )

단축키

다음과 같은 여러 방법을 사용하여 키보드 문자를 사용하여 빠른 액세스를 위한 단축키를 설정할 수도 있습니다.

  • setAlphabeticShortcut(char) - 문자 추가
  • setNumericShortcut(int) - 숫자 추가
  • setShortcut(char, int) - 문자와 숫자의 조합을 추가합니다.

예를 들어, 단축키 setAlphabeticShortcut("q");을 설정한 경우 메뉴를 열 때(또는 MENU 키를 누른 상태에서) 키를 누르면 이 메뉴 항목을 선택합니다. 이것 단축키(또는 키보드 단축키)는 메뉴 항목 이름 아래에 표시되는 툴팁으로 표시됩니다. 최신 키보드에는 별도의 키가 있습니다. Ctrl 키, 일반 키보드와 동일한 방식으로 작동합니다.

단축키는 XML을 통해 생성할 수도 있습니다. android:alphabeticShortcut="c".

액티비티 메소드를 통해 클릭을 처리할 수 있습니다. onKeyShortcut():

@Override public boolean onKeyShortcut(int keyCode, KeyEvent event) ( switch (keyCode) ( case KeyEvent.KEYCODE_R: Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show(); return true; 기본값: return super. onKeyShortcut(키코드, 이벤트); ) )

하위 메뉴 만들기

하위 메뉴는 다른 하위 메뉴를 제외한 모든 메뉴에 추가할 수 있습니다. 하위 메뉴는 콜백 메소드에서 생성됩니다. onCreateOptions 메뉴()방법을 사용하여 addSubMenu()객체를 반환하는 하위 메뉴. 반대하다 하위 메뉴방법을 사용하여 이 메뉴에 추가 항목을 추가할 수 있습니다. 추가하다(). 예를 들어:

공개 정적 최종 int IDM_HELP = 101; 공개 정적 최종 int IDM_NEW = 201; 공개 정적 최종 int IDM_OPEN = 202; 공개 정적 최종 int IDM_SAVE = 203; 공개 정적 최종 int IDM_CUT = 301; 공개 정적 최종 int IDM_COPY = 302; 공개 정적 최종 int IDM_PASTE = 303; @Override public boolean onCreateOptionsMenu(메뉴 메뉴) ( SubMenu subMenuFile = menu.addSubMenu("파일"); subMenuFile.add(Menu.NONE, IDM_NEW, Menu.NONE, "새로 만들기"); subMenuFile.add(Menu.NONE, IDM_OPEN , Menu.NONE, "열기"); subMenuFile.add(Menu.NONE, IDM_SAVE, Menu.NONE, "저장"); SubMenu subMenuEdit = menu.addSubMenu("편집"); subMenuEdit.add(Menu.NONE, IDM_CUT , Menu.NONE, "잘라내기"); subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "복사"); subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "붙여넣기"); 메뉴. add(Menu.NONE, IDM_HELP, Menu.NONE, "Help"); return super.onCreateOptionsMenu(menu); ) @Override public boolean onOptionsItemSelected(MenuItem item) ( CharSequence 메시지; switch (item.getItemId())) ( case IDM_NEW : message = "새 항목이 선택됨"; break; case IDM_OPEN: message = "Open item selected"; break; case IDM_SAVE: message = "Save item selected"; break; case IDM_CUT: message = "Cut item selected"; break; 사례 IDM_COPY:메시지= "선택한 항목 복사"; 부서지다; case IDM_PASTE: message = "붙여넣기 선택"; 부서지다; case IDM_HELP: message = "도움말 항목 선택"; 부서지다; 기본값: false를 반환합니다. ) // 선택한 메뉴 항목에 대한 알림 표시 Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG); toast.setGravity(중력.CENTER, 0, 0); toast.show(); true를 반환합니다. )

이제 메뉴 항목을 선택하면 하위 메뉴가 있는 다른 창이 나타납니다. 직접 해보십시오.

체크박스 및 라디오 버튼 추가

메뉴 항목에 확인란이나 라디오 버튼을 추가할 수 있습니다. 개별 메뉴 항목에 대한 확인란이나 라디오 버튼을 추가하려면 다음 메서드를 사용해야 합니다. setCheckable():

MenuItem 항목 = menu.add(0, IDM_FORMAT_BOLD, 0, "굵게"); item.setCheckable(참);

체크박스나 라디오 버튼이 있는 여러 메뉴 항목을 추가해야 하는 경우 별도의 식별자를 만들어 메뉴 그룹으로 결합할 수 있습니다. 메뉴 항목은 메서드를 통해 그룹에 추가됩니다. 추가하다(), 메뉴 그룹의 ID를 첫 번째 매개변수로 전달합니다. 색상을 설정하기 위해 색상 메뉴 그룹 및 메뉴 항목에 대한 ID를 선언했다고 가정해 보겠습니다.

공개 정적 최종 int IDM_COLOR_GROUP = 400; 공개 정적 최종 정수 IDM_COLOR_RED = 401; 공개 정적 최종 정수 IDM_COLOR_GREEN = 402; 공개 정적 최종 정수 IDM_COLOR_BLUE = 403;

이제 체크박스가 있는 메뉴 그룹을 생성하려면 각 메뉴 항목에 그룹 ID를 할당하고 메서드를 호출해야 합니다. setGroupCheckable()전체 그룹에 대해(이 경우 메서드를 호출할 필요가 없습니다. setCheckable()각 메뉴 항목에 대해):

SubMenu subMenuColor = menu.addSubMenu("색상"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_RED, Menu.NONE, "빨간색"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_GREEN, Menu.NONE,"녹색"); subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_BLUE, Menu.NONE, "파란색"); subMenuColor.setGroupCheckable(IDM_COLOR_GROUP, 참, 거짓);

방법에서 setGroupCheckable()세 가지 옵션:

  • 첫 번째 매개변수는 메뉴 그룹 ID입니다.
  • 라디오 버튼이나 체크박스가 그룹에서 허용되면 두 번째 매개변수는 true입니다.
  • 세 번째 매개변수 - 메뉴 항목의 단일(true) 또는 다중(false) 선택을 설정합니다. 이 설정은 실제로 메뉴의 모양을 결정합니다. 라디오 버튼이나 확인란이 있는 메뉴가 됩니다.

    메뉴 항목 선택 이벤트 핸들러에서 체크박스와 라디오 버튼의 상태를 제어하려면 다음을 작성하십시오.

    @Override public boolean onOptionsItemSelected(MenuItem item) ( CharSequence message; switch (item.getItemId()) ( ... case IDM_COLOR_RED: // 체크박스 상태 반전 item.setChecked(!item.isChecked())); message = "빨간색"; 중단; 기본값: false 반환; )

    프로젝트 실행, 메뉴 불러오기 및 메뉴 선택 색깔. 플래그 형태의 세 가지 항목(빨간색, 녹색, 파란색)이 있는 하위 메뉴가 있습니다. 체크박스와 스위치의 상태는 프로그램 코드에서 처리되어 메뉴가 다시 호출될 때 저장됩니다.

    이 이벤트가 onMenuItemClickListener(더 이상 사용되지 않음) 또는 onOptionsItemSelected 핸들러에 의해 포착되지 않은 경우 이 이벤트가 클릭될 때 실행되는 setIntent() 메서드를 통해 선택한 메뉴 항목에 의도를 즉시 할당할 수 있습니다. 트리거되면 인텐트가 startActivity 메서드로 전달됩니다.

    MenuItem.setIntent(새로운 의도(이, MyOtherActivity.class));

    프로그래밍 방식으로 메뉴 열기 또는 닫기

    어떤 이유로 메뉴를 프로그래밍 방식으로 열어야 하는 경우(예: 데모 목적) 다음 방법을 사용하십시오. 오픈옵션메뉴():

    오픈옵션메뉴();

    프로그래밍 방식으로 메뉴를 닫으려면 다음 방법을 사용하십시오. 닫기옵션 메뉴()그러나 메서드에 대한 반복적인 호출이 있습니다. 오픈옵션메뉴()메뉴도 닫습니다.

    프로그래밍 방식으로 메뉴 항목 제거

    xml 파일에 메뉴 항목을 정의했다고 가정해 보겠습니다.

    cat 프로그램에서 분명히 불필요한 메뉴 항목을 제거하려면 메서드를 통해 메뉴 항목에 액세스해야 합니다. 항목 찾기()그리고 보이지 않게 합니다. Menu 개체에 대한 참조는 메서드에 전달되어야 합니다. onCreateOptions메뉴프로그램이 메뉴 구성의 변화에 ​​대해 학습하도록 합니다.

    // 클래스 변수 메뉴 메뉴; @Override public boolean onCreateOptionsMenu(Menu menu) ( super.onCreateOptionsMenu(menu); // 객체에 대한 참조 전달 this.menu = menu; getMenuInflater().inflate(R.menu.test, menu); return true; ) / / 버튼 클릭 public void onClick(View v) ( if (menu != null) ( // 원하는 항목 찾기 MenuItem item_dog = menu.findItem(R.id.action_dog); // 보이지 않게 설정 item_dog.setVisible(false) ); ) )

    하지만 이 결정단점이 있습니다. 화면을 회전하면 활동이 다시 생성되고 원격 메뉴가 다시 나타납니다. 못생긴 개를 어떻게 없앨 수 있습니까?

    메뉴 항목의 상태를 기억하고 메서드에서 Bundle 유형의 개체에 저장해야 합니다. onSaveInstanceState, 그리고 방법에서 생성()저장된 상태를 가져오고 메서드에 전달 onPrepareOptions메뉴, 메뉴가 화면에 표시되기 전에 호출됩니다.

    패키지 en.alexanderklimov.test; android.app.Activity 가져오기; android.os.Bundle 가져오기; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class TestActivity extends Activity ( 메뉴 메뉴; Boolean storedMenuDogIsVisible; final static String KEY_MENU_DOG = "KEY_MENU_DOG"; @Override public void onCreate(Bundle storedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); // 검색 메뉴 항목 가시성 데이터 if (savedInstanceState != null) ( storedMenuDogIsVisible = storedInstanceState.getBoolean(KEY_MENU_DOG, true); ) ) @Override public boolean onCreateOptionsMenu(Menu menu) ( super.onCreateOptionsMenu(menu); this.menu = menu; getMenuInflater ).inflate(R.menu.test, menu); return true; ) public void onClick(View v) ( if (menu != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // 숨김 메뉴 항목 item_dog.setVisible(false); ) ) @Override protected void onSaveInstanceState(Bundle outState) ( // TODO 자동 생성 메소드 스텁 super.onSaveInstanceState(outState); if (menu != null) ( MenuItem item_dog = 메뉴. findItem(R.id.action_dog); // 메뉴 항목의 현재 상태 저장 - true 또는 false outState.putBoolean(KEY_MENU_DOG, item_dog.isVisible()); ) ) @Override public boolean onPrepareOptionsMenu(Menu menu) ( if (savedMenuDogIsVisible != null) ( MenuItem item_dog = menu.findItem(R.id.action_dog); // 원하는 메뉴 상태를 표시하기 전에 item_dog.setVisible(savedMenuDogIsVisible) ; ) super.onPrepareOptionsMenu(메뉴) 반환; ) )

    메뉴 버튼 존재 감지

    구형 장치는 실제 메뉴 버튼을 사용했습니다. 새 버전에서 안드로이드 메뉴 ActionBar에서 제거되고 별도의 버튼으로 존재하는 것은 선택 사항이 되었습니다. 그러나 많은 제조업체는 여전히 메뉴 버튼이 있는 전화기를 생산합니다. 이러한 버튼이 있는지 확인하기 위해 Android 14가 추가되었습니다. 새로운 방법, 이 버튼의 존재 여부를 결정합니다.

    If(빌드.VERSION.SDK_INT<= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this) .hasPermanentMenuKey())) ( // 메뉴 키 있음 Toast.makeText(this, "메뉴 버튼 있음", Toast.LENGTH_LONG).show(); ) else ( // 메뉴 없음 key Toast.makeText(이, "메뉴 버튼 없음", Toast.LENGTH_LONG).show(); )

    메뉴에 대한 마크업

    최신 장치에서 메뉴는 액션바. 그리고 XML을 통해 메뉴 레이아웃을 사용자 정의할 수 있습니다.

    이 옵션을 선택했다고 가정해 보겠습니다.

    속성에서 쇼애즈액션값을 사용하지 마십시오 절대, 그렇지 않으면 마크업이 표시되지 않습니다. 마크업 자체는 속성을 통해 지정됩니다. 액션레이아웃. 마크업 코드:

    조각의 메뉴

    메뉴는 활동의 일부일 뿐만 아니라 프래그먼트의 일부일 수도 있습니다. 작동 원리는 거의 동일합니다. 조각에는 해당 메서드가 있습니다.

    @Override public void onCreateOptionsMenu(메뉴 메뉴, MenuInflater 팽창기) ( super.onCreateOptionsMenu(menu, 팽창기); inflater.inflate(R.menu.fragment_crime_list, menu); )

    프래그먼트 매니저전화를 담당 onCreateOptions 메뉴()액티비티가 콜백을 수신할 때 onCreateOptions 메뉴()시스템에서. 관리자에게 명시적으로 알려야 합니다. 프래그먼트 매니저프래그먼트가 호출되어야 함 onCreateOptions 메뉴(). 이를 위해 메소드가 호출됩니다. setHasOptionsMenu():

    // 프래그먼트 코드에서 @Override public void onCreate(Bundle storedInstanceState) ( super.onCreate(savedInstanceState); setHasOptionsMenu(true); getActivity().setTitle(R.string.cat); ... )

Honeycomb(Android 3.0) 이전에는 모든 Android 기기에 화면 아래에 "메뉴" 버튼이 있었습니다. 개발자는 적절하다고 생각하는 대로 사용할 수 있으며 많은 앱의 인터페이스가 이 버튼을 중심으로 구축되었습니다. 타블렛 위주의 Honeycomb은 기계식(및 터치) 버튼에서 한 발짝 떨어져 있으며, 이와 관련하여 세 번째 안드로이드 버전 ActionBar 클래스가 나타나 사용자에게 빠른 액세스작업 표시줄이라는 특수 패널을 통해 응용 프로그램 설정으로 이동합니다. 에 따르면 구글 개발자액션 바는 미래이며 프로그래머는 "메뉴" 버튼 사용을 중단해야 합니다. 현재 시장은 기계식 또는 터치 버튼그러나 아이스크림 샌드위치의 출현으로 상황은 극적으로 바뀔 수 있습니다. 개발자로서 이러한 장치의 출현에 미리 대비하고 오늘 Action bar 개념을 사용하는 것이 중요합니다.

언뜻보기에 Action Bar를 사용하면 아직 이 Bar가 구현되지 않은 Android 2.x용 프로그램을 개발할 때 문제가 발생하는 것처럼 보일 수 있습니다. 그러나 여기에는 문제가 없습니다. "메뉴" 버튼이 있는 장치에서 계속 사용하는 것을 금지하는 사람은 아무도 없습니다. 작업 표시줄을 추가하려면 몇 줄의 코드만 작성하면 됩니다.

이 글을 한 문장으로 압축하자면 " targetSdkVersion을 14로 설정하고 작업 표시줄에 렌더링되어야 하는 메뉴 항목에 showAsAction="ifRoom" 태그를 지정합니다.".

Android에서 설정 메뉴의 최종 거부

"메뉴" 버튼 사용을 중지하는 것만으로는 충분하지 않습니다. 개념을 머리에서 완전히 제거해야 합니다. 메뉴를 만들지 말고 활동 내부에 직접 필요한 모든 버튼을 만드십시오. 일부 작업이 패널에 맞지 않으면 추가 드롭다운 메뉴(작업 오버플로)에 넣습니다. 위 그림은 검색 버튼이 있는 액션바와 바 우측에 추가 메뉴를 보여주고 있습니다.

애플리케이션이 다음을 위해 빌드된 경우 구 버전 android(전통적으로 메뉴를 사용함)를 사용하는 경우 Android 3 태블릿에서 실행하면 두 번째 분기의 전화기에 있는 세 개의 버튼을 에뮬레이트하는 패널이 화면 하단에 표시됩니다.

용어가 상당히 헷갈리지만 드롭다운 메뉴(액션 오버플로)는 단순한 설정 메뉴와 완전히 다른 사용 개념을 제시합니다. 메뉴를 애플리케이션의 모든 설정에 대한 저장소로 생각하는 대신 기본 설정을 저장할 패널을 만듭니다. 패널의 오른쪽에 있는 세 개의 점이 있는 버튼(액션 오버플로 버튼)을 클릭하면 호출되는 드롭다운 메뉴에서 모든 보조 항목이 제거됩니다.

작업 오버플로 버튼

화면 아래에 버튼이 없는 기기(예: Honeycomb이 있는 태블릿 또는 Galaxy Nexus)에서 Android 2.3 이하용으로 작성된 응용 프로그램을 실행한 경우 다음 이미지 옆에 작업 오버플로 버튼이 나타납니다. 하단 패널에 있는 세 개의 버튼(상단에 세 개의 점). 이것은 절충안이지만 그다지 좋은 것은 아닙니다. 설정 메뉴를 전혀 사용하지 않는 응용 프로그램에서는 이 버튼이 작동하지 않아 사용자를 짜증나게 합니다. 따라서 매우 좋은 해결책은 다음과 같습니다. 안드로이드 버전, 프로그램이 Android 3.0 이상에서 실행되는 경우 탐색 모음에서 이 버튼을 제거하고 작업 모음을 사용합니다. 이 접근 방식을 사용하면 프로그램을 이전 장치와 호환되도록 유지하고 새 장치에 더 매력적으로 만들 수 있습니다.

프로그램이 버튼이 없는 장치에서 실행 중인 경우 시스템은 필드 값에 따라 탐색 모음에 작업 오버플로를 추가할지 여부를 결정합니다. 매니페스트에서. 논리는 다음과 같습니다

  • minSdkVersion 또는 targetSdkVersion을 11보다 큰 값으로 설정하면 시스템에서 이 버튼을 추가하지 않습니다.
  • 반면 Android 3.0 이상에서 앱을 실행하면 시스템에서 이 버튼을 생성합니다.
  • 유일한 예외는 minSdkVersion을 10 이하로 설정한 경우입니다. targetSdkVersion을 11, 12 또는 13으로 설정하고 ActionBar를 사용하지 않습니다. 시스템은 다음 아래에 있는 휴대폰(태블릿 아님)에 이 버튼을 추가합니다. 안드로이드 컨트롤 4.0 이상. 이 예외는 다음 아이디어를 기반으로 합니다. 두 번째 분기의 휴대전화와 세 번째 분기의 태블릿용 애플리케이션을 개발하는 경우 휴대전화에는 메뉴 버튼이 있어야 하지만 태블릿에는 없다고 가정합니다.

따라서 탐색 모음에 있는 버튼의 오버플로 작업을 비활성화하려면 targetSdkVersion을 14로 설정해야 합니다(minSdkVersion은 다음 이상으로 설정할 수 있습니다. 낮은 가치프로그램이 이전 장치에서 실행될 수 있도록).

액션바 개념으로의 전환

옵션 메뉴(onCreateOptionsMenu()로 생성)를 사용하는 활동이 있는 경우 탐색 모음에서 버튼을 제거하여(targetSdkVersion=14 설정) 사용자에게 옵션에 액세스할 수 있는 대체 수단을 제공해야 합니다. 다행히 시스템이 자동으로 작업 표시줄을 생성하기 때문에 많은 작업을 수행할 필요가 없습니다.

태그에 showAsAction="ifRoom" 추가 액션 바에 넣고 싶은 요소. 액션 바에 어떤 요소를 포함해야 할지 잘 모르겠다면 Android 디자인의 액션 바 가이드를 참조하세요.

프로그램을 보다 총체적으로 인식하려면 다음 아이콘을 사용하는 것이 좋습니다. 안드로이드 UX팀. 보관소 .

Android 애플리케이션에서 작업 표시줄을 제거하는 방법

작업 표시줄이 필요하지 않은 경우 모든 활동 또는 응용 프로그램에서 제거할 수 있습니다. 이는 설정 메뉴를 사용하지 않는 게임 및 프로그램과 관련이 있을 수 있습니다. Theme.Holo.NoActionBar 또는 Theme.DeviceDefault.NoActionBar 테마를 사용하여 작업 모음을 제거할 수 있습니다.

이러한 구성표를 사용하고 싶지만 유지하려면 이전 버전과 호환, 리소스 관리 시스템을 사용하여 다양한 테마를 설정할 수 있습니다. 다른 버전플랫폼. 이 주제는 더 자세히 다룹니다 여기. 테마에서 상속할 고유한 테마를 만들어야 합니다. 다양한 플랫폼현재 버전에 따라 다릅니다.

예를 들어 애플리케이션의 테마를 선언할 수 있습니다.

(또는 태그의 특정 활동에 대해 ).

Android 2를 실행하는 기기의 경우 res/values/themes.xml에 다음 테마를 포함하세요.



Honeycomb의 경우 res/values-v11/themes.xml에 다음 테마를 포함합니다.



시작 시 API 버전에 따라 시스템이 적절한 테마를 선택합니다.

결론

기사의 핵심 아이디어와 요점을 요약해 보겠습니다.

  • 새로운 안드로이드장치에는 "메뉴" 버튼이 없을 수 있으므로 프로그램을 개발할 때는 아예 사용하지 않는 것이 좋습니다.
  • targetSdkVersion = 14로 설정하고 Android 4.0에서 앱을 테스트합니다.
  • showAsAction="ifRoom" 태그를 다음에 추가합니다. 메뉴 항목을 선택하면 자동으로 작업 표시줄로 이동합니다.
  • 응용 프로그램에서 ActionBar를 사용하지 않는 경우 Theme.Holo.NoActionBar 및 Theme.DeviceDefault.NoActionBar 테마를 사용하여 제거할 수 있습니다.

Android는 여러 유형의 메뉴를 지원합니다. 첫째 - 전화에 별도의 버튼이 있습니다. 메뉴(구형 휴대폰에서) 누르면 메뉴가 나타납니다. 새 기기에서는 별도의 버튼이 제거되어 메뉴 아이콘으로 대체되었습니다. 세로 방향의 점. 두 번째 유형은 화면에서 손가락을 길게 누르면 나타나는 컨텍스트 메뉴입니다. 올바른 장소(휴대폰의 가운데 버튼을 길게 눌러도 됩니다.) 상황에 맞는 메뉴차례로 하위 메뉴가 있을 수 있습니다. 오늘 우리는 첫 번째 유형의 메뉴에 대해 알게 될 것입니다. 이 문서에서는 Android 4.0 이상을 실행하는 새 기기에서 메뉴 작업을 다룹니다.

템플릿에서 빈 활동메뉴가 없으니 직접 만들어 드립니다. 이것은 작동 방식을 이해하고 프로젝트에 대한 일반적인 아이디어를 얻는 데 도움이 됩니다. 메뉴 항목 선택을 처리하기 위해 클래스, 메서드 및 코드의 이름을 외울 필요는 없습니다. 다른 템플릿에는 메뉴가 내장되어 있어 바로 사용할 수 있습니다.

만들다 새로운 과제기반을 둔 빈 활동실행합니다. 아직 메뉴가 없습니다.

파일에 여러 문자열 리소스 만들기 res/values/strings.xml, 메뉴 항목을 담당합니다.

설정 고양이 고양이 고양이 새끼

이제 새 폴더를 만듭니다. 메뉴폴더에 입술 입술, | 새로운 | 예배 규칙서). 다음으로 생성된 폴더에 파일을 생성합니다. menu_main.xml- 이름은 메뉴가 주 활동에 속함을 나타냅니다. 주요 활동(폴더 우클릭 메뉴 | 새로운 | 메뉴 리소스 파일). 여러 화면이 있는 응용 프로그램을 만드는 경우 각 활동에는 자체 설정이 있는 별도의 메뉴가 있습니다. 파일을 여는 동안 menu_main.xml결과 템플릿에 코드를 추가합니다.

파일을 열어보자 주요 활동. 지금은 한 가지 방법만 있습니다. 생성(). 새로운 메소드를 추가하자 onCreateOptions 메뉴(). 정확히 이 방법활동의 메뉴 표시를 담당합니다. 스튜디오 메뉴에서 선택 암호| 다음 창에서 첫 글자로 메서드 이름을 입력하기 시작합니다. 먼저 입력 가능 대문자, 즉. 오컴( 영형 N 비율 영형옵션 enu) 원하는 문자열을 빠르게 찾을 수 있습니다. 우리는 버튼을 누릅니다 확인그리고 우리는 공작물을 얻습니다.

@Override public boolean onCreateOptionsMenu(메뉴 메뉴) ( return super.onCreateOptionsMenu(menu); )

메뉴 리소스에서 데이터를 가져와 화면의 메뉴 항목으로 변환하는 메서드를 준비에 추가합니다.

@Override public boolean onCreateOptionsMenu(메뉴 메뉴) ( getMenuInflater().inflate(R.menu.menu_main, menu); return true; )

방법에서 부풀게 하다()메뉴 리소스( R.menu.menu_main) 및 클래스 객체 메뉴.

영어에서 "inflate"는 팽창하는 것으로 번역됩니다. 디자인에 의해 안드로이드 개발자, 예를 들어 메뉴와 같은 데이터로 개체를 확장합니다. 하지만 사실 "inflate"라는 단어는 평평한- 아파트로. 첫 번째 고양이를 아파트로 보내는 오래된 전통이 있습니다. 고양이는 집의 구석구석을 탐색하고 집에 살기로 동의한다고 선언합니다. 따라서 XML 파일의 데이터를 MenuInflater 개체로 실행합니다.

프로젝트를 실행합니다. 이제 헤더의 오른쪽에 정렬된 세 개의 점 아이콘이 표시됩니다. 수직선. 아이콘을 클릭하면 메뉴 항목이 표시됩니다. 설정.

추측하기 어렵지 않기 때문에, 안건별도의 메뉴 항목을 담당합니다. 메뉴의 식별자와 텍스트만 변경하여 같은 방식으로 항목을 세 개 더 추가해 보겠습니다.

프로젝트를 실행하고 메뉴를 다시 불러오십시오. 3개의 새 항목이 표시됩니다.

옵션 ID그리고 제목설명이 필요 없습니다. 매개변수 주문 카테고리메뉴 항목 표시 순서를 설정할 수 있습니다. 5개의 메뉴 항목을 만들었지만 화면에 표시되는 순서를 아직 결정하지 않았다고 가정합니다. 메뉴 항목에 대한 전체 코드 블록을 지속적으로 이동하지 않으려면 올바른 순서, 이 옵션을 사용할 수 있습니다.

그리고 마지막으로 중요한 속성 앱:showAsAction에서 메뉴의 동작을 정의합니다. 액션바. 의미 절대메뉴 항목이 헤더에 표시되지 않고 팝업 메뉴에만 표시되어야 함을 의미합니다. 점 세 개 뒤에 있습니다. 값을 설정하면 언제나, 다음 포인트 설정애플리케이션 헤더에 즉시 나타납니다. 또한 사용 가능한 값 ifRooms, 텍스트로그리고 축소 작업 보기. 직접 해보십시오. 예를 들어, 이프룸공간이 허용되는 경우 메뉴 항목을 표시합니다. 포인트가 많으면 방해가 될 뿐입니다. 일반적으로 이 옵션은 세 개의 점에 대한 불필요한 클릭을 방지하기 위해 빈번한 작업에 대해 매우 짧은 단어 또는 아이콘을 표시합니다.

속성 주목 앱:showAsAction, 네임스페이스에 속하는 xmlns:app="http://schemas.android.com/apk/res-auto". 이러한 네임스페이스가 존재하지 않고 프로젝트에서 속성을 사용하던 때가 있었습니다. 안드로이드:showAsAction표준 네임스페이스에서. 스튜디오가 오류에 대해 맹세하면 코드를 편집하십시오.

메뉴 항목이 실행될 때까지 유용한 작업. 항목을 클릭하면 눈에 보이는 결과 없이 메뉴가 닫힙니다. 아직 클릭을 처리하는 코드를 작성하지 않았습니다.

메뉴 항목 선택

메뉴를 만드는 방법을 배웠습니다. 그러나 메뉴 항목이 우리의 클릭에 어떤 식으로든 반응하지 않기 때문에 지금까지는 쓸모가 없습니다. 다른 방법은 메뉴 클릭을 처리하는 데 사용됩니다. onOptionsItemSelected(). 앞의 예제와 같은 방법으로 메소드를 추가해 봅시다. 준비물을 받자.

@Override public boolean onOptionsItemSelected(MenuItem item) ( return super.onOptionsItemSelected(item); )

매개변수 안건메뉴 항목을 담당합니다. 메소드를 통해 메뉴 ID를 가져와야 합니다. getItemId()그리고 그것에 대한 코드를 입력하십시오. 메뉴는 일반적으로 여러 항목으로 구성되어 있으므로 구성을 사용하는 것이 편리합니다. 다른 경우라면또는 스위치. 정보를 표시하기 위해 텍스트 레이블을 사용합니다. 활동 화면에 구성 요소 추가 텍스트 보기. 당신은 기존 텍스트 보기"Hello World!"라는 레이블이 붙은 경우 ID를 지정하기만 하면 됩니다.

android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!"/>

선택한 메뉴 항목의 공백에 코드를 추가해 보겠습니다.

@Override public boolean onOptionsItemSelected(MenuItem item) ( // 선택한 메뉴 항목의 ID 가져오기 int id = item.getItemId(); TextView infoTextView = (TextView) findViewById(R.id.textView); // 선택한 항목에 대한 작업 메뉴 항목 전환( id) ( case R.id.action_cat1: infoTextView.setText("고양이를 선택했습니다!"); return true; case R.id.action_cat2: infoTextView.setText("고양이를 선택했습니다!"); return true; case R. id.action_cat3: infoTextView.setText("당신은 새끼 고양이를 선택했습니다!"); return true; 기본값: return super.onOptionsItemSelected(item); ) )

응용 프로그램을 실행하고 메뉴를 불러온 다음 메뉴 항목을 선택합니다. 텍스트 상자에 메시지가 표시되어야 합니다.

존재 대체 방법버튼 클릭 처리와 유사한 XML을 통해 (Android 3.0부터). 속성을 추가할 수 있습니다. 안드로이드:onclick메뉴 리소스에서 메서드 호출을 사용할 필요가 없습니다. onOptionsItemSelected(). 도움으로 안드로이드:onclick메뉴 항목을 선택할 때 원하는 방법을 지정할 수 있습니다. 항목에 이 속성 추가 설정

이제 활동 코드에서 다음을 작성합니다.

// 설정 메뉴 항목 속성이 android:onClick="onSettingsMenuClick"으로 설정됨 public void onSettingsMenuClick(MenuItem item) ( TextView infoTextView = (TextView) findViewById(R.id.textView); infoTextView.setText("설정을 선택했습니다. 고양이를 선택하는 것이 좋습니다."); )

스위치

메뉴 항목의 모양은 라디오 버튼이 있는 보기로 변경할 수 있습니다. 이렇게 하려면 요소를 추가하십시오. 그룹속성이 있는 android:checkableBehavior="단일":

이 모드에서는 별 의미가 없습니다. 그리고 우리는 그것을 고려하지 않을 것입니다.

디자인 모드

Android Studio 2.2에는 화면에 새 구성 요소를 추가하기 위한 도구 모음처럼 보이는 그래픽 메뉴 빌드 모드가 추가되었습니다. 메뉴 표시줄은 네 가지 요소로 구성됩니다. 메뉴 아이템, 항목 검색, 메뉴, 그룹.

원리는 동일하며 원하는 요소를 선택하고 화면에서 메뉴 영역으로 드래그합니다. 메뉴를 수동으로 만드는 방법을 배웠다면 이 방법문제를 일으키지 않을 것입니다. 이를 통해 메뉴 구조를 빠르게 스케치한 다음 수동으로 조정할 수 있습니다.