728x90
반응형

앱을 사용하다 보면 사용자에게 무엇 인가를 선택하게 만들어야하는 순간이 옵니다.


하지만 화면을 따로 만들거나 DialogFragment로 만들려면 다소 귀찮은게 한두가지가 아닙니다. ㅠㅠ


그래서 이번 포스팅에서는 아주 간단한 방법으로 selection popup을 만드는 것을 소개 하려고 합니다.


저는 지금까지 AlertDialog는 Message만 넣을 수 있는줄 알았습니다.


하지만 SingleChoice와 MultiChoice도 만들 수 있다는 것을 최근에 알았습니다.


먼저 layout은 기본으로 생성해주는 activity_main.xml을 사용하겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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="com.googry.googryselectpopup.MainActivity">

<TextView
android:id="@+id/tv_sports"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>


SingleChoice는 AlertDialog에 setItems를 사용해 만들 수 있습니다.

setItems는 String[]나 CharSequence[]를 인자로 받습니다.

public class MainActivity extends AppCompatActivity {

private String[] mSports = {"야구","축구","농구","수영","테니스","골프","탁구","볼링","당구","태권도","유도","검도"};
private TextView mTvSports;
private AlertDialog mSportSelectDialog;

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

mTvSports = (TextView) findViewById(R.id.tv_sports);
mTvSports.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSportSelectDialog.show();
}
});

mSportSelectDialog = new AlertDialog.Builder(MainActivity.this )
.setItems(mSports, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mTvSports.setText(mSports[i]);
}
})
.setTitle("title")
.setPositiveButton("확인",null)
.setNegativeButton("취소",null)
.create();

}
}

그리고 OnClickListener를 통해 선택된 아이템의 index를 넘겨 받게 됩니다.


실행 화면



MultiChoice는 AlertDialog에 setMultiChoiceItems를 사용해 만들 수 있습니다.


이 함수는 setItems와는 다르게 boolean[]를 추가로 받습니다.

그 이유는 이전에 선택된 것을 보여주기 위해서 입니다.

public class MainActivity extends AppCompatActivity {

private String[] mSports = {"야구","축구","농구","수영","테니스","골프","탁구","볼링","당구","태권도","유도","검도"};
private boolean[] mSportsSelected = new boolean[mSports.length];
private TextView mTvSports;
private AlertDialog mSportSelectDialog;

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

mTvSports = (TextView) findViewById(R.id.tv_sports);
mTvSports.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mSportSelectDialog.show();
}
});

mSportSelectDialog = new AlertDialog.Builder(MainActivity.this )
.setMultiChoiceItems(mSports, mSportsSelected, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean b) {
mSportsSelected[i] = b;
}
})
.setTitle("title")
.setPositiveButton("확인",null)
.setNegativeButton("취소",null)
.create();

}
}

그리고 OnMultiChoiceClickListener를 통해 아이템을 선택 할 때 마다 선택한 아이템의 index와 선택유무인 boolean을 넘겨 받게 됩니다.


실행화면



저는 지금까지 간단한 SingleChoice나 MultiChoice도 DialogFragment로 직접 만들어서 사용했는데 이런게 있는줄 너무 늦게 알았습니다.


여러분들도 간단한 입력은 이런식으로 처리하세요~~

728x90
반응형

+ Recent posts