본문 바로가기

대학교 과제/모바일프로그래밍 [ 2 - 2 ]

[모바일 프로그래밍 과제] - 7주차 (직접풀어보기 7 - 1)

반응형

1. 과제 안내문, 예시 출력화면


 

예시 실행화면


  모든 단원들이 그렇겠지만, 이번 단원에서도 새로운 기능을 배웠다. 조금 다른 점이 있다면 onCreate() 매소드 안에서만 리스너를 구현할 수 있는 기존의 위젯들과는 다르게, 이번에 배운 menu는 onCreate() 매소드 밖에서 해당 매소드를 구현해야 한다는 것이다. XML 파일 또한 따로 제작해야 하는데, 자세한 것은 문제풀이 과정에서 설명할 것이다.

 

2. 문제풀이

 

 menu안에 표시될 항목들은 XML 파일을 따로 제작해야한다. 파일이 있어야할 경로는 res파일안에 menu파일에 생성면 된다. 만약 res 파일 안에 menu파일이 존제하지 않는다면 오른쪽 res파일에 마우스를 위치한 채 오른쪽 마우스를 클릭 후, New -> Android resource Directory를 통해 생성할 수 있다. 그러면 다음과 같은 창이 뜨는데 Resource type항목에menu를 선택하면 생성할 수 있다. 다음은 관련된 사진이다.



 이 menu파일 안에 옵션 메뉴를 구성할 XML 파일을 생성하면 된다. 옵션을 생성하는 방법은 간단하다. <menu>태그 안에 <item> 태그를 넣어주면 된다. 다음은 내가 작성한 XML 파일이다.

 

- 옵션 XML 파일

 

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

    <item
        android:id="@+id/itemRot"
        android:title="그림회전"/>
    <group
        android:checkableBehavior="single">
        <item
            android:id="@+id/hanla"
            android:title="한라산" />
        <item
            android:id="@+id/chuja"
            android:title="추자도"/>
        <item
            android:id="@+id/beom"
            android:title="범섬"/>
    </group>

</menu>

 

 item태그를 그룹으로 묶는다면, 라디오 버튼처럼 사용할 수 있는데, 한 가지의 항목만을 선택할 수 있다. 다음은 activity_main.xml의 코드이다. 이 경우 간단한 텍스트 뷰와 에디트 텍스트, 이미지 뷰어만이 필요하기에 구성이 어렵지는 않았다.

 

- activity_main.xml 코드

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="각도입력" />

        <EditText
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">
        <ImageView
            android:id="@+id/img1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/hanla" />
    </LinearLayout>
</LinearLayout>

 

옵션을 구성하는 XML코드를 작성했다면 이 코드를 MainActivity 코드안에서 뷰어에 넣어주면 완성이다. 이때는 onCreateOptionMenu() 메소드를 사용하면 된다. 다음은 내가 작성한 자바 코드이다.

 

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    MenuInflater mInflater = getMenuInflater();
    mInflater.inflate(R.menu.menu1,menu);
    return true;
}

 

 여기서 menu1은 내가 작성한 옵션 XML파일의 이름이다. 선택된 옵션에 대한 코드는 onOptionsItemSelected() 메소드로 처리할 수 있다. Item.getItemId()을 사용하면 어떤 항목이 선택되었는지를 반환받을 수 있다. 이는 switch문을 통해 처리하면 간편하게 코드를 작성할 수 있다. 다음은 나의 코드이다.

 

public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){
        case R.id.beom:
            imgView.setImageResource(R.drawable.beom);
            return true;
        case R.id.chuja:
            imgView.setImageResource(R.drawable.chuja);
            return true;
        case R.id.hanla:
            imgView.setImageResource(R.drawable.hanla);
            return true;
        case R.id.itemRot:
            int value = Integer.parseInt(editText1.getText().toString());
            imgView.setRotation(value);
            return true;
    }
    return false;
}

 

 다음은 이 과제에서 사용한 전체 자바 코드이다. 

 

- MainActivity.java 코드

 

public class MainActivity extends AppCompatActivity {

    EditText editText1;
    ImageView imgView;

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

        editText1 = (EditText) findViewById(R.id.editText1);
        imgView = (ImageView) findViewById(R.id.img1);
    }

    @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.beom:
                imgView.setImageResource(R.drawable.beom);
                return true;
            case R.id.chuja:
                imgView.setImageResource(R.drawable.chuja);
                return true;
            case R.id.hanla:
                imgView.setImageResource(R.drawable.hanla);
                return true;
            case R.id.itemRot:
                int value = Integer.parseInt(editText1.getText().toString());
                imgView.setRotation(value);
                return true;

        }
        return false;
    }
}
반응형