Translate

2017년 6월 26일 월요일

[Android Studio] Spinner setRotation 시 dropdown 창 함께 회전하기


Laptop
운영체제Windows 10 Home 64bit
개발프로그램Android Studio 2.3.3
(buildToolsVersion "25.0.2")
프로젝트명Spinner-rotation-test

Mobile
모델LG X5
운영체제Android 6.0.1 Marshmallow


Android Studio에서 Spinner 뷰에 setRotation(90); 메소드를 적용하면, 아래와 같은 문제점이 발생한다.


 
바로 dropdown 창이 함께 회전하지 않는다는 것이다.
아쉽게도 뷰 메소드 자체에서는 해결방법이 없는 듯하다.
좀 번거롭긴 하지만, 커스텀 뷰를 제작할 때 쓰는 ArrayAdapter를 사용하면 어느정도 해결할 수 있다. 정확히는 오버라이딩이 필요하다. 

먼저 res/layout에 spinner_adapter.xml 라는 레이아웃을 하나 만들어주자.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="20dp"
    >
    <!-- padding을 적용하지 않을 시 화면에 표시되지 않는다. -->

</TextView>


그리고 MyArrayAdapter 라는 ArrayAdapter를 상속받는 클래스를 하나 생성하고, 생성자와 getDropDownView 메소드를 오버라이딩한다.

그리고 아래와 같이 소스를 작성한다.
(setRotation 메소드는 각도 값을 입력받기 위해 임의로 만들었다.)

MyArrayAdapter.java
 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
31
32
33
34
35
36
37
package com.spinner_rotation_test;

import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

import java.util.List;

public class MyArrayAdapter extends ArrayAdapter<String> {

    private int m_degree;

    public MyArrayAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<String> objects) {
        super(context, resource, objects);
    }


    @Override
    public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        parent.setRotation(m_degree);

        // spinnerMode 가 dialog 일 때는 위치 조정을 해야 화면에 나타난다.
        // parent.setY(120);

        return super.getDropDownView(position, convertView, parent);
    }

    public void setRotation(int degree)
    {
        m_degree = degree;
    }

}


이것들을 이용해서, MainActivity.java를 작성한다.
 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
package com.spinner_rotation_test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Spinner;

import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private Spinner mSpinner;

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

        mSpinner = (Spinner) findViewById(R.id.spinner);
        mSpinner.setRotation(90);

        List<String> item_list = Arrays.asList(new String[]{"item 1", "item 2", "item 3"});
        MyArrayAdapter myArrayAdapter = new MyArrayAdapter(this, R.layout.spinner_adapter, item_list);
        myArrayAdapter.setRotation(90);

        mSpinner.setAdapter(myArrayAdapter);


    }
}

activity_main.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">


    <Spinner
        android:id="@+id/spinner"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        />

</RelativeLayout>


결과 화면은 다음과 같다.



+ spinnerMode가 dialog 일 때

spinner에 android:spinnerMode="dialog" 를 추가하고
MyArrayAdapter.java의 Line 27의 주석을 해제하면 다음과 같이 dialog 모드도 적용된다는 걸 확인할 수 있다.




0 개의 댓글:

댓글 쓰기