게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
android alert주소록 만들기
게시물ID : programmer_5842짧은주소 복사하기
작성자 : 뭐임마?!
추천 : 1
조회수 : 2362회
댓글수 : 1개
등록시간 : 2014/10/08 16:16:57
가입한지는 한참 됐는데 활동 안하다가 요즘 심심풀이로 어플을 만드는중인데 

자랑할 곳은 없고 ㅎㅎ 평소에 눈팅 즐겨하던 오유에 조금씩 자랑해볼라고요 혹시 어플 홍보가 될까봐 

어플에 대한 내용은 하나도 넣지 않았어요 


일단 완성품부터 볼께요  


주소록.png

 

 

이쁘네요 

 

그럼 일단 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" />

요거네요 이걸 매니페스트에 적어 두면되요


혹시 질문하실거나 도움될만한거 있으면 물어보세요 ~ 


앞으로 가끔올께요 :)

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호