1. 程式人生 > >Android 簡易手機通訊錄(原始碼)

Android 簡易手機通訊錄(原始碼)

  簡易手機通訊錄

一:功能模組

  1.主介面,通過listview 展示所有聯絡人資訊,並在沒有聯絡人時給出友好提示

  2.主介面.顯示最近檢視的某個聯絡人資訊

  3.主介面,可以長按某聯絡人項,彈出選單,刪除該聯絡人;刪除聯絡人後,在手機通知欄彈出資訊給使用者提示

  4.主介面選擇分組,可以檢視所有聯絡人,也可以只檢視某一分組的聯絡人

  5.點選主介面的某聯絡人,可以進入聯絡人詳情介面,檢視聯絡人各詳細資訊,並可修改聯絡人各資訊

    聯絡人的性別和所在分組可通過下拉選單選擇;長按電話號碼,可以進入撥打電話功能

    修改聯絡人資訊後,跳轉回到主介面,並使用

Toast給予使用者提示

  6.主介面選單欄可以新增新聯絡人,關於等功能

  7.能在聯絡人詳情介面,動態增加多個聯絡電話,並儲存到資料庫中

效果圖展示:

    

     

 

 原始碼下載地址:

 

專案回顧:

  1.scrollview巢狀listview產生的滑動衝突(recyclerview)

  解決方案:

        listView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            
public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP){ //點選listview裡面滾動停止時,scrollview攔截listview的觸屏事件,就是scrollview該滾動了 scrollView.requestDisallowInterceptTouchEvent(false); }else{
//當listview在滾動時,不攔截listview的滾動事件;就是listview可以滾動, scrollView.requestDisallowInterceptTouchEvent(true); } return false; } });

 

  2.關於listview 中 EditText  監聽

        //1.在設定text前,先移除監聽
        if (viewHodler.number.getTag() instanceof TextWatcher) {
            viewHodler.number.removeTextChangedListener((TextWatcher) viewHodler.number.getTag());
        }
        if (TextUtils.isEmpty(phoneNumber.getNumber())){
            viewHodler.number.setText("");
        }else {
            viewHodler.number.setText(phoneNumber.getNumber());
        }
        //2.新建監聽類
        TextWatcher watcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                if (TextUtils.isEmpty(s)) {
                    phoneNumber.setNumber(null);
                    finalViewHodler.imageView.setVisibility(View.GONE);
                } else {
                    phoneNumber.setNumber(s.toString());
                    finalViewHodler.imageView.setVisibility(View.VISIBLE);
                }
                Log.e("tag", "afterTextChanged: " +s.toString() );
            }
        };
        //3.新增監聽器
        viewHodler.number.addTextChangedListener(watcher);
        viewHodler.number.setTag(watcher);

    3.獲取listview 中所有 Editext 的值

      思路:在介面卡中建立HashMap  在getview()方法中 儲存所有的Editext     key = position   value = editext

      然後在通過HashMap  獲取就行了

private HashMap<Integer,EditText> edMap;

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        PhoneAdapter.ViewHodler viewHodler = null;

        if (convertView == null) {
            viewHodler = new PhoneAdapter.ViewHodler();
            convertView = LayoutInflater.from(context).inflate(R.layout.phone_list_item, null, false);
            viewHodler.spinner = convertView.findViewById(R.id.pnone_spinner);
            viewHodler.number = convertView.findViewById(R.id.pnone_number);
            viewHodler.imageView = convertView.findViewById(R.id.imageView4);
            //put 儲存
            edMap.put(position,viewHodler.number);
            spMap.put(position,viewHodler.spinner);
            convertView.setTag(viewHodler);
        } else {
            viewHodler = (PhoneAdapter.ViewHodler) convertView.getTag();
            edMap.put(position,viewHodler.number);
            spMap.put(position,viewHodler.spinner);

        }

    4.撥打電話功能的坑

    public void call(String telPhone){
        if(checkReadPermission(Manifest.permission.CALL_PHONE,REQUEST_CALL_PERMISSION)){
            //要在telPhone前加上字串tel: 
            Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:" + telPhone));
            startActivity(intent);
        }
    }

  不讓你就會見到下圖: