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;
}
};
};
}