Android - 액션 바 사용하기(2)

유의선·2023년 6월 19일
0

액션바 보이거나 숨기기

액션바는 기본적으로 제목을 보여주는 타이틀 기능을 하므로 앱의 제목을 보여줄 수 있으며,
이러한 액션바는 화면에 보이거나 보이지 않도록 만들 수 도 있다.

소스 코드에서 액션바를 보이게 만들고 싶다면 getSupportActionBar 메소드로 ActionBar 객체를 참조하고 show 메소드를 호출하면 되고, 감추고 싶다면 hide 메소드를 호출한다.

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


액션바 아이콘 바꾸기

activity_main.xml 파일에 버튼을 하나 추가한다.

액션 바 사용하기(1)에서 사용했던 menu_main.xml 파일을 그대로 사용한다.

MainActivity.java 파일을 수정한다.

public class MainActivity extends AppCompatActivity {

    ActionBar abar;

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

        abar = getSupportActionBar();

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                abar.setLogo(R.drawable.home);
                abar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_USE_LOGO);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu 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_settings:
                Toast.makeText(this, "설정", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

액션 바 사용하기(1)과 같은 방법으로 onCreateOptionMenu와 onOptionsItemSelected 메소드를 재정의하였다.

getSupportActionBar 메소드를 이용해 XML 레이아웃에 들어 있는 ActionBar 객체를 참조한다.

abar = getSupportActionBar();

버튼을 눌렀을 때
setLogo 메소드로 로고를 설정하고,
setDisplayOptions 메소드를 사용해 액션바가 보이는 모습을 바꾼다.

	abar.setLogo(R.drawable.home);
    abar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_USE_LOGO);

setDisplayOptions 메소드에 사용할 수 있는 상수들은 다음과 같다.

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




액션바에 검색어 입력상자 넣기

액션바 안에 넣을 입력상자 레이아웃 search_layout.xml을 만든다.
이 레아아웃은 택스트 뷰와 입력상자로만 아루어진 간단한 레이아웃이다.

액션 바 사용하기(1)에서 사용했던 menu_main.xml 파일을 가져온다.
그 후, id:menu_search인 item을 삭제한 후, 다음과 같은 item을 추가한다.

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

orderInCategory 속성은 메뉴가 보이는 순서를 결정하며 101,102,103처럼 작은 숫자부터 순서대로 지정한다.

actionLayout 속성을 사용해 메뉴가 화면에 보여질 때의 방식을 설정한다.

MainActivity를 수정한다.

public class MainActivity extends AppCompatActivity {

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

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

        View v = menu.findItem(R.id.menu_search).getActionView();

        if (v != null){
            EditText editText = v.findViewById(R.id.editText);

            if(editText != null){
                editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                        Toast.makeText(getApplicationContext(), "입력 확인", Toast.LENGTH_SHORT).show();
                        return true;
                    }
                });
            }
        }
        return true;
    }
}

onCreateOptionsMenu 메소드를 재정의한다.
그 후 그 안에서 메뉴 아이템 중에서 id가 menu_search인 아이템을 뷰 객체로 참조한다.

View v = menu.findItem(R.id.menu_search).getActionView();

참조한 아이템 안에 정의한 입력상자 객체를 참조한다.

EditText editText = v.findViewById(R.id.editText);

입력상자 객체에 리스너를 설정한다.
이 리스너는 키패드의 '완료 키'를 누를 때의 리스너이다.
이 부분에 원하는 기능을 넣으면 된다.

				editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                        Toast.makeText(getApplicationContext(), "입력 확인", Toast.LENGTH_SHORT).show();
                        return true;
                    }
                });

0개의 댓글