谷歌电子市场学习笔记第一天之下

一、ViewPager切换界面和Tab标签的建立

参考Android文档安卓开发官方文档:http://wear.techbrood.com/training/implementing-navigation/lateral.html

里面有详细的教程。

activity_main.xml



    

    

MainActivity.java

package com.xbmu.google;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.Tab;
import android.support.v7.app.ActionBar.TabListener;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.xbmu.google.fragment.AppFragment;
import com.xbmu.google.fragment.HomeFragment;

public class MainActivity extends ActionBarActivity implements
		OnQueryTextListener {
	private ActionBarDrawerToggle drawerToggle;
	private ViewPager mViewPager;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.dl);
		//获取ViewPager控件
		mViewPager = (ViewPager) findViewById(R.id.vp);
		//给ViewPager设置适配器
		mViewPager.setAdapter(new MainAdapter(getSupportFragmentManager()));
		ActionBar actionBar = getSupportActionBar();
		// 设置是否将应用程序图标转变成可点击的图标,并在图标上添加一个向左的箭头。
		actionBar.setDisplayHomeAsUpEnabled(true);
		actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		Tab tab1 = actionBar.newTab().setText("标签一")
				.setTabListener(new MyTabListener());
		actionBar.addTab(tab1);
		Tab tab2 = actionBar.newTab().setText("标签二")
				.setTabListener(new MyTabListener());
		actionBar.addTab(tab2);
		Tab tab3 = actionBar.newTab().setText("标签三")
				.setTabListener(new MyTabListener());
		actionBar.addTab(tab3);
		Tab tab4 = actionBar.newTab().setText("标签四")
				.setTabListener(new MyTabListener());
		actionBar.addTab(tab4);
		Tab tab5 = actionBar.newTab().setText("标签五")
				.setTabListener(new MyTabListener());
		actionBar.addTab(tab5);

		actionBar.setDisplayHomeAsUpEnabled(true);
		actionBar.setHomeButtonEnabled(true);
		drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
				R.drawable.ic_drawer_am, //
				R.string.open_drawer, R.string.close_drawer) {

			@Override
			public void onDrawerClosed(View drawerView) {
				super.onDrawerClosed(drawerView);
				Toast.makeText(getApplicationContext(), "抽屉关闭了", 0).show();
			}

			@Override
			public void onDrawerOpened(View drawerView) {
				super.onDrawerOpened(drawerView);
				Toast.makeText(getApplicationContext(), "抽屉打开了", 0).show();
			}

		};
		mDrawerLayout.setDrawerListener(drawerToggle);
		// 让开关和actionBar建立关系
		drawerToggle.syncState();
		
		//监听ViewPager页面的变化
		mViewPager
				.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
					//当viewPager页面发生变化的时候调用
					@Override
					public void onPageSelected(int position) {
						getSupportActionBar().setSelectedNavigationItem(
								position);
					}

				});
	}

	private class MainAdapter extends FragmentStatePagerAdapter {

		public MainAdapter(FragmentManager fm) {
			super(fm);
			// TODO Auto-generated constructor stub
		}
		//每条目录返回的是Fragment
		@Override
		public Fragment getItem(int position) {
			if (position == 0) {
				return new HomeFragment();
			} else {
				return new AppFragment();
			}
		}
		//一共有几条目录
		@Override
		public int getCount() {
			return 4;
		}

	}

	private class MyTabListener implements TabListener {

		@Override
		public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
			// TODO Auto-generated method stub

		}
		//当tab标签被选中的时候,viewPagr切换到指定位置
		@Override
		public void onTabSelected(Tab tab, FragmentTransaction ft) {
			mViewPager.setCurrentItem(tab.getPosition());
		}

		@Override
		public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
			// TODO Auto-generated method stub

		}

	}
	
	//......
}
HomeFragment.java

package com.xbmu.google.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class HomeFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		TextView textView = new TextView(getActivity());
		textView.setText("我是HomeFragment");
		textView.setTextSize(20);
		return textView;
	}
}
AppFragment和HomeFragment暂时性一样

二、使用ViewPager中自带的pageTabStrip切换

pageTabStrip:交互式的
pageTitleStrip:非交互式的

参考Android文档安卓开发官方文档:http://wear.techbrood.com/training/implementing-navigation/lateral.html

activity_main.xml



    

        
    

    

MainActivity.java

package com.xbmu.google;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.xbmu.google.fragment.AppFragment;
import com.xbmu.google.fragment.HomeFragment;

public class MainActivity extends ActionBarActivity implements
		OnQueryTextListener {
	private ActionBarDrawerToggle drawerToggle;
	private ViewPager mViewPager;
	private DrawerLayout mDrawerLayout;
	private PagerTabStrip mPagerTabStrip;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mDrawerLayout = (DrawerLayout) findViewById(R.id.dl);
		//获取ViewPager控件
		mViewPager = (ViewPager) findViewById(R.id.vp);
		//给ViewPager设置适配器
		mViewPager.setAdapter(new MainAdapter(getSupportFragmentManager()));
		
		mPagerTabStrip = (PagerTabStrip) findViewById(R.id.pager_title_strip);
		//设置标签下划线的颜色
		mPagerTabStrip.setTabIndicatorColor(getResources().getColor(R.color.indicatorcolor));
		
		ActionBar actionBar = getSupportActionBar();
		// 设置是否将应用程序图标转变成可点击的图标,并在图标上添加一个向左的箭头。
		actionBar.setDisplayHomeAsUpEnabled(true);
		//设置是否将应用程序图标转变成可点击的按钮
		actionBar.setHomeButtonEnabled(true);
		
		drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
				R.drawable.ic_drawer_am, //
				R.string.open_drawer, R.string.close_drawer) {

			@Override
			public void onDrawerClosed(View drawerView) {
				super.onDrawerClosed(drawerView);
				Toast.makeText(getApplicationContext(), "抽屉关闭了", 0).show();
			}

			@Override
			public void onDrawerOpened(View drawerView) {
				super.onDrawerOpened(drawerView);
				Toast.makeText(getApplicationContext(), "抽屉打开了", 0).show();
			}

		};
		mDrawerLayout.setDrawerListener(drawerToggle);
		// 让开关和actionBar建立关系
		drawerToggle.syncState();
	}

	private class MainAdapter extends FragmentStatePagerAdapter {

		public MainAdapter(FragmentManager fm) {
			super(fm);
			// TODO Auto-generated constructor stub
		}
		//每条目录返回的是Fragment
		@Override
		public Fragment getItem(int position) {
			if (position == 0) {
				return new HomeFragment();
			} else {
				return new AppFragment();
			}
		}
		//一共有几条目录
		@Override
		public int getCount() {
			return 4;
		}
		//返回每个条目的title
		@Override
		public CharSequence getPageTitle(int position) {
			return "标签"+position;
		}
	}	
	//.......
}

运行效果图:

谷歌电子市场学习笔记第一天之下_第1张图片

三、抽取BaseActivity

package com.xbmu.google;

import java.util.LinkedList;
import java.util.List;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;

public class BaseActivity extends ActionBarActivity {
	//管理运行的所有的activity
	static List mActivities = new LinkedList();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		synchronized(mActivities){
			mActivities.add(this);
		}
		init();
		initView();
		initActionBar();
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		synchronized (mActivities) {
			mActivities.remove(this);
		}
	}
	//用于一键推出应用程序
	public void killAll(){
		//复制一份mActivities的集合
		List copy;
		synchronized (mActivities) {
			copy = new LinkedList(mActivities);
		}
		for (BaseActivity activity : copy) {
			activity.finish();
		}
		//杀死当前的进程
		android.os.Process.killProcess(android.os.Process.myPid());
	}
	public void initActionBar() {
		// TODO Auto-generated method stub
		
	}

	public void initView() {
		// TODO Auto-generated method stub
		
	}

	public void init() {
		// TODO Auto-generated method stub
		
	}
}
MainActivity.java
package com.xbmu.google;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.xbmu.google.fragment.AppFragment;
import com.xbmu.google.fragment.HomeFragment;

public class MainActivity extends BaseActivity implements OnQueryTextListener {
	private ActionBarDrawerToggle drawerToggle;
	private ViewPager mViewPager;
	private DrawerLayout mDrawerLayout;
	private PagerTabStrip mPagerTabStrip;
	@Override
	public void initView() {
		super.initView();
		setContentView(R.layout.activity_main);
		mDrawerLayout = (DrawerLayout) findViewById(R.id.dl);
		mViewPager = (ViewPager) findViewById(R.id.vp);
		mPagerTabStrip = (PagerTabStrip) findViewById(R.id.pager_title_strip);
		// 给ViewPager设置适配器
		mViewPager.setAdapter(new MainAdapter(getSupportFragmentManager()));
		// 设置标签下划线的颜色
		mPagerTabStrip.setTabIndicatorColor(getResources().getColor(
				R.color.indicatorcolor));
	}
	@Override
	public void initActionBar() {
		super.initActionBar();
		ActionBar actionBar = getSupportActionBar();
		// 设置是否将应用程序图标转变成可点击的图标,并在图标上添加一个向左的箭头。
		actionBar.setDisplayHomeAsUpEnabled(true);
		// 设置是否将应用程序图标转变成可点击的按钮
		actionBar.setHomeButtonEnabled(true);
		drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
				R.drawable.ic_drawer_am, //
				R.string.open_drawer, R.string.close_drawer) {

			@Override
			public void onDrawerClosed(View drawerView) {
				super.onDrawerClosed(drawerView);
				Toast.makeText(getApplicationContext(), "抽屉关闭了", 0).show();
			}

			@Override
			public void onDrawerOpened(View drawerView) {
				super.onDrawerOpened(drawerView);
				Toast.makeText(getApplicationContext(), "抽屉打开了", 0).show();
			}

		};
		mDrawerLayout.setDrawerListener(drawerToggle);
		// 让开关和actionBar建立关系
		drawerToggle.syncState();

	}
	private class MainAdapter extends FragmentStatePagerAdapter {

		public MainAdapter(FragmentManager fm) {
			super(fm);
			// TODO Auto-generated constructor stub
		}

		// 每条目录返回的是Fragment
		@Override
		public Fragment getItem(int position) {
			if (position == 0) {
				return new HomeFragment();
			} else {
				return new AppFragment();
			}
		}

		// 一共有几条目录
		@Override
		public int getCount() {
			return 4;
		}

		// 返回每个条目的title
		@Override
		public CharSequence getPageTitle(int position) {
			return "标签" + position;
		}

	}

	@SuppressLint("NewApi")
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.main_activity_actions, menu);
		// 如果运行的环境(部署到什么版本的手机)大于3.0
		if (android.os.Build.VERSION.SDK_INT > 11) {
			SearchView searchView = (SearchView) menu.findItem(
					R.id.action_search).getActionView();
			searchView.setOnQueryTextListener(this);// 设置搜素的监听事件
		}
		return true;
	}

	/** 处理actionBar菜单条目的点击事件 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		if (item.getItemId() == R.id.action_search) {
			Toast.makeText(getApplicationContext(), "搜素", 0).show();
		}
		return drawerToggle.onOptionsItemSelected(item)
				| super.onOptionsItemSelected(item);
	}

	// 当搜素文本发生变化的时候
	@Override
	public boolean onQueryTextChange(String newText) {
		Toast.makeText(getApplicationContext(), newText, 0).show();
		return false;
	}

	// 当搜素提交的时候
	@Override
	public boolean onQueryTextSubmit(String query) {
		Toast.makeText(getApplicationContext(), query, 0).show();
		return false;
	}
}
DetailActivity.java
package com.xbmu.google;

import android.os.Bundle;
import android.support.v7.app.ActionBar;
public class DetailActivity extends BaseActivity {
	private ActionBar actionBar;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_detail);
	}
	@Override
	public void initView() {
		setContentView(R.layout.activity_detail);
	}
	@Override
	public void initActionBar() {
		actionBar = getSupportActionBar();
		actionBar.setDisplayHomeAsUpEnabled(true);
	}
}

四、Fragment的切换

BaseApplication.java
package com.xbmu.google.application;

import android.app.Application;
import android.content.Context;
/**
 * 代表当前应用程序
 * @author bitaotao
 */
public class BaseApplication extends Application {
	private static Application mContext;
	@Override
	public void onCreate() {
		super.onCreate();
		mContext = this;
	}
	public static Context getmContext() {
		return mContext;
	}
	
}
UiUtils.java
package com.xbmu.google.tools;

import android.content.res.Resources;
import com.xbmu.google.application.BaseApplication;
public class UiUtils {
	/**
	 * 获取到字符数组 
	 * @param tabNames  字符数组的id
	 */
	public static String[] getStringArray(int tabNames) {
		return getResource().getStringArray(tabNames);
	}

	public static Resources getResource() {
		return BaseApplication.getmContext().getResources();
	}
	
	/** dip转换px */
	public static int dip2px(int dip) {
		final float scale = getResource().getDisplayMetrics().density;
		return (int) (dip * scale + 0.5f);
	}

	/** pxz转换dip */

	public static int px2dip(int px) {
		final float scale = getResource().getDisplayMetrics().density;
		return (int) (px / scale + 0.5f);
	}
}
res/values/strings.xml


    GoogleApp
    Settings
    Hello world!
    搜素
    页面详情
    打开抽屉
    关闭抽屉
	
        首页
        应用
        游戏
        专题
        分类
        排行
    
MainActivity.java
package com.xbmu.google;

import android.annotation.SuppressLint;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.xbmu.google.fragment.AppFragment;
import com.xbmu.google.fragment.CategoryFragment;
import com.xbmu.google.fragment.GameFragment;
import com.xbmu.google.fragment.HomeFragment;
import com.xbmu.google.fragment.HotFragment;
import com.xbmu.google.fragment.SubjectFragment;
import com.xbmu.google.tools.UiUtils;

public class MainActivity extends BaseActivity implements OnQueryTextListener {
	private ActionBarDrawerToggle drawerToggle;
	private ViewPager mViewPager;
	private DrawerLayout mDrawerLayout;
	private PagerTabStrip mPagerTabStrip;
	private String[] tab_names;
	@Override
	public void init() {
		tab_names = UiUtils.getStringArray(R.array.tab_names);
	}
	@Override
	public void initView() {
		//....
	}
	@Override
	public void initActionBar() {
		//....
	}
	private class MainAdapter extends FragmentStatePagerAdapter {

		public MainAdapter(FragmentManager fm) {
			super(fm);
			// TODO Auto-generated constructor stub
		}

		// 每条目录返回的是Fragment
		@Override
		public Fragment getItem(int position) {
			if (position == 0) {
				return new HomeFragment();
			}else if(position == 1){
				return new AppFragment();
			}else if(position == 2){
				return new GameFragment();
			}else if(position == 3){
				return new SubjectFragment();
			}else if(position == 4){
				return new CategoryFragment();
			}else if(position == 5){
				return new HotFragment();
			}else{
				return null;
			}
		}

		// 一共有几条目录
		@Override
		public int getCount() {
			return tab_names.length;
		}

		// 返回每个条目的title
		@Override
		public CharSequence getPageTitle(int position) {
			return tab_names[position];
		}

	}

	//.....
}
HomeFragment.java、AppFragment.java、GameFragment.java...都一样
运行效果图:
谷歌电子市场学习笔记第一天之下_第2张图片

五、Fragment工厂

FragmentFactory.java
package com.xbmu.google.fragment;

import java.util.HashMap;
import java.util.Map;
import android.support.v4.app.Fragment;
public class FragmentFactory {
	private static Map mFragments = new HashMap();
	public static Fragment createFragment(int position) {
		Fragment fragment = null;
		fragment = mFragments.get(position);//在集合中取出来Fragment
		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 HotFragment();
			}
			if(fragment!=null){
				mFragments.put(position, fragment);//把创建好的Fragment存放到集合中缓存起来
			}
		}
		return fragment;
	}
}
修改MainActivity.java
// 每条目录返回的是Fragment
@Override
public Fragment getItem(int position) {
	return FragmentFactory.createFragment(position);
}

六、日志工具类LogUtils

LogUtils.java
package com.xbmu.google.tools;

import android.util.Log;
public class LogUtils {
	/** 日志输出级别NONE */
	public static final int LEVEL_NONE = 0;
	/** 日志输出级别V */
	public static final int LEVEL_VERBOSE = 1;
	/** 日志输出级别D */
	public static final int LEVEL_DEBUG = 2;
	/** 日志输出级别I */
	public static final int LEVEL_INFO = 3;
	/** 日志输出级别W */
	public static final int LEVEL_WARN = 4;
	/** 日志输出级别E */
	public static final int LEVEL_ERROR = 5;
	/** 日志输出时的TAG */
	private static String mTag = "googleplay";
	/** 是否允许输出log */
	private static int mDebuggable = LEVEL_ERROR;
	/** 用于记时的变量 */
	private static long mTimestamp = 0;
	/** 以级别为 d 的形式输出LOG */
	public static void v(String msg) {
		if (mDebuggable >= LEVEL_VERBOSE) {
			Log.v(mTag, msg);
		}
	}

	/** 以级别为 d 的形式输出LOG */
	public static void d(String msg) {
		if (mDebuggable >= LEVEL_DEBUG) {
			Log.d(mTag, msg);
		}
	}

	/** 以级别为 i 的形式输出LOG */
	public static void i(String msg) {
		if (mDebuggable >= LEVEL_INFO) {
			Log.i(mTag, msg);
		}
	}
	/** 以级别为 w 的形式输出LOG */
	public static void w(String msg) {
		if (mDebuggable >= LEVEL_WARN) {
			Log.w(mTag, msg);
		}
	}
	/** 以级别为 w 的形式输出Throwable */
	public static void w(Throwable tr) {
		if (mDebuggable >= LEVEL_WARN) {
			Log.w(mTag, "", tr);
		}
	}
	/** 以级别为 w 的形式输出LOG信息和Throwable */
	public static void w(String msg, Throwable tr) {
		if (mDebuggable >= LEVEL_WARN && null != msg) {
			Log.w(mTag, msg, tr);
		}
	}
	/** 以级别为 e 的形式输出LOG */
	public static void e(String msg) {
		if (mDebuggable >= LEVEL_ERROR) {
			Log.e(mTag, msg);
		}
	}
	/** 以级别为 e 的形式输出Throwable */
	public static void e(Throwable tr) {
		if (mDebuggable >= LEVEL_ERROR) {
			Log.e(mTag, "", tr);
		}
	}
	/** 以级别为 e 的形式输出LOG信息和Throwable */
	public static void e(String msg, Throwable tr) {
		if (mDebuggable >= LEVEL_ERROR && null != msg) {
			Log.e(mTag, msg, tr);
		}
	}
	/** 以级别为 e 的形式输出msg信息,附带时间戳,用于输出一个时间段结束点* @param msg 需要输出的msg */
	public static void elapsed(String msg) {
		long currentTime = System.currentTimeMillis();
		long elapsedTime = currentTime - mTimestamp;
		mTimestamp = currentTime;
		e("[Elapsed:" + elapsedTime + "]" + msg);
	}
}
知识点补充,面试中:我们如何直接去退出一个应用程序?
方式一:把所有的Activity放到一个集合中,遍历集合,做推出
方式二:让我们当前所有的Activity实现一个广播接收者
BaseActivity.java
package com.xbmu.google;

import java.util.LinkedList;
import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;

public class BaseActivity extends ActionBarActivity {
	//管理运行的所有的activity
	static List mActivities = new LinkedList();
	
	private KillAllRecevier recevier;
	private class KillAllRecevier extends BroadcastReceiver{
		@Override
		public void onReceive(Context context, Intent intent) {
			finish();
		}
	}
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		recevier = new KillAllRecevier();
		IntentFilter filter = new IntentFilter("com.xbmu.google.killall");
		registerReceiver(recevier, filter);
		synchronized(mActivities){
			mActivities.add(this);
		}
		init();
		initView();
		initActionBar();
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		synchronized (mActivities) {
			mActivities.remove(this);
		}
		if(recevier!=null){
			unregisterReceiver(recevier);
			recevier=null;
		}
	}
	//用于一键推出应用程序
	public void killAll(){
		//复制一份mActivities的集合
		List copy;
		synchronized (mActivities) {
			copy = new LinkedList(mActivities);
		}
		for (BaseActivity activity : copy) {
			activity.finish();
		}
		//杀死当前的进程
		android.os.Process.killProcess(android.os.Process.myPid());
	}
	public void initActionBar() {
		// TODO Auto-generated method stub
		
	}

	public void initView() {
		// TODO Auto-generated method stub
		
	}

	public void init() {
		// TODO Auto-generated method stub
		
	}
}
在实现BaseActivity的子类中的退出应用程序的按钮中,发送广播:
//发送广播
sendBroadcast(new Intent("com.xbmu.google.killall"));

七、显示界面的架子

package com.xbmu.google.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import com.xbmu.google.R;

public class HomeFragment extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		frameLayout = new FrameLayout(getActivity());
		init();//在FrameLayout中添加4种不同的界面
		showPage();//根据不同的状态显示不同的界面
		show();//根据服务器的数据  切换状态
		
		return frameLayout;
	}
	//在FrameLayout中添加几种不同的界面
	private void init() {
	
		
	}
	//根据不同的状态显示不同的界面
	private void showPage() {
		
	}
	
	//根据服务器的数据  切换状态
	private void show() {
		
	}
}

八、4种界面&五种状态

1.四种界面:加载中界面,错误界面,为空的时候界面,成功的界面
2.五种状态:未知,加载中,错误,空,加载成功
3.根据不同的状态去切换界面。
package com.xbmu.google.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import com.xbmu.google.R;
public class HomeFragment extends Fragment {
	public static final int STATE_UNKNOW = 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 int state = STATE_UNKNOW;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		frameLayout = new FrameLayout(getActivity());
		init();//在FrameLayout中添加4种不同的界面
		showPage();//根据不同的状态显示不同的界面
		show();//根据服务器的数据  切换状态
		return frameLayout;
	}
	private View loadingView;//加载中的界面
	private View errorView;//错误的界面
	private View emptyView;//空界面
	private View successView;//加载成功的界面
	private FrameLayout frameLayout;
	/**在FrameLayout中添加几种不同的界面*/
	private void init() {
		loadingView = createLoadingView();
		if(loadingView != null){
			frameLayout.addView(loadingView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		errorView = createErrorView();
		if(errorView != null){
			frameLayout.addView(errorView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		emptyView = createEmptyView();
		if(emptyView != null){
			frameLayout.addView(emptyView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		showPage();//根据不同的状态显示不同的界面
	}
	/**根据不同的状态显示不同的界面*/
	private void showPage() {
		if(loadingView != null){
			loadingView.setVisibility(state==STATE_UNKNOW || 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(state == STATE_SUCCESS){
			successView = createSuccessView();
			if(successView!=null){
				frameLayout.addView(successView, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
				successView.setVisibility(View.VISIBLE);
			}
		}

	}

	private View createSuccessView() {
		// TODO Auto-generated method stub
		return null;
	}

	/**根据服务器的数据  切换状态*/
	private void show() {
			
	}
	/*创建加载空的界面*/
	private View createEmptyView() {
		View view = View.inflate(getActivity(), R.layout.loadpage_empty, null);
		return view;
	}
	/*创建加载错误的界面*/
	private View createErrorView() {
		View  view  =View.inflate(getActivity(), R.layout.loadpage_error, null);
		return view;
	}
	/*创建加载中的界面*/
	private View createLoadingView() {
		View view = View.inflate(getActivity(), R.layout.loadpage_loading, null);
		return view;
	}

}

九、根据状态切换界面

package com.xbmu.google.fragment;

import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import com.xbmu.google.R;
public class HomeFragment extends Fragment {
	public static final int STATE_UNKNOW = 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 int state = STATE_UNKNOW;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		frameLayout = new FrameLayout(getActivity());
		init();//在FrameLayout中添加4种不同的界面
		showPage();//根据不同的状态显示不同的界面
		show();//根据服务器的数据  切换状态
		
		return frameLayout;
	}
	private View loadingView;//加载中的界面
	private View errorView;//错误的界面
	private View emptyView;//空界面
	private View successView;//加载成功的界面
	private FrameLayout frameLayout;
	/**在FrameLayout中添加几种不同的界面*/
	private void init() {
		loadingView = createLoadingView();
		if(loadingView != null){
			frameLayout.addView(loadingView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		errorView = createErrorView();
		if(errorView != null){
			frameLayout.addView(errorView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		emptyView = createEmptyView();
		if(emptyView != null){
			frameLayout.addView(emptyView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		
		showPage();//根据不同的状态显示不同的界面
	}
	/**根据不同的状态显示不同的界面*/
	private void showPage() {
		if(loadingView != null){
			loadingView.setVisibility(state==STATE_UNKNOW || 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(state == STATE_SUCCESS){
			successView = createSuccessView();
			if(successView!=null){
				frameLayout.addView(successView, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
				successView.setVisibility(View.VISIBLE);
			}
		}
	}
	private View createSuccessView() {
		// TODO Auto-generated method stub
		return null;
	}
	public enum LoadResult{
		ERROR(2),EMPTY(3),SUCCESS(4);
		int value;
		LoadResult(int value){
			this.value = value;
		}
		public int getValue() {
			return value;
		}
		
	}
	/**根据服务器的数据  切换状态*/
	private void show() {
		if(state == STATE_ERROR || state == STATE_EMPTY){
			state = STATE_LOADING;
		}
		//请求服务器	获取服务器上数据  进行判断
		//请求服务器 返回一个结果
		new Thread(){
			public void run() {
				SystemClock.sleep(2000);
				final LoadResult result = load();
				getActivity().runOnUiThread(new Runnable() {
					
					@Override
					public void run() {
						if(result != null){
							state = result.getValue();
							showPage();//状态改变了,重新判断当前应该显示那个界面
						}
					}
				});
				
			};
		}.start();	
	}
	private LoadResult load() {
		return LoadResult.ERROR;
	}
	/*创建加载空的界面*/
	private View createEmptyView() {
		View view = View.inflate(getActivity(), R.layout.loadpage_empty, null);
		return view;
	}
	/*创建加载错误的界面*/
	private 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() {
			
			@Override
			public void onClick(View v) {
				show();
			}
		});
		return view;
	}
	/*创建加载中的界面*/
	private View createLoadingView() {
		View view = View.inflate(getActivity(), R.layout.loadpage_loading, null);
		return view;
	}

}

十、复用frameLayout  bug的解决

ViewUtils.java

package com.xbmu.google.tools;

import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

public class ViewUtils {
	public static void removeParent(View v){
		//  先找到爹 在通过爹去移除孩子
		ViewParent parent = v.getParent();
		//所有的控件 都有爹  爹一般情况下 就是ViewGroup
		if(parent instanceof ViewGroup){
			ViewGroup group=(ViewGroup) parent;
			group.removeView(v);
		}
	}
}
HomeFragment.java

package com.xbmu.google.fragment;

import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import com.xbmu.google.R;
import com.xbmu.google.tools.ViewUtils;
public class HomeFragment extends Fragment {
	public static final int STATE_UNKNOW = 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 int state = STATE_UNKNOW;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		if(frameLayout == null){//之前的frameLayout已经记录了一个爹了   爹是之前的ViewPager
			frameLayout = new FrameLayout(getActivity());
			init();//在FrameLayout中添加4种不同的界面			
		}else{
			ViewUtils.removeParent(frameLayout);//移除frameLayout之前的爹
		}
		show();//根据服务器的数据  切换状态
		//先干掉之前的爹
		return frameLayout;// 拿到当前viewPager 添加这个framelayout
	}	
	//......		
}

全部代码:

package com.xbmu.google.fragment;

import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import com.xbmu.google.R;
import com.xbmu.google.tools.ViewUtils;

public class HomeFragment extends Fragment {
	public static final int STATE_UNKNOW = 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 int state = STATE_UNKNOW;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		if(frameLayout == null){//之前的frameLayout已经记录了一个爹了   爹是之前的ViewPager
			frameLayout = new FrameLayout(getActivity());
			init();//在FrameLayout中添加4种不同的界面			
		}else{
			ViewUtils.removeParent(frameLayout);//移除frameLayout之前的爹
		}
		show();//根据服务器的数据  切换状态
		//先干掉之前的爹
		return frameLayout;// 拿到当前viewPager 添加这个framelayout
		
		
	}
	private View loadingView;//加载中的界面
	private View errorView;//错误的界面
	private View emptyView;//空界面
	private View successView;//加载成功的界面
	private FrameLayout frameLayout;
	/**在FrameLayout中添加几种不同的界面*/
	private void init() {
		loadingView = createLoadingView();
		if(loadingView != null){
			frameLayout.addView(loadingView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		errorView = createErrorView();
		if(errorView != null){
			frameLayout.addView(errorView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		emptyView = createEmptyView();
		if(emptyView != null){
			frameLayout.addView(emptyView,new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
		}
		showPage();//根据不同的状态显示不同的界面
	}

	/**根据不同的状态显示不同的界面*/
	private void showPage() {
		if(loadingView != null){
			loadingView.setVisibility(state==STATE_UNKNOW || 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(state == STATE_SUCCESS){
			successView = createSuccessView();
			if(successView!=null){
				frameLayout.addView(successView, new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
				successView.setVisibility(View.VISIBLE);
			}
		}
	}
	private View createSuccessView() {
		// TODO Auto-generated method stub
		return null;
	}
	public enum LoadResult{
		ERROR(2),EMPTY(3),SUCCESS(4);
		int value;
		LoadResult(int value){
			this.value = value;
		}
		public int getValue() {
			return value;
		}
		
	}
	/**根据服务器的数据  切换状态*/
	private void show() {
		if(state == STATE_ERROR || state == STATE_EMPTY){
			state = STATE_LOADING;
		}
		//请求服务器	获取服务器上数据  进行判断
		//请求服务器 返回一个结果
		new Thread(){
			public void run() {
				SystemClock.sleep(2000);
				final LoadResult result = load();
				if(getActivity()!=null){
					getActivity().runOnUiThread(new Runnable() {
						
						@Override
						public void run() {
							if(result != null){
								state = result.getValue();
								showPage();//状态改变了,重新判断当前应该显示那个界面
							}
						}
					});
				}
			};
		}.start();
		showPage();
	}
	private LoadResult load() {
		return LoadResult.ERROR;
	}
	/*创建加载空的界面*/
	private View createEmptyView() {
		View view = View.inflate(getActivity(), R.layout.loadpage_empty, null);
		return view;
	}
	/*创建加载错误的界面*/
	private 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() {
			
			@Override
			public void onClick(View v) {
				show();
			}
		});
		return view;
	}
	/*创建加载中的界面*/
	private View createLoadingView() {
		View view = View.inflate(getActivity(), R.layout.loadpage_loading, null);
		return view;
	}

}

运行效果:

谷歌电子市场学习笔记第一天之下_第3张图片

你可能感兴趣的:(Android项目)