谷歌电子市场第1天
来源:互联网 发布:linux中cat命令详解 编辑:程序博客网 时间:2024/04/28 21:34
一.Actionbar和tabbar
1.actionbar的使用(4.0以上不用继承actionbarActivity)
①.Activity继承ActionBarActivity
android:theme="@style/Theme.AppCompat.Light" >
②.设置actionbar的menu
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Search, should appear as action button actionViewClass是搜索 showAsAction:always 表示总是显示,ifRoom:如果有空闲就显示,overlow收到下面 --> <item android:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" android:actionViewClass="android.widget.SearchView" android:showAsAction="ifRoom"/></menu>③.使用actionbar
@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);MenuItem menuItem = menu.findItem(R.id.action_search);// 设置搜索SearchView searchView = (SearchView) menuItem.getActionView();searchView.setOnQueryTextListener(this);return true;}搜索监听
// 搜索文字改变监听@Overridepublic boolean onQueryTextChange(String text) {Toast.makeText(MainActivity.this, text, 0).show();return true;}// 提交文字监听@Overridepublic boolean onQueryTextSubmit(String text) {Toast.makeText(MainActivity.this, text, 0).show();return true;}④.返回按钮到MainActivity
ActionBar actionBar = getSupportActionBar();actionBar.setDisplayHomeAsUpEnabled(true);Manifest设置
<activity android:name=".DetailActivity" android:label="@string/app_detail" android:parentActivityName="com.itheima.googleplay.MainActivity" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.itheima.googleplay.MainActivity" /> </activity>
2.tabbar的使用
①.增加actionbar
//增加tab标签private void DefineActionBar() {ActionBar actionBar = getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);// 设置模式actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);Tab tab1 = actionBar.newTab().setText("我").setTabListener(new MyactionBar());actionBar.addTab(tab1);Tab tab2 = actionBar.newTab().setText("艹").setTabListener(new MyactionBar());actionBar.addTab(tab2);Tab tab3 = actionBar.newTab().setText("你").setTabListener(new MyactionBar());actionBar.addTab(tab3);}②.actionbar的背景设置(见上一篇详细设置)
3.抽屉的使用
①.xml设置
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:id="@+id/dl"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg_tab" android:layout_gravity="left"> </FrameLayout></android.support.v4.widget.DrawerLayout>
②.打开抽屉和actionbar绑定使用
//抽屉的设置drawerLayout = (DrawerLayout) findViewById(R.id.dl_left);//drawerLayout.openDrawer(Gravity.LEFT);// 默认打开/*//点击打开抽屉的按钮 这个必须和Tab一起,才会显示drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer_am, R.string.open_drawer, R.string.close_drawer);drawerToggle.syncState();//让开关和抽屉建立连接
③.抽屉打开处理
@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.action_search:// Toast.makeText(MainActivity.this, "点击了", 0).show();break;default:break;}//如果是点击的DrawerToggle就让它处理,然后让别的处理return drawerToggle.onOptionsItemSelected(item)||super.onOptionsItemSelected(item);}
二.主页面框架ViewPager+Fragment的使用
1.使用ViewPager切换页面 每个页面是个Fragment
①.xml文件
<android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > <android.support.v4.view.PagerTabStrip android:id="@+id/pager_tab_strip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:background="#ffffff" android:textColor="#000" android:paddingTop="4dp" android:paddingBottom="4dp" /> </android.support.v4.view.ViewPager>
②设置适配器
class MyFragmentPagerAdapter extends FragmentPagerAdapter{public MyFragmentPagerAdapter(FragmentManager fm) {super(fm);}@Overridepublic Fragment getItem(int position) {return FragmentFactory.createFragment(position);//使用工厂创建Fragment对象}@Overridepublic int getCount() {return tabNames.length;}
//使用的ViewPager的tab标题@Overridepublic CharSequence getPageTitle(int position) {return tabNames[position];//标题}}
③抽取BaseActivity
抽取BaseActivitypublic class BaseActivity extends ActionBarActivity {// 管理运行的所有的activitystatic List<BaseActivity> mActivities = new LinkedList<BaseActivity>();@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);synchronized (mActivities) {mActivities.add(this);}init();initView();initActionBar();}@Overrideprotected void onDestroy() {super.onDestroy();synchronized (mActivities) {mActivities.remove(this);}}public void killAll() {// 复制了一份mActivities 集合List<BaseActivity> copy;synchronized (mActivities) {copy = new LinkedList<BaseActivity>(mActivities);}for (BaseActivity activity : copy) {activity.finish();}// 杀死当前的进程android.os.Process.killProcess(android.os.Process.myPid());}protected void initActionBar() {}protected void initView() {}protected void init() {}
④设置FragmentFactory使用工厂去创建Fragment对象
/* * 对fragment对象进行缓存 */public class FragmentFactory {private static Map<Integer, BaseFragment> list = new HashMap<Integer, BaseFragment>();public static BaseFragment createFragment(int position) {BaseFragment fragment ;fragment = list.get(position);if (fragment == null) {if (position == 0) {fragment = new HomeFragment();} else if (position == 1) {fragment = new AppFragment();} else if (position == 2) {fragment = new GameFragment();} else if (position == 3) {fragment = new SubjectFragment();} else if (position == 4) {fragment = new CategoryFragment();} else if (position == 5) {fragment = new TopFragment();}if (fragment != null) {list.put(position, fragment);// 把创建好的Fragment存放到集合中缓存起来}}return fragment;}}
三.页面的搭建
1. 四种界面: 加载中, 加载错误,加载为空 ,加载成功
根据不同的状态去切换界面
public class HomeFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {FrameLayout frameLayout=new FrameLayout(getActivity());init(); // 在FrameLayout中 添加4种不同的界面showPage();// 根据不同的状态显示不同的界面show();// 根据服务器的数据 切换状态return frameLayout;}
2BaseFragment的设置
public abstract class BaseFragment extends Fragment {public static final int STATE_UNKOWN = 0;public static final int STATE_LOADING = 1;public static final int STATE_ERROR = 2;public static final int STATE_EMPTY = 3;public static final int STATE_SUCCESS = 4;public static int state = STATE_LOADING;private View loadingView;// 加载中的界面private View errorView;// 错误界面private View emptyView;// 空界面private View successView;// 加载成功的界面private FrameLayout frameLayout;protected BitmapUtils bitmapUtils;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {bitmapUtils = BitmapHelper.getBitmapUtils();// 复用FrameLayout对象if (frameLayout == null) {frameLayout = new FrameLayout(getActivity());init();// 添加4种界面} else {ViewUtils.removeParent(frameLayout);// 复用会导致错误,必须移除frameLayout的爹}// show(); 应该在切换页面的时候调用,默认的时候不显示页面showPage();return frameLayout;}/** 添加4种界面 */public void init() {loadingView = createLoadingView(); // 创建了加载中的界面if (loadingView != null) {frameLayout.addView(loadingView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));}errorView = createErrorView(); // 加载错误界面if (errorView != null) {frameLayout.addView(errorView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));}emptyView = createEmptyView(); // 加载空的界面if (emptyView != null) {frameLayout.addView(emptyView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));}successView = createSuccessView();if (successView != null) {frameLayout.addView(successView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));}}/** 创建了空的界面 */public View createEmptyView() {View view = View.inflate(getActivity(), R.layout.loadpage_empty, null);return view;}/** 创建了加载中的界面 */public View createLoadingView() {View view = View.inflate(getActivity(), R.layout.loadpage_loading, null);return view;}/** 创建了错误的界面 */public View createErrorView() {View view = View.inflate(getActivity(), R.layout.loadpage_error, null);Button page_bt = (Button) view.findViewById(R.id.page_bt);page_bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {show();// 当show时。就显示正在加载}});return view;}/** 根据不同的状态显示不同的界面 */public void showPage() {if (loadingView != null) {loadingView.setVisibility(state == STATE_UNKOWN|| state == STATE_LOADING ? View.VISIBLE : View.INVISIBLE);}if (errorView != null) {errorView.setVisibility(state == STATE_ERROR ? View.VISIBLE: View.INVISIBLE);}if (emptyView != null) {emptyView.setVisibility(state == STATE_EMPTY ? View.VISIBLE: View.INVISIBLE);}if (successView != null) {successView.setVisibility(state == STATE_SUCCESS ? View.VISIBLE: View.INVISIBLE);}}/** 根据服务器返回的数据切换状态 */public void show() {// 当为错误的时候,切换需要变为正在加载if (state == STATE_ERROR || state == STATE_UNKOWN) {state = STATE_LOADING;}//使用线程池去执行线程ThreadManager.getInstance().createLongPool().execute(new Runnable() {@Overridepublic void run() {SystemClock.sleep(2000);state = LoadDataFromServer();// 转移到主线程执行uiif (getActivity() != null) {// 避免Fragment销毁,但是子线程还没停止,会空指针getActivity().runOnUiThread(new Runnable() {@Overridepublic void run() {if (state != -1) {showPage();// 显示页面}}});}}});showPage();// 显示页面}// 根据系统返回的数据返回不同的状态public int checkData(List data) {if (data == null) {// 如果为null,则返回加载错误return STATE_ERROR;} else {if (data.size() == 0) {// 如果没有数据,则返回为空return STATE_EMPTY;} else {return STATE_SUCCESS;// 否则成功}}}/** 创建了成功的界面 */protected abstract View createSuccessView();/** 获取数据从服务器,返回三种状态 */protected abstract int LoadDataFromServer();}
. 对FrmeLayout对象进行复用
// 复用FrameLayout对象if (frameLayout == null) {frameLayout = new FrameLayout(getActivity());init();// 添加4种界面} else {ViewUtils.removeParent(frameLayout);// 复用会导致错误,必须移除frameLayout的爹}移除父容器
public class ViewUtils {public static void removeParent(View v){// 先找到爹 在通过爹去移除孩子ViewParent parent = v.getParent();//所有的控件 都有爹 爹一般情况下 就是ViewGoupif(parent instanceof ViewGroup){ViewGroup group=(ViewGroup) parent;group.removeView(v);}}}
0 0
- 谷歌电子市场第1天
- 谷歌电子市场第2天
- 谷歌电子市场第4天总结
- 谷歌电子市场第5天知识总结
- 谷歌电子市场学习笔记第三天
- 谷歌电子市场学习笔记第五天
- 谷歌电子市场第三天知识点总结
- 谷歌电子市场笔记1
- 谷歌电子市场学习笔记第一天之上
- 谷歌电子市场学习笔记第一天之下
- 谷歌电子市场学习笔记第四天
- 谷歌电子市场
- 谷歌电子市场笔记2
- 谷歌电子市场笔记3
- 谷歌电子市场笔记4
- 谷歌电子市场笔记5
- 谷歌电子市场 day01(笔记)
- 谷歌电子市场 day02(笔记)
- JDK + eclipse mars + CDT + PyDev
- leetcode 18: 4Sum (KSum)
- android常见错误
- 时过境迁,物是人非。
- xshell的快捷键(非常实用)
- 谷歌电子市场第1天
- 思特沃克作业
- javascript学习笔记--(初级)js文件介绍
- RMQ算法
- 瀑布流布局 – 学成
- 分治-归并排序
- 数字货币制作教程
- YCgCo颜色空间
- 分治法-快速排序