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>
'안드로이드 스튜디오' 카테고리의 다른 글
[안드로이드 스튜디오 코틀린] Activity에서 Fragment를 이용한 화면 전환 (1) | 2022.09.23 |
---|---|
[안드로이드 스튜디오] OkHttp 로그 해석 (0) | 2022.09.13 |
[안드로이드 스튜디오 자바] CheckBox로 약관동의 만들기, Fragment에서 CheckBox (0) | 2022.08.31 |
[안드로이드 스튜디오 자바] strings.xml에 있는 문자열 중 일부만 글자 변경하기 (1) | 2022.08.25 |
[안드로이드 스튜디오] ViewBinding 사용 자바, 코틀린 코드 비교 (0) | 2022.08.19 |