一、在layout下创建TabHost的home.xml
<?xml version="1.0" encoding="utf-8"?> <TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/widget_layout_Blue" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> <LinearLayout android:id="@+id/widget_layout_red" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <AnalogClock android:id="@+id/widget36" android:layout_width="wrap_content" android:layout_height="wrap_content" > </AnalogClock> </LinearLayout> <LinearLayout android:id="@+id/widget_layout_green" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="这是第三个标签页" /> <RadioGroup android:id="@+id/widget43" android:layout_width="166px" android:layout_height="98px" android:orientation="vertical" > <RadioButton android:id="@+id/widget44" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RadioButton" > </RadioButton> <RadioButton android:id="@+id/widget45" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RadioButton" > </RadioButton> </RadioGroup> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost>
二、在layout下创建加载条的footer.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ProgressBar android:id="@+id/c81_forthBar" android:layout_width="50dp" android:layout_height="wrap_content" style="?android:attr/progressBarStyle" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" android:textSize="20sp" android:text="数据正在加载..." /> </LinearLayout>
三、在menu目录下添加menu文件addphone_menu.xml、chatting_menu.xml、phonebook_menu.xml、userapp_menu.xml , 文件内容一致
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > </menu>
四、在drawable目录下添加menu1h.png、menu1n.png和ic_tab_artists.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- When selected, use grey --> <item android:drawable="@drawable/menu1h" android:state_selected="true" /> <!-- When not selected, use white --> <item android:drawable="@drawable/menu1n" /> </selector>
五、在layout目录下创建icon.xml , 用于显示TabHost的图片和文字
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/icon" android:layout_width="30dip" android:layout_height="30dip" android:layout_gravity="center" android:layout_margin="0dip" /> <TextView android:id="@+id/tabsText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="1dip" android:text="" android:textSize="12dip" /> </LinearLayout>
六、在src目录下HomeActivity.java文件
package com.app.activity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TabHost; import android.widget.TabHost.OnTabChangeListener; import android.widget.TabHost.TabSpec; import android.widget.TextView; import com.app.R; @SuppressLint("NewApi") public class HomeActivity extends Activity { private TabHost mTabHost; private Menu myMenu; private int myMenuSettingTag; private ListView listView; private int number = 15;// 每次获取多少条数据 private int maxpage = 5;// 总共有多少页 private boolean loadfinish = true; private View footer; private SimpleAdapter adapter; private List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>(); private static final int myMenuResources[] = { R.menu.phonebook_menu, R.menu.addphone_menu, R.menu.chatting_menu, R.menu.userapp_menu };// 将menu添加到数组当中 private void setupTabHost() { // mTabHost = getTabHost();//继承TabActivity使用 , 4.0以后TabActivity过期, 不建议使用 setContentView(R.layout.home);// 继承Activity使用 mTabHost = (TabHost) this.findViewById(R.id.tabhost);// 继承Activity使用 mTabHost.setup(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // construct the tabhost setupTabHost(); mTabHost.setBackgroundColor(Color.argb(150, 22, 70, 150));// 设置tabhost的颜色 // 继承Activity使用 TabSpec tabSpec = mTabHost.newTabSpec("one"); // tabSpec.setIndicator("", // getResources().getDrawable(R.drawable.ic_tab_artists)); tabSpec.setIndicator(createTabView(mTabHost.getContext(), "", R.drawable.ic_tab_artists)); tabSpec.setContent(R.id.widget_layout_Blue); mTabHost.addTab(tabSpec); tabSpec = mTabHost.newTabSpec("two"); // tabSpec.setIndicator("", // getResources().getDrawable(R.drawable.ic_tab_artists)); tabSpec.setIndicator(createTabView(mTabHost.getContext(), "", R.drawable.ic_tab_artists)); tabSpec.setContent(R.id.widget_layout_red); mTabHost.addTab(tabSpec); tabSpec = mTabHost.newTabSpec("three"); // tabSpec.setIndicator("", // getResources().getDrawable(R.drawable.ic_tab_artists)); tabSpec.setIndicator(createTabView(mTabHost.getContext(), "", R.drawable.ic_tab_artists)); tabSpec.setContent(R.id.widget_layout_green); mTabHost.addTab(tabSpec); tabSpec = mTabHost.newTabSpec("four"); // tabSpec.setIndicator("", // getResources().getDrawable(R.drawable.ic_tab_artists)); tabSpec.setIndicator(createTabView(mTabHost.getContext(), "", R.drawable.ic_tab_artists)); tabSpec.setContent(R.id.widget_layout_green); mTabHost.addTab(tabSpec); /** // 继承TabActivity使用 LayoutInflater.from(this).inflate(R.layout.home, mTabHost.getTabContentView(), true); mTabHost.addTab(mTabHost.newTabSpec("one") // tabid .setIndicator("TTT",// tab名称 getResources().getDrawable(R.drawable.ic_tab_artists)) .setContent(R.id.widget_layout_Blue));// tab内容 mTabHost.addTab(mTabHost .newTabSpec("two") .setIndicator("AAA", getResources().getDrawable(R.drawable.ic_tab_artists)) .setContent(R.id.widget_layout_red)); mTabHost.addTab(mTabHost .newTabSpec("three") .setIndicator("BBB", getResources().getDrawable(R.drawable.ic_tab_artists)) .setContent(R.id.widget_layout_green)); **/ mTabHost.setCurrentTab(0);//默认显示第一个tab,可以不设 if (mTabHost.getCurrentTab() == 0) { show();//默认显示 } mTabHost.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { if (tabId.equals("one")) { myMenuSettingTag = 1; } if (tabId.equals("two")) { myMenuSettingTag = 2; } if (tabId.equals("three")) { myMenuSettingTag = 3; } if (tabId.equals("four")) { myMenuSettingTag = 4; } if (myMenu != null) { onCreateOptionsMenu(myMenu); } } }); } // 通过MenuInflater过滤器动态加入MENU public boolean onCreateOptionsMenu(Menu menu) { myMenu = menu; myMenu.clear(); MenuInflater inflater = getMenuInflater(); switch (myMenuSettingTag) { case 1: inflater.inflate(myMenuResources[0], menu); menu.close(); break; case 2: inflater.inflate(myMenuResources[1], menu); menu.close(); break; case 3: inflater.inflate(myMenuResources[2], menu); menu.close(); default: inflater.inflate(myMenuResources[0], menu); menu.close(); break; } return super.onCreateOptionsMenu(menu); } /** * 显示列表数据 */ public void show() { footer = getLayoutInflater().inflate(R.layout.footer, null); listView = (ListView) this.findViewById(R.id.listView); listView.setOnScrollListener(new ScrollListener()); data = load(0, 0);// 第一次加载数据 adapter = new SimpleAdapter(this, data, R.layout.item, new String[] { "name", "phone", "amount" }, new int[] { R.id.name, R.id.phone, R.id.amount }); listView.addFooterView(footer);// 添加页脚(放在ListView最后) listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub } }); //为ListView添加屏幕的触摸事件 , 如果不加此方法, ListView列表左右滑动无效 listView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { detector.onTouchEvent(event); return onTouchEvent(event); } }); listView.removeFooterView(footer); } private final class ScrollListener implements OnScrollListener { public void onScrollStateChanged(AbsListView view, int scrollState) { Log.i("MainActivity", "onScrollStateChanged(scrollState=" + scrollState + ")"); } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Log.i("MainActivity", "onScroll(firstVisibleItem=" + firstVisibleItem + ",visibleItemCount=" + visibleItemCount + ",totalItemCount=" + totalItemCount + ")"); final int loadtotal = totalItemCount; int lastItemid = listView.getLastVisiblePosition();// 获取当前屏幕最后Item的ID if ((lastItemid + 1) == totalItemCount) {// 达到数据的最后一条记录 if (totalItemCount > 0) { // 当前页 int currentpage = totalItemCount % number == 0 ? totalItemCount / number : totalItemCount / number + 1; int nextpage = currentpage + 1;// 下一页 if (nextpage <= maxpage && loadfinish) {// 加载完了加载下一页 loadfinish = false; listView.addFooterView(footer); new Thread(new Runnable() { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } List<HashMap<String, Object>> result = load( loadtotal, number); handler.sendMessage(handler.obtainMessage(100, result)); } }).start(); } } } } } Handler handler = new Handler() { public void handleMessage(Message msg) { data.addAll((List<HashMap<String, Object>>) msg.obj); adapter.notifyDataSetChanged();// 告诉ListView数据已经发生改变,要求ListView更新界面显示 if (listView.getFooterViewsCount() > 0) listView.removeFooterView(footer); loadfinish = true; } }; /** * 测试数据 * * @param loadtotal * @param number * @return */ public List<HashMap<String, Object>> load(int loadtotal, int number) { List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < 15; i++) { HashMap<String, Object> item = new HashMap<String, Object>(); item.put("name", "xxx"); item.put("phone", "jjj"); item.put("amount", "vvv"); item.put("id", "ooo"); data.add(item); } return data; } /** * 当前页面索引 */ int i = 0; /** * 屏幕的触摸事件,如果返回true 则消耗掉这个事件 返回false则未消耗传递下去 */ @Override public boolean onTouchEvent(MotionEvent event) { int d = listView.getVisibility(); Log.i("DDD---", d + ""); i = mTabHost.getCurrentTab(); detector.onTouchEvent(event); return super.onTouchEvent(event); } private GestureDetector detector = new GestureDetector( new GestureDetector.SimpleOnGestureListener() { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if ((e2.getRawX() - e1.getRawX()) > 80) {// 滑动的距离 showNext();// 向右滑动,显示下一个页面 return true; } if ((e1.getRawX() - e2.getRawX()) > 80) { showPre();// 向左滑动,显示上一个页面 return true; } return super.onFling(e1, e2, velocityX, velocityY); } }); /** * 显示下一个页面 */ protected void showNext() { // 三元表达式控制3个页面的循环. mTabHost.setCurrentTab(i = i == 3 ? i = 0 : ++i); Log.i("kennet", i + ""); } /** * 显示前一个页面 */ protected void showPre() { // 三元表达式控制3个页面的循环. mTabHost.setCurrentTab(i = i == 0 ? i = 3 : --i); } private View createTabView(String name) { // View tabView = getLayoutInflater().inflate(R.layout.tab, null); LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setBackgroundColor(0xFFFFFF); TextView textView = new TextView(this); textView.setText(name); textView.setBackgroundResource(R.drawable.ic_tab_artists); textView.setTextColor(0xFFFFFF); textView.setTextSize(18.0f); textView.setGravity(Gravity.CENTER); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); linearLayout.addView(textView, params); return linearLayout; } private static View createTabView(final Context context, final String text, int drawable) { View view = LayoutInflater.from(context).inflate(R.layout.icon, null); TextView tv = (TextView) view.findViewById(R.id.tabsText); tv.setText(text);// 名称 ImageView iv = (ImageView) view.findViewById(R.id.icon); iv.setImageResource(drawable);// 背景图 return view; } }