通讯录之FragMent的应用实列

FragMent在安卓3.0版本后引用进来,其实就相当于Activity的一个 片段,可以不用在清单文件中配置,所以使用非常方便。
mtab那里我就不多说了,慕课网那里有相应的教程。简单来说呢,就是创建一个类,然后继承FargMent,fargment也要有对应的XML文件,在onCreateView里把布局文件加载进来,这里呢是通讯录里的一个联系人模块,在通讯录中我用了四个fragment,分别是拨号界面,通话记录,联系人,还有短信,在一个MainActivity中动态的加载进去。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

  <com.huang.readsystemcontacts.view.ClearEditText 
      android:id="@+id/filter_edit"
        android:layout_marginTop="5dp"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/search_bar_edit_selector"
        android:drawableLeft="@drawable/search_bar_icon_normal"
        android:hint="@string/search"
        android:singleLine="true"
        android:textSize="15.0dip"       


      />
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >



        <ListView
            android:id="@+id/address_list_view"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center"
            android:divider="@null" >
        </ListView>

        <TextView
            android:id="@+id/dialog"
            android:layout_width="80.0dip"
            android:layout_height="80.0dip"
            android:layout_gravity="center"
            android:background="@drawable/show_head_toast_bg"
            android:gravity="center"
            android:textColor="#ffffffff"
            android:textSize="30.0dip"
            android:visibility="invisible" />

        <com.huang.readsystemcontacts.view.SideBar
            android:id="@+id/sidrbar"
            android:layout_width="30.0dip"
            android:layout_height="fill_parent"
            android:layout_gravity="right|center" />
    </FrameLayout>

</LinearLayout>

布局预览图,可以忽略索引条和搜索框

在Fragment中把布局加载进来

package com.huang.readsystemcontacts2;

import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.TextView;

import com.huang.readsystemcontacts.R;
import com.huang.readsystemcontacts.adpter.SortAdapter;
import com.huang.readsystemcontacts.bean.Contactbean;
import com.huang.readsystemcontacts.dao.Contact;
import com.huang.readsystemcontacts.view.ClearEditText;
import com.huang.readsystemcontacts.view.SideBar;
import com.huang.readsystemcontacts.view.SideBar.OnTouchingLetterChangedListener;
import com.huang.readsystemcontacts2.util.CharacterParser;
import com.huang.readsystemcontacts2.util.ContactSort;

public class AddressFragment extends Fragment {
    private ListView mlistView;
    private Contact contact;
    private List<Contactbean> contacts;
    private SideBar sideBar;
    private Contactbean contactbean;
    private SortAdapter adapter;
    // private MyAddressAdapter adapter;
    private View view;
    private TextView dialog;
    private ClearEditText mClearEditText;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.address_frament, null);
    }

    @SuppressLint("NewApi")
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        super.onViewCreated(view, savedInstanceState);
        this.view = view;
        // 初始化控件
        initView();
        // 初始化数据
        initData();
        mClearEditText.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                filterData(s.toString());
            }

            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub

            }

            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }
        });

        // 设置右侧触摸监听
        sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {

            public void onTouchingLetterChanged(String s) {
                // 该字母首次出现的位置
                int position = adapter.getPositionForSection(s.charAt(0));
                if (position != -1) {
                    mlistView.setSelection(position);
                }
            }
        });

        mlistView.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
                        + contacts.get(position).getNumber()));
                startActivity(intent);
            }
        });

        // 设置ListView条目的点击事件
        mlistView.setOnItemLongClickListener(new OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> parent, View view,
                    final int position, long id) {
                // 弹出一个对话框
                AlertDialog.Builder builder = new AlertDialog.Builder(
                        getActivity());
                contactbean = contacts.get(position);
                // 设置选项框的标题
                builder.setTitle(contactbean.getName() + "\n"
                        + contactbean.getNumber());
                // 设置对话框的条目
                builder.setItems(R.array.thread_menu,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                Intent intent;
                                switch (which) {
                                case 0:
                                    // 呼叫联系人
                                    intent = new Intent(Intent.ACTION_CALL, Uri
                                            .parse("tel:"
                                                    + contactbean.getNumber()));
                                    startActivity(intent);
                                    break;
                                case 1:
                                    // 向联系人发送短信
                                    intent = new Intent(Intent.ACTION_VIEW);
                                    intent.putExtra("address",
                                            contactbean.getNumber());
                                    intent.putExtra("sms_body", "");
                                    intent.setType("vnd.android-dir/mms-sms");
                                    getActivity().startActivity(intent);
                                    break;
                                case 2:
                                    // 发送联系人名字 和号码
                                    intent = new Intent();
                                    intent.setAction("android.intent.action.SEND");
                                    intent.addCategory(Intent.CATEGORY_DEFAULT);
                                    intent.setType("text/plain");
                                    intent.putExtra(Intent.EXTRA_TEXT, "姓名::"
                                            + contactbean.getName() + "\n"
                                            + "号码:" + contactbean.getNumber());
                                    startActivity(intent);
                                    break;
                                case 3:
                                    String name = contactbean.getName();
                                    String number = contactbean.getNumber();
                                    String[] info = new String[] { name, number };
                                    intent = new Intent(getActivity(),
                                            ContactDetails.class);
                                    Bundle bundle = new Bundle();
                                    bundle.putStringArray("info", info);

                                    intent.putExtras(bundle);
                                    startActivity(intent);
                                    break;
                                case 4:
                                    // 发送邮件
                                    intent = new Intent(
                                            android.content.Intent.ACTION_SEND);
                                    // 文本格式
                                    intent.setType("text/plain");
                                    // 对方邮件地址
                                    intent.putExtra(
                                            android.content.Intent.EXTRA_EMAIL,
                                            "");
                                    // 标题内容
                                    intent.putExtra(
                                            android.content.Intent.EXTRA_SUBJECT,
                                            "");
                                    // 邮件文本内容
                                    intent.putExtra(
                                            android.content.Intent.EXTRA_TEXT,
                                            "");
                                    getActivity().startActivity(
                                            Intent.createChooser(intent,
                                                    "Choose Email Client"));
                                    break;
                                case 5:
                                    // 删除联系人
                                    Contact contact = new Contact();
                                    contact.deleteContact(getActivity(),
                                            contactbean.getId());
                                    contacts.remove(position);// 移除已经删除的联系人条目
                                    adapter.notifyDataSetChanged();// 通知适配器删除条目
                                    break;
                                }
                            }
                        });
                builder.show();
                return true;
            }
        });

    }

    /**
     * 初始化控件
     */
    private void initView() {

        sideBar = (SideBar) view.findViewById(R.id.sidrbar);
        dialog = (TextView) view.findViewById(R.id.dialog);
        sideBar.setTextView(dialog);
        mClearEditText = (ClearEditText) view.findViewById(R.id.filter_edit);
        mlistView = (ListView) view.findViewById(R.id.address_list_view);
    }

    /**
     * 数据初始化
     */
    private void initData() {
        contact = new Contact();
        contactbean = new Contactbean();
        contacts = new ArrayList<Contactbean>();
        contacts = contact.contact(getActivity());
        ContactSort.sortList(contacts, "selectPinyin", "ASC");
        adapter = new SortAdapter(getActivity(), contacts);
        mlistView.setAdapter(adapter);
    }   
}

package com.huang.readsystemcontacts.adpter;

import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.SectionIndexer;
import android.widget.TextView;

import com.huang.readsystemcontacts.R;
import com.huang.readsystemcontacts.bean.Contactbean;

public class SortAdapter extends BaseAdapter implements SectionIndexer{
private List contacts = null;
private Context mContext;

public SortAdapter(Context mContext, List<Contactbean> contacts ) {
    this.mContext = mContext;
    this.contacts  = contacts ;
}


public int getCount() {
    return this.contacts.size();
}

public Object getItem(int position) {
    return this.contacts.get(position);
}

public long getItemId(int position) {
    return position;
}

public View getView(final int position, View view, ViewGroup arg2) {
    ViewHolder viewHolder = null;
    final Contactbean contactbean = contacts.get(position);
    if (view == null) {
        viewHolder = new ViewHolder();
        view = LayoutInflater.from(mContext).inflate(R.layout.listview_item, null);
        viewHolder.tvname = (TextView) view.findViewById(R.id.tv_name);
        viewHolder.tvLetter = (TextView) view.findViewById(R.id.address_catalog);
        viewHolder .tv_number  = (TextView) view.findViewById(R.id.tv_number);
        viewHolder.photo = (ImageView) view.findViewById(R.id.id_photo);
        view.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }       viewHolder.tv_name.setText(this.contacts.get(position).getName());
    viewHolder.tv_number.setText(this.contacts.get(position).getNumber());
    if(contacts.get(position).getPhone()!=null){
        viewHolder.photo.setImageBitmap(contacts.get(position).getPhone());
    }
    else{
        Bitmap photo = BitmapFactory.decodeResource(mContext.getResources(),R.drawable.buddy_7_mb5ucom);
        viewHolder.photo.setImageBitmap(photo);
    }
    return view;

}

final static class ViewHolder {
    TextView tvname;
    TextView tv_number;
    ImageView photo;
}

listView的item

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/address_catalog"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#E0E0E0"
        android:textColor="#454545"
        android:layout_weight="1.0"
        android:paddingLeft="5dip"
        android:paddingTop="5dip"
        android:paddingBottom="5dip"
        android:text="A"/>
    <RelativeLayout
        android:id="@+id/id_relativelayout"
        android:layout_width="fill_parent"
        android:layout_height="60dp" >

        <LinearLayout
            android:id="@+id/id_linearlayout"
            android:layout_width="fill_parent"
            android:layout_height="60dp"
            android:orientation="horizontal" >

            <ImageView
                android:id="@+id/id_photo"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_gravity="center_vertical"
                android:layout_marginLeft="5dp"
                android:src="@drawable/iconfont_bohao" />

            <RelativeLayout
                android:id="@+id/id_relativelayout_1"
                android:layout_width="fill_parent"
                android:layout_height="60dp"
                android:layout_marginLeft="10dp"
                android:layout_weight="1" >

                <TextView
                    android:id="@+id/tv_name"
                    android:layout_width="wrap_content"
                    android:layout_height="30dp"
                    android:gravity="center_vertical"
                    android:text="名字"
                    android:textColor="#000000"
                    android:textSize="16sp" />

                <TextView
                    android:id="@+id/tv_number"
                    android:layout_width="wrap_content"
                    android:layout_height="30dp"
                    android:layout_below="@id/tv_name"
                    android:gravity="center_vertical"
                    android:hint="电话号码:"
                    android:paddingLeft="10dp"
                    android:textColor="#43000000"
                    android:textSize="14sp" />
            </RelativeLayout>


        </LinearLayout>
    </RelativeLayout>
</LinearLayout>

在MainActivity中把Fragment实例化,拿到FragmentManager fm;
//Fragment的管理器
fm = getFragmentManager();
//拿到开启事物的FragmentTransaction的对象
ft = fm.beginTransaction();
ft.replace(R.id.context, new CallKeyFragment());
ft.commit();

package com.huang.readsystemcontacts2;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Toast;

import com.huang.readsystemcontacts.R;
import com.huang.readsystemcontacts.view.ChangeText;

public class MainActivity extends FragmentActivity implements OnClickListener {
    private static final int APPEXIT = 1;
    private List<ChangeText> mTabIndicators ;
    private FragmentManager fm;
    private FragmentTransaction ft; 
    private ChangeText one ,two,three,four;
    private boolean isAppExit;
    private String tag ="0";
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //设置不显示导航栏图标
        getActionBar().setDisplayShowHomeEnabled(false);    
        initVew();      
        initData();
    }   
    /**
     * 初始化数据
     */
    private void initData() {
        mTabIndicators = new ArrayList<ChangeText>();

        /*将自定义ChangeText的对象 one ,two,three,
        four添加到List<ChangeText> mTabIndicators集合中
        */
        mTabIndicators.add(one);
        mTabIndicators.add(two);
        mTabIndicators.add(three);
        mTabIndicators.add(four);
        //设置自定义ChangeText对象 one ,two,three,four的点击事件
        one.setOnClickListener(this);
        two.setOnClickListener(this);
        three.setOnClickListener(this);
        four.setOnClickListener(this);
        one.setIconAlpha(1.0f);

        //Fragment的管理器
        fm = getFragmentManager();
        //拿到开启事物的FragmentTransaction的对象
        ft = fm.beginTransaction();
        ft.replace(R.id.context, new CallKeyFragment());
        ft.commit();        
    }
    /**
     * 初始化控件
     */
    private void initVew() {         
        one = (ChangeText) findViewById(R.id.id_indicator_one);     
        two = (ChangeText) findViewById(R.id.id_indicator_two);     
        three = (ChangeText) findViewById(R.id.id_indicator_third);     
        four = (ChangeText) findViewById(R.id.id_indicator_fort);   
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);      
        return super.onCreateOptionsMenu(menu);
    }

    /**
     * 设置菜单的图标显示
     */
    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        if (featureId == Window.FEATURE_ACTION_BAR && menu != null)
        {
            if (menu.getClass().getSimpleName().equals("MenuBuilder"))
            {
                try
                {
                    Method m = menu.getClass().getDeclaredMethod(
                            "setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
        return super.onMenuOpened(featureId, menu);
    }

    /**
     * 菜单的选择事件
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent intent;
        switch (item.getItemId()) {

        case R.id.share://分享界面
            intent  = new Intent();
            intent.setAction("android.intent.action.SEND");
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setType("text/plain");
            intent.putExtra(Intent.EXTRA_TEXT,"推荐您使用一款软件,名称为: "+getPackageName());
            startActivity(intent);  
            break;

        case R.id.add_contact://添加联系人界面
            intent = new Intent(MainActivity.this, AddContact.class);
            startActivity(intent);
            break;

        case R.id.setting://设置界面
            intent = new Intent(MainActivity.this, SettingActivity.class);
            startActivity(intent);
            break;          
        case R.id.scan://扫一扫界面
            intent = new Intent(MainActivity.this, ScannerActivity.class);
            startActivity(intent);
            break;  
        }
        return super.onOptionsItemSelected(item);
    }


    /**
     * 点击事件
     */
    public void onClick(View v) {
        clickTab(v);
    }
    /**
     * 重置mTab颜色
     */
    private void resetOtherTab() {
        for (int i = 0; i < mTabIndicators.size(); i++) {
            mTabIndicators.get(i).setIconAlpha(0);
        }
    }   

    /**
     * 
     * @param v
     */
    private void clickTab(View v) {
        resetOtherTab();
        switch (v.getId()) {
        case R.id.id_indicator_one:
            tag ="0";
            mTabIndicators.get(0).setIconAlpha(1.0f);
            ft = fm.beginTransaction();
            ft.replace(R.id.context, new CallKeyFragment());
            ft.commit();
            break;
        case R.id.id_indicator_two:
            tag ="1";
            mTabIndicators.get(1).setIconAlpha(1.0f);
            ft = fm.beginTransaction();
            ft.replace(R.id.context, new CallLogFragment());
            ft.commit();
            break;
        case R.id.id_indicator_third:
            tag ="2";
            mTabIndicators.get(2).setIconAlpha(1.0f);
            ft = fm.beginTransaction();
            ft.replace(R.id.context, new AddressFragment());
            ft.commit();
            break;
        case R.id.id_indicator_fort:
            tag ="3";
            mTabIndicators.get(3).setIconAlpha(1.0f);
            ft = fm.beginTransaction();
            ft.replace(R.id.context, new SmsFragment());
            ft.commit();
            break;
        }
    }   

    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (tag.equals("1") || tag.equals("2") || tag.equals("3")|| tag.equals("4")) {
                resetOtherTab();
                mTabIndicators.get(0).setIconAlpha(1.0f);
                //Fragment的管理器
                fm = getFragmentManager();
                //拿到开启事物的FragmentTransaction的对象
                ft = fm.beginTransaction();
                ft.replace(R.id.context, new CallKeyFragment());
                ft.commit();
                tag="0";
            } else if (tag.equals("0")) {
                appExit();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }


    /**
     * 退出app
     */
    public void appExit() {
        if (!isAppExit) {
            isAppExit = true;
            Toast.makeText(this, "再按一次,退出应用", Toast.LENGTH_SHORT).show();
            handler.sendEmptyMessageDelayed(APPEXIT, 2000);
        } else {
            // 2s内再次按back时,isExit= true,执行以下操作,app退出
            System.exit(0);
        }
    }
    Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case APPEXIT:
                isAppExit = false;
                break;
            default:
                break;
            }
        };
    };

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值