본문 바로가기

안드로이드 스튜디오

[안드로이드 스튜디오 자바] Spinner 여러 개 사용 시, 코드 줄이는 방법

728x90
반응형

 

 

 

 

 

 

 

 

Fragment에 Spinner를 사용할 때, 코드의 길이가 너무 길어져서

Spinner 끼리 묶어놓아도 반복되는 코드가 너무 많아졌다. 

 

 

 

 

 

 

 

 

이로 인해 코드 자체가 너무 길어졌고, 

여기에 setOnItemClickListener까지 붙이면 더욱 더 반복되는 코드가 많아진다.

 

 

 

 

 

 

 

 

 

 

이를 방지하기 위해 '매개변수의 다형성' 을 이용해서 자바 코드를 간단하게 줄일 수 있었다.

(자바의 정석을 보신다면 Chapter 07- 5.5매개변수의 다형성(p.367)을 보길 추천)

 

 

 

 

 

 

화면은 spinner 4개를 이용해서 단순하게 만들었다.

(Activity에서 Fragment로 화면을 변경하는 방법으로 구성)

 

 

 

 

 

 

 

 

 

1) 코드를 줄이지 않았을 때

 

-> 반복되는 단순한 코드가 많음, 변수가 계속 바뀌기 때문에 이를 변경하게끔 변수 설정을 넣고 메서드로 만들어줘야함

 

 

 

 

 

 

 

 

 

2) 코드를 줄였을 때

 

 

 

 

 

 

 

 

반복되는 Spinner와 ArrayAdapter를 전역변수로 만들어주고, 

Spinner s1, s2, s3, s4;
ArrayAdapter a1, a2, a3, a4;

 

public void setSpinner(Spinner s, ArrayAdapter a) {
    a = ArrayAdapter.createFromResource(this.getContext(), R.array.array, R.layout.support_simple_spinner_dropdown_item);
    a.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
    s.setAdapter(a);
}

 

각각의 함수들이 동작하는 코드를 적어준다.

 

 

 

 

 

 

그리고 이것을 받는 함수에 변수를 대입해서 넣어준다.

s1 = rootView.findViewById(R.id.spinner1);
setSpinner(s1, a1);

 

 

 

 

 

 

 

리스너의 차이때문에 코드가 더 줄어든 것 처럼 느낄 수 있지만

-> 리스너가 없어도 충분히 길고 반복되는 코드이기 때문에,

매개변수를 이용해 간단히 메서드로 만들어주면 보기 좋은 코드를 만들 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

전체코드

 

MainActivity.java

 

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;

import android.annotation.SuppressLint;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    FragmentManager fragmentManager = getSupportFragmentManager();

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

        getClientCheckFrag();
    }

    @SuppressLint("ResourceType")
    public void getClientCheckFrag() {
        fragmentManager.beginTransaction().add(R.id.mainFrameLayout, new TestFragment()).commit();
    }
}

 

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">

    <FrameLayout
        android:id="@+id/mainFrameLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

TestFragment.java

 

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

import androidx.fragment.app.Fragment;

public class TestFragment extends Fragment {

    private ViewGroup rootView;
    Spinner s1, s2, s3, s4;
    ArrayAdapter a1, a2, a3, a4;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        rootView = (ViewGroup) inflater.inflate(R.layout.fragment_test, container, false);

        getSpinner();
        return rootView;
    }


    public void getSpinner() {
        s1 = rootView.findViewById(R.id.spinner1);
        setSpinner(s1, a1);
        s2 = rootView.findViewById(R.id.spinner2);
        setSpinner(s2, a2);
        s3 = rootView.findViewById(R.id.spinner3);
        setSpinner(s3, a3);
        s4 = rootView.findViewById(R.id.spinner4);
        setSpinner(s4, a4);
    }


    public void setSpinner(Spinner s, ArrayAdapter a) {
        a = ArrayAdapter.createFromResource(this.getContext(), R.array.array, R.layout.support_simple_spinner_dropdown_item);
        a.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        s.setAdapter(a);
    }



	// 긴 코드를 보여주기 위한 예시 Spinner 코드로 동작하지 않음
    public void exSpinner() {
        s1 = rootView.findViewById(R.id.spinner1);
        a1 = ArrayAdapter.createFromResource(this.getContext(), R.array.array, R.layout.support_simple_spinner_dropdown_item);
        a1.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        s1.setAdapter(a1);


        s2 = rootView.findViewById(R.id.spinner2);
        a2 = ArrayAdapter.createFromResource(this.getContext(), R.array.array, R.layout.support_simple_spinner_dropdown_item);
        a2.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        s2.setAdapter(a2);


        s3 = rootView.findViewById(R.id.spinner3);
        a3 = ArrayAdapter.createFromResource(this.getContext(), R.array.array, R.layout.support_simple_spinner_dropdown_item);
        a3.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        s3.setAdapter(a3);


        s4 = rootView.findViewById(R.id.spinner4);
        a4 = ArrayAdapter.createFromResource(this.getContext(), R.array.array, R.layout.support_simple_spinner_dropdown_item);
        a4.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        s4.setAdapter(a1);

    }
}

 

 

fragment_test.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="20dp"
        android:layout_marginEnd="20dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="100dp" />

        <Spinner
            android:id="@+id/spinner2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp" />

        <Spinner
            android:id="@+id/spinner3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp" />

        <Spinner
            android:id="@+id/spinner4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp" />


    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

 

728x90
반응형