189.m1-Fragment工厂优化Fragment的加载

ViewPager加载每一个Fragment的时候,是通过Adapter的getItem来获取到Fragment的条目

FragmentFragmnet.java创建一个集合来放置postion对应的Fragment

package com.ldw.market.fragment;

import java.util.HashMap;
import java.util.Map;

import android.support.v4.app.Fragment;

/*
 * 通过Fragment工厂  生产Fragment  
 */
public class FragmentFactory {
	//创建一个Map,fragment中放在集合中,第一个参数是脚标,第二个是fRAGMENT
	private static Map<Integer, Fragment> mFragments = new HashMap<Integer, Fragment>();
	
	public static Fragment createFragment(int position) {
		Fragment fragment = null;
		//在集合中取出来Fragment
		fragment = mFragments.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();
			}
			//保存fragment
			if (fragment != null) {
				mFragments.put(position, fragment);// 把创建好的Fragment存放到集合中缓存起来
			}
		}
		return fragment;
	}
}

主逻辑代码MainActivity.java

package com.ldw.market;

import com.ldw.market.fragment.AppFragment;
import com.ldw.market.fragment.FragmentFactory;
import com.ldw.market.fragment.HomeFragment;
import com.ldw.market.utils.UiUtils;

import junit.framework.AssertionFailedError;
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.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
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.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends BaseActivity implements OnQueryTextListener{

	private DrawerLayout mDrawerLayout;
	private ActionBarDrawerToggle drawerToggle;
	private ViewPager mViewPager;
	private PagerTabStrip pager_tab_strip;
	private String[] tab_names;  // 标签的名字
    
	//加载字符串数组,初始化Tab
	@Override
	protected void init() {
		tab_names = UiUtils.getStringArray(R.array.tab_names);
		
	}
	
    //初始化ActionBar
	@Override
    protected void initActionBar() {
    	//添加tab标签名
        ActionBar actionBar = getSupportActionBar();       
		//让拉出显示详情的图片显示,可以拉出详情
		actionBar.setDisplayHomeAsUpEnabled(true);
		//让按键点击有效
		actionBar.setHomeButtonEnabled(true);
		
		//ActionBarDrawerToggle是ActionBar控制抽屉,
		//参数1:当前actionBar的Activity,参数2:控制的抽屉,参数3:按钮的图片,参数4和5是描述
		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();
					}
			
		};
		//设置监听DrawerListener
		mDrawerLayout.setDrawerListener(drawerToggle);
		//  让开关和actionbar建立关系 
		drawerToggle.syncState();
		
	}
    
    //初始化界面
	@Override
    protected void initView(){
    	setContentView(R.layout.activity_main);
    	mDrawerLayout = (DrawerLayout) findViewById(R.id.dl);
        mViewPager=(ViewPager) findViewById(R.id.vp);
        pager_tab_strip = (PagerTabStrip) findViewById(R.id.pager_tab_strip);
        //  设置标签下划线的颜色
        pager_tab_strip.setTabIndicatorColor(getResources().getColor(R.color.indicatorcolor));
        
        mViewPager.setAdapter(new MainAdapter(getSupportFragmentManager()));
    }
    
    //可以继承PageAapter实现ViePager翻页现在继承FragmentStatePagerAdapter可以实现fragement
    private class MainAdapter extends FragmentStatePagerAdapter{

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

		//每一个条目返回的fragment
		@Override
		public Fragment getItem(int position) {
			//  通过Fragment工厂  生产Fragment   
			return FragmentFactory.createFragment(position);
		}

		//条目的总数
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return tab_names.length;
		}
		
		// 返回每个条目的标题,设置tab的标签
		@Override
		public CharSequence getPageTitle(int position) {
			return tab_names[position];
		}
    	
    }
    
    //初始化ActionBar的界面
    @SuppressLint("NewApi") @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, 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;
    }
    
    public void click(View v){
    	Intent intent = new Intent(getApplicationContext(), DetailActivity.class);
    	startActivity(intent);
    }
    
    /** 处理actionBar菜单条目的点击事件 */
    @Override
	public boolean onOptionsItemSelected(MenuItem item) {
		System.out.println("所有");
		//当前点击的条目是search
		if (item.getItemId() == R.id.action_search) {
			Toast.makeText(getApplicationContext(), "搜索", 0).show();
		}
		//优先处理drawerToggle的点击,drawerToggle出不不了交给父类
		return drawerToggle.onOptionsItemSelected(item)|super.onOptionsItemSelected(item);
	}

	// 当搜索提交的时候
	@Override
	public boolean onQueryTextChange(String arg0) {
		Toast.makeText(getApplicationContext(), arg0, 0).show();
		return false;
	}

	// 当搜索的文本发生变化
	@Override
	public boolean onQueryTextSubmit(String arg0) {
		Toast.makeText(getApplicationContext(), arg0, 0).show();
		return false;
	}
	
    
}
HomeFragment.java

package com.ldw.market.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 {

	//创建一个View对象
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		TextView view=new TextView(getActivity());
		view.setText("我是HomeFragment");
				return view;
		
	}
}

BaseApplication.java来获取到上下文

package com.ldw.market;

import android.app.Application;
import android.content.Context;
/*
 * 代表当前应用程序,获取上下文,需要在清单文件中配置
 *
 */
public class BaseApplication extends Application {
	private static BaseApplication application;
	@Override
	public void onCreate() {
		super.onCreate();
		application=this;
		
	}
	public static Context getApplication() {
		return application;
	}
	
	
}

工具类UiUtils.java来加载xml文件中的数组

package com.ldw.market.utils;

import android.content.res.Resources;

import com.ldw.market.BaseApplication;

/*
 * 工具类,加载字符串
 */
public class UiUtils {

	/*
	 * 获取到字符数组 ,加载XML文件中的字符数组
	 * @param tabNames  字符数组的id
	 */
	public static String[] getStringArray(int tabNames) {
		return getResource().getStringArray(tabNames);
	}
	
	public static Resources getResource() {
		//获取到上下文
		return BaseApplication.getApplication().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/string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Market</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_search">search</string>
    <string name="app_detail">应用详情</string>
    <string name="open_drawer">抽屉打开了</string>
    <string name="close_drawer">抽屉关闭了</string>
    <string name="load_error">加载失败,点击重试</string>
	<string-array name="tab_names">
        <item>首页</item>
        <item>应用</item>
        <item>游戏</item>
        <item>专题</item>
        <item>分类</item>
        <item>排行</item>
    </string-array>

</resources>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值