Android项目Tab类型主界面大总结

Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结。目前写了:

1、传统的ViewPager实现

2、FragmentManager+Fragment实现

3、ViewPager+FragmentPagerAdapter实现

4、TabPageIndicator+ViewPager+FragmentPagerAdapter

1、传统的ViewPager实现

主要就是ViewPager+ViewAdapter这个还是比较常见的,就不多说了

效果图:

代码:

[java] view plaincopy

  1. package com.example.mainframework02;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.support.v4.view.PagerAdapter;
  7. import android.support.v4.view.ViewPager;
  8. import android.support.v4.view.ViewPager.OnPageChangeListener;
  9. import android.view.LayoutInflater;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.ImageButton;
  13. import android.widget.ImageView;
  14. import android.widget.LinearLayout;
  15. public class TraditionalViewPagerAcvitity extends Activity
  16. {
  17. /**
  18. * ViewPager
  19. */
  20. private ViewPager mViewPager;
  21. /**
  22. * ViewPager的适配器
  23. */
  24. private PagerAdapter mAdapter;
  25. private List<View> mViews;
  26. private LayoutInflater mInflater;
  27. private int currentIndex;
  28. /**
  29. * 底部四个按钮
  30. */
  31. private LinearLayout mTabBtnWeixin;
  32. private LinearLayout mTabBtnFrd;
  33. private LinearLayout mTabBtnAddress;
  34. private LinearLayout mTabBtnSettings;
  35. @Override
  36. protected void onCreate(Bundle savedInstanceState)
  37. {
  38. super.onCreate(savedInstanceState);
  39. setContentView(R.layout.activity_main);
  40. mInflater = LayoutInflater.from(this);
  41. mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
  42. /**
  43. * 初始化View
  44. */
  45. initView();
  46. mViewPager.setAdapter(mAdapter);
  47. mViewPager.setOnPageChangeListener(new OnPageChangeListener()
  48. {
  49. @Override
  50. public void onPageSelected(int position)
  51. {
  52. resetTabBtn();
  53. switch (position)
  54. {
  55. case 0:
  56. ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
  57. .setImageResource(R.drawable.tab_weixin_pressed);
  58. break;
  59. case 1:
  60. ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
  61. .setImageResource(R.drawable.tab_find_frd_pressed);
  62. break;
  63. case 2:
  64. ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
  65. .setImageResource(R.drawable.tab_address_pressed);
  66. break;
  67. case 3:
  68. ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
  69. .setImageResource(R.drawable.tab_settings_pressed);
  70. break;
  71. }
  72. currentIndex = position;
  73. }
  74. @Override
  75. public void onPageScrolled(int arg0, float arg1, int arg2)
  76. {
  77. }
  78. @Override
  79. public void onPageScrollStateChanged(int arg0)
  80. {
  81. }
  82. });
  83. }
  84. protected void resetTabBtn()
  85. {
  86. ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
  87. .setImageResource(R.drawable.tab_weixin_normal);
  88. ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
  89. .setImageResource(R.drawable.tab_find_frd_normal);
  90. ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
  91. .setImageResource(R.drawable.tab_address_normal);
  92. ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
  93. .setImageResource(R.drawable.tab_settings_normal);
  94. }
  95. private void initView()
  96. {
  97. mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
  98. mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
  99. mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
  100. mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
  101. mViews = new ArrayList<View>();
  102. View first = mInflater.inflate(R.layout.main_tab_01, null);
  103. View second = mInflater.inflate(R.layout.main_tab_02, null);
  104. View third = mInflater.inflate(R.layout.main_tab_03, null);
  105. View fourth = mInflater.inflate(R.layout.main_tab_04, null);
  106. mViews.add(first);
  107. mViews.add(second);
  108. mViews.add(third);
  109. mViews.add(fourth);
  110. mAdapter = new PagerAdapter()
  111. {
  112. @Override
  113. public void destroyItem(ViewGroup container, int position, Object object)
  114. {
  115. container.removeView(mViews.get(position));
  116. }
  117. @Override
  118. public Object instantiateItem(ViewGroup container, int position)
  119. {
  120. View view = mViews.get(position);
  121. container.addView(view);
  122. return view;
  123. }
  124. @Override
  125. public boolean isViewFromObject(View arg0, Object arg1)
  126. {
  127. return arg0 == arg1;
  128. }
  129. @Override
  130. public int getCount()
  131. {
  132. return mViews.size();
  133. }
  134. };
  135. }
  136. }

评价:所有的代码都集中在一个Activity中,显得代码比较乱。

2、FragmentManager+Fragment实现

主要利用了Fragment在主内容界面对Fragment的add,hide等事务操作。

效果图:

代码:

主Activity

[java] view plaincopy

  1. package com.example.mainframework02.fragment;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.app.FragmentManager;
  5. import android.app.FragmentTransaction;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.ImageButton;
  10. import android.widget.LinearLayout;
  11. import com.example.mainframework02.R;
  12. public class FragmentMainActivity extends Activity implements OnClickListener
  13. {
  14. private MainTab02 mTab02;
  15. private MainTab01 mTab01;
  16. private MainTab03 mTab03;
  17. private MainTab04 mTab04;
  18. /**
  19. * 底部四个按钮
  20. */
  21. private LinearLayout mTabBtnWeixin;
  22. private LinearLayout mTabBtnFrd;
  23. private LinearLayout mTabBtnAddress;
  24. private LinearLayout mTabBtnSettings;
  25. /**
  26. * 用于对Fragment进行管理
  27. */
  28. private FragmentManager fragmentManager;
  29. @SuppressLint("NewApi")
  30. @Override
  31. protected void onCreate(Bundle savedInstanceState)
  32. {
  33. super.onCreate(savedInstanceState);
  34. setContentView(R.layout.fragment_main);
  35. initViews();
  36. fragmentManager = getFragmentManager();
  37. setTabSelection(0);
  38. }
  39. private void initViews()
  40. {
  41. mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
  42. mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
  43. mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
  44. mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
  45. mTabBtnWeixin.setOnClickListener(this);
  46. mTabBtnFrd.setOnClickListener(this);
  47. mTabBtnAddress.setOnClickListener(this);
  48. mTabBtnSettings.setOnClickListener(this);
  49. }
  50. @Override
  51. public void onClick(View v)
  52. {
  53. switch (v.getId())
  54. {
  55. case R.id.id_tab_bottom_weixin:
  56. setTabSelection(0);
  57. break;
  58. case R.id.id_tab_bottom_friend:
  59. setTabSelection(1);
  60. break;
  61. case R.id.id_tab_bottom_contact:
  62. setTabSelection(2);
  63. break;
  64. case R.id.id_tab_bottom_setting:
  65. setTabSelection(3);
  66. break;
  67. default:
  68. break;
  69. }
  70. }
  71. /**
  72. * 根据传入的index参数来设置选中的tab页。
  73. *
  74. */
  75. @SuppressLint("NewApi")
  76. private void setTabSelection(int index)
  77. {
  78. // 重置按钮
  79. resetBtn();
  80. // 开启一个Fragment事务
  81. FragmentTransaction transaction = fragmentManager.beginTransaction();
  82. // 先隐藏掉所有的Fragment,以防止有多个Fragment显示在界面上的情况
  83. hideFragments(transaction);
  84. switch (index)
  85. {
  86. case 0:
  87. // 当点击了消息tab时,改变控件的图片和文字颜色
  88. ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
  89. .setImageResource(R.drawable.tab_weixin_pressed);
  90. if (mTab01 == null)
  91. {
  92. // 如果MessageFragment为空,则创建一个并添加到界面上
  93. mTab01 = new MainTab01();
  94. transaction.add(R.id.id_content, mTab01);
  95. } else
  96. {
  97. // 如果MessageFragment不为空,则直接将它显示出来
  98. transaction.show(mTab01);
  99. }
  100. break;
  101. case 1:
  102. // 当点击了消息tab时,改变控件的图片和文字颜色
  103. ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
  104. .setImageResource(R.drawable.tab_find_frd_pressed);
  105. if (mTab02 == null)
  106. {
  107. // 如果MessageFragment为空,则创建一个并添加到界面上
  108. mTab02 = new MainTab02();
  109. transaction.add(R.id.id_content, mTab02);
  110. } else
  111. {
  112. // 如果MessageFragment不为空,则直接将它显示出来
  113. transaction.show(mTab02);
  114. }
  115. break;
  116. case 2:
  117. // 当点击了动态tab时,改变控件的图片和文字颜色
  118. ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
  119. .setImageResource(R.drawable.tab_address_pressed);
  120. if (mTab03 == null)
  121. {
  122. // 如果NewsFragment为空,则创建一个并添加到界面上
  123. mTab03 = new MainTab03();
  124. transaction.add(R.id.id_content, mTab03);
  125. } else
  126. {
  127. // 如果NewsFragment不为空,则直接将它显示出来
  128. transaction.show(mTab03);
  129. }
  130. break;
  131. case 3:
  132. // 当点击了设置tab时,改变控件的图片和文字颜色
  133. ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
  134. .setImageResource(R.drawable.tab_settings_pressed);
  135. if (mTab04 == null)
  136. {
  137. // 如果SettingFragment为空,则创建一个并添加到界面上
  138. mTab04 = new MainTab04();
  139. transaction.add(R.id.id_content, mTab04);
  140. } else
  141. {
  142. // 如果SettingFragment不为空,则直接将它显示出来
  143. transaction.show(mTab04);
  144. }
  145. break;
  146. }
  147. transaction.commit();
  148. }
  149. /**
  150. * 清除掉所有的选中状态。
  151. */
  152. private void resetBtn()
  153. {
  154. ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
  155. .setImageResource(R.drawable.tab_weixin_normal);
  156. ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
  157. .setImageResource(R.drawable.tab_find_frd_normal);
  158. ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
  159. .setImageResource(R.drawable.tab_address_normal);
  160. ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
  161. .setImageResource(R.drawable.tab_settings_normal);
  162. }
  163. /**
  164. * 将所有的Fragment都置为隐藏状态。
  165. *
  166. * @param transaction
  167. *            用于对Fragment执行操作的事务
  168. */
  169. @SuppressLint("NewApi")
  170. private void hideFragments(FragmentTransaction transaction)
  171. {
  172. if (mTab01 != null)
  173. {
  174. transaction.hide(mTab01);
  175. }
  176. if (mTab02 != null)
  177. {
  178. transaction.hide(mTab02);
  179. }
  180. if (mTab03 != null)
  181. {
  182. transaction.hide(mTab03);
  183. }
  184. if (mTab04 != null)
  185. {
  186. transaction.hide(mTab04);
  187. }
  188. }
  189. }

各个TabFragment,一共四个TabFragment,下面贴出两个,基本都一样。

[java] view plaincopy

  1. package com.example.mainframework02.fragment;
  2. import android.annotation.SuppressLint;
  3. import android.app.Fragment;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. @SuppressLint("NewApi")
  9. public class MainTab01 extends Fragment
  10. {
  11. @Override
  12. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  13. {
  14. return inflater.inflate(com.example.mainframework02.R.layout.main_tab_01, container, false);
  15. }
  16. }

[java] view plaincopy

  1. package com.example.mainframework02.fragment;
  2. import android.annotation.SuppressLint;
  3. import android.app.Fragment;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import com.example.mainframework02.R;
  9. @SuppressLint("NewApi")
  10. public class MainTab02 extends Fragment
  11. {
  12. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  13. {
  14. return inflater.inflate(R.layout.main_tab_02, container, false);
  15. }
  16. }

评价:每个Fragment中的控件的处理,都是独立到各自的类中,相对来说主Activity简化了不少,可惜没有左右滑动的效果了。

3、ViewPager+Fragment实现

主要通过ViewPager和FragmentPagerAdapter一起来实现。

效果图:

代码:

主Activity

[java] view plaincopy

  1. package com.example.mainframework03;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.os.Bundle;
  5. import android.support.v4.app.Fragment;
  6. import android.support.v4.app.FragmentActivity;
  7. import android.support.v4.app.FragmentPagerAdapter;
  8. import android.support.v4.view.ViewPager;
  9. import android.support.v4.view.ViewPager.OnPageChangeListener;
  10. import android.widget.ImageButton;
  11. import android.widget.LinearLayout;
  12. public class MainActivity extends FragmentActivity
  13. {
  14. private ViewPager mViewPager;
  15. private FragmentPagerAdapter mAdapter;
  16. private List<Fragment> mFragments = new ArrayList<Fragment>();
  17. /**
  18. * 底部四个按钮
  19. */
  20. private LinearLayout mTabBtnWeixin;
  21. private LinearLayout mTabBtnFrd;
  22. private LinearLayout mTabBtnAddress;
  23. private LinearLayout mTabBtnSettings;
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState)
  26. {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29. mViewPager = (ViewPager) findViewById(R.id.id_viewpager);
  30. initView();
  31. mAdapter = new FragmentPagerAdapter(getSupportFragmentManager())
  32. {
  33. @Override
  34. public int getCount()
  35. {
  36. return mFragments.size();
  37. }
  38. @Override
  39. public Fragment getItem(int arg0)
  40. {
  41. return mFragments.get(arg0);
  42. }
  43. };
  44. mViewPager.setAdapter(mAdapter);
  45. mViewPager.setOnPageChangeListener(new OnPageChangeListener()
  46. {
  47. private int currentIndex;
  48. @Override
  49. public void onPageSelected(int position)
  50. {
  51. resetTabBtn();
  52. switch (position)
  53. {
  54. case 0:
  55. ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
  56. .setImageResource(R.drawable.tab_weixin_pressed);
  57. break;
  58. case 1:
  59. ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
  60. .setImageResource(R.drawable.tab_find_frd_pressed);
  61. break;
  62. case 2:
  63. ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
  64. .setImageResource(R.drawable.tab_address_pressed);
  65. break;
  66. case 3:
  67. ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
  68. .setImageResource(R.drawable.tab_settings_pressed);
  69. break;
  70. }
  71. currentIndex = position;
  72. }
  73. @Override
  74. public void onPageScrolled(int arg0, float arg1, int arg2)
  75. {
  76. }
  77. @Override
  78. public void onPageScrollStateChanged(int arg0)
  79. {
  80. }
  81. });
  82. }
  83. protected void resetTabBtn()
  84. {
  85. ((ImageButton) mTabBtnWeixin.findViewById(R.id.btn_tab_bottom_weixin))
  86. .setImageResource(R.drawable.tab_weixin_normal);
  87. ((ImageButton) mTabBtnFrd.findViewById(R.id.btn_tab_bottom_friend))
  88. .setImageResource(R.drawable.tab_find_frd_normal);
  89. ((ImageButton) mTabBtnAddress.findViewById(R.id.btn_tab_bottom_contact))
  90. .setImageResource(R.drawable.tab_address_normal);
  91. ((ImageButton) mTabBtnSettings.findViewById(R.id.btn_tab_bottom_setting))
  92. .setImageResource(R.drawable.tab_settings_normal);
  93. }
  94. private void initView()
  95. {
  96. mTabBtnWeixin = (LinearLayout) findViewById(R.id.id_tab_bottom_weixin);
  97. mTabBtnFrd = (LinearLayout) findViewById(R.id.id_tab_bottom_friend);
  98. mTabBtnAddress = (LinearLayout) findViewById(R.id.id_tab_bottom_contact);
  99. mTabBtnSettings = (LinearLayout) findViewById(R.id.id_tab_bottom_setting);
  100. MainTab01 tab01 = new MainTab01();
  101. MainTab02 tab02 = new MainTab02();
  102. MainTab03 tab03 = new MainTab03();
  103. MainTab04 tab04 = new MainTab04();
  104. mFragments.add(tab01);
  105. mFragments.add(tab02);
  106. mFragments.add(tab03);
  107. mFragments.add(tab04);
  108. }
  109. }

还有4个TabFragment,下面贴一个,四个基本一样

[java] view plaincopy

  1. package com.example.mainframework03;
  2. import android.os.Bundle;
  3. import android.support.v4.app.Fragment;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. public class MainTab01 extends Fragment
  8. {
  9. @Override
  10. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  11. {
  12. return  inflater.inflate(R.layout.main_tab_01, container, false);
  13. }
  14. }

评价:实现效果和第一种效果一模一样,每个Fragment独自处理自己内部的逻辑,代码整洁很多,并且支持左右滑动。感觉是第一种和第二种的结合版本。

4、TabPageIndicator+ViewPager+FragmentPagerAdapter

实现方式和3是一致的,但是使用了TabPageIndicator作为tab的指示器,效果还是不错的,这个之前写过,就不再贴代码了。

效果图:

参考:Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架

好了,就总结了这么多,肯定还有很多别的实现方式,大家可以留言,有时间会继续完善这篇总结的。

第一种和第二种的源码

第三种方式的源码

时间: 2024-11-08 20:42:15

Android项目Tab类型主界面大总结的相关文章

Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24740977 Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结.目前写了: 1.传统的ViewPager实现 2.FragmentManager+Fragment实现 3.ViewPager+FragmentPagerAdapter实现 4.TabPageIndicator+ViewPager+FragmentPagerAdapter 1

(转载)Android项目tab类型主界面总结

Android实现tab类型的界面方式主要有以下几种: 1.传统的ViewPager实现(ViewPager+ViewAdapter) 2.FragmentManager+Fragment实现 3.ViewPager+FragmentPagerAdapter实现 4.TabPageIndicator+ViewPager+FragmentPagerAdapter 1.传统的ViewPager实现 ViewPager+ViewAdapter package com.example.mainframe

Android Tab类型主界面 Fragment+TabPageIndicator+ViewPager

文章地址: Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager 1.使用ViewPager + PagerAdapter 每个页面的内容都在一个Activity中,维护起来会比较麻烦 2.FragmentManager + Fragment 每个页面的内容分开,但是只能点击按钮换页 3.ViewPager + FragmentPagerAdapter 综合前两种方式,比较好 4.TabPageIndicator + ViewPager

(转)Android项目重构之路:界面篇

在前一篇文章<Android项目重构之路:架构篇>中已经简单说明了项目的架构,将项目分为了四个层级:模型层.接口层.核心层.界面层.其中,最上层的界面,是变化最频繁的一个层面,也是最复杂最容易出问题的一个层面,如果规划不好,很容易做着做着,又乱成一团了. 要规划好界面层,至少应该遵循几条基本的原则: 保持规范性:定义好开发规范,包括书写规范.命名规范.注释规范等,并按照规范严格执行: 保持单一性:布局就只做布局,内容就只做内容,各自分离好:每个方法.每个类,也只做一件事情: 保持简洁性:保持代

安卓开发_慕课网_Fragment实现Tab(App主界面)

学习内容来自“慕课网” 这里用Fragment来实现APP主界面 思路: 底部横向排列4个LinearLayout,每个LinearLayout包含一个图片按钮和一个文字 1.默认显示第一个功能(微信)的图标为亮,其他三个为暗 2.点击相应的按钮,首先将所有的图标变暗,接着隐藏所有Fragment,再把点击的对应的Fragment显示出来,并把相应的图标显示亮 首先布局文件 activity_main.xml与ViewPager实现Tab的是不一样的 1 <LinearLayout xmlns:

安卓开发_慕课网_ViewPager实现Tab(App主界面)

学习内容来自“慕课网” 网站上一共有4种方法来实现APP主界面的TAB方法 这里学习第一种 ViewPager实现Tab 布局文件有7个, 主界面acitivity.layout 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_w

安卓开发_慕课网_ViewPager与FragmentPagerAdapter实现Tab实现Tab(App主界面)

学习内容来自“慕课网” ViewPager与FragmentPagerAdapter实现Tab 将这两种实现Tab的方法结合起来.效果就是可以拖动内容区域来改变相应的功能图标亮暗 思路: Fragment作为内容区域 点击功能按钮,想将所有的图标变为暗色图标,再调用相应的Fragment,并使对应的图标变亮 效果图: 布局文件部分 activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/

Android子线程更新主界面

学习什么的还是要真正的有应用,有需求才能在最短的时间里面牢牢掌握一项技术. 今天就是这样的,产品一个需求下来,十万火急啊.然后之前只稍稍接触过,只能硬着头皮上了.最后牢牢地掌握了最简单的Handler技术,闲话不多说了! 每一个做android的人都知道,android的内存可谓是存M存金啊!然后我们自然知道,而且Google在设计的时候也充分的考虑到了这一点,所以,我们的UIThread里面一般不做耗时的工作,比如请求网络,比如执行一些比较耗时的逻辑,比如比如加载图片,比如,哦,暂时只碰到过这

[应用妹 --第二篇 主界面Tab搭建] android应用市场之快速开发

主界面布局如下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:la