일단 완성품부터 볼께요
이쁘네요
그럼 일단 Layout부터 볼까요?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/alert_header"
style="@style/DefaultText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/alert_title_background"
android:padding="12dip"
android:textColor="@color/alert_title_text" />
<ListView
android:id="@+id/alert_list"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
별거 없져? 그냥 TextView하나에 ListView가 다에요 ~
저기서 궁금할만한 Style는
<style name="DefaultText">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/main_default_text</item>
</style>
역시 별거 없네요
그럼 하나의 cell layout도 한번 볼까요?
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
style="@style/DefaultText"
android:padding="12dip"
/>
여긴 더 간단하네요 :) 만약 주소록에 이름 뿐만아니라 전화번호도 같이 표시하고 싶으시다면 Layout로 묶어서 TextView를 하나 더 넣는게 좋을 것 같아요
그럼 alert를 띄우는 부분을 한번 봐볼께요
private void showAlertList(Context context, String[] strings, CustomOnItemClickListener onItemClickListener, String headerTitle) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.layout, null);
ListView listView = (ListView)view.findViewById(R.id.alert_list);
TextView headerView = (TextView)view.findViewById(R.id.alert_header);
listView.setAdapter(new MessageListAdapter(strings));
listView.setOnItemClickListener(onItemClickListener);
if(headerTitle != null && !headerTitle.equals("")) {
headerView.setText(headerTitle);
} else {
headerView.setVisibility(View.GONE);
}
builder.setView(view);
final AlertDialog dig = builder.create();
onItemClickListener.setAlertDialog(dig);
dig.show();
}
일단 저는 자료형은 String[]를 썼어요 List를 해도 상관없지만 범용적(사실 String-array Res를 기반으로 만듬)으로 사용하고 싶어서 이렇게 만들었어요
여기서 보면 CustomOnItemClickListener 라는 OnItemClickListener이 나오는데 이건 제가 커스텀한거에요 아이템이 눌렸을때 Dialog를 닫아줘야 하는데 그럴방법이 마땅히 떠오르지 않아서 이렇게 했어요 :)
코드는 간단해요
private abstract class CustomOnItemClickListener implements AdapterView.OnItemClickListener {
private AlertDialog dig;
@Override
public abstract void onItemClick(AdapterView<?> adapterView, View view, int i, long l);
protected void dismissDig() {
if(dig != null) {
dig.dismiss();
}
}
public void setAlertDialog(AlertDialog dig) {
this.dig = dig;
}
}
onItemClick를 Overriding할때 Dialog가 닫혀야 할때 dismissDig()를 불러주면 되요
실제로 사용한 곳을 볼께요
showAlertList(getActivity(), phoneNameList, new CustomOnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//할일
dismissDig();
}
}, getResources().getString(R.string.setting_phone_list));
간단하져?
그럼 PhoneList를 불러오는 부분을 볼께요 ~
public static List<PhoneDataPair> getMyPhoneList(Context context) {
List<PhoneDataPair> phoneList = new ArrayList<PhoneDataPair>();
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME;
Cursor cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, sortOrder);
while (cursor.moveToNext()) {
int phone_idx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int name_idx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
String phone = cursor.getString(phone_idx);
String name = cursor.getString(name_idx);
PhoneDataPair pair = new PhoneDataPair();
pair.name = name;
pair.phoneNumber = phone;
phoneList.add(pair);
}
return phoneList;
이게 다에요 보면 처음 보는 Class가 하나 있을꺼에요
public class PhoneDataPair {
public String phoneNumber = "";
public String name = "";
@Override
public boolean equals(Object obj) {
if(obj instanceof PhoneDataPair) {
return ((PhoneDataPair)obj).name.equals(name) &&
((PhoneDataPair)obj).phoneNumber.equals(phoneNumber);
}
return false;
}
}
그냥 이름이랑 전화번호 만 저장하는 Class에요
그리고 저기서 보면 sortOrder이라는게 보이는데 저게 주소록을 가지고 올때 정렬을 어떻게 할지 줄 수 있는 옵션이에요
그럼 이제 저 결과값을 가지고 String[]형으로 변경해서 showAlertList()메소드에 태워주면 !!
주소록이 Alert창으로 뜨게됩니다!
아! List의 Adapter을 아직 안적어뒀군요 코드볼께요
private class MessageListAdapter extends BaseAdapter {
private String[] messages;
public MessageListAdapter(String[] messages){
this.messages = messages;
}
@Override
public int getCount() {
return messages.length;
}
@Override
public String getItem(int position) {
return messages[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertview, ViewGroup parent) {
View view;
if(convertview == null) {
LayoutInflater inflater = LayoutInflater.from(getActivity());
view = inflater.inflate(R.layout.cell_list_item, null);
} else {
view = convertview;
}
if(view instanceof TextView) {
((TextView) view).setText(messages[position]);
}
return view;
}
}
BaseAdapter을 상속받아서 거의 아무것도 안했어요 생성자에 있는 message는 주소록 리스트겠져?
그리고 cell_list_item은 아까 위에서 보여줬던 TextView딸랑 하나 있는 layout에요
뭐 정말 별거 없네요 :)
그리고 주소록을 불러 올라면 퍼미션이 필요한데 해당 퍼미션은
<uses-permission android:name="android.permission.READ_CONTACTS" />
요거네요 이걸 매니페스트에 적어 두면되요
혹시 질문하실거나 도움될만한거 있으면 물어보세요 ~
앞으로 가끔올께요 :)