Fragment的进一步使用(二)

一:Fragment与activity的通讯(Intent)

比如,一个activity要通过Intent传递参数给另外一个activity中的fragment

方法一:

public class mFragment extends Fragment  
{  
      
    private String mArgument ;   
    public static final String ARGUMENT ="argument";  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
          
        mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);  
          
    }  

不过这样就会使,当前的fragment与宿主activity完全绑定了。对代码的复用性有很大的影响


方法二:(原博主代码:http://blog.csdn.net/lmj623565791/article/details/42628537)

public class ContentFragment extends Fragment  
{  
  
    private String mArgument;  
    public static final String ARGUMENT = "argument";  
  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        // mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);  
        Bundle bundle = getArguments();  
        if (bundle != null)  
            mArgument = bundle.getString(ARGUMENT);  
  
    }  
  
    /** 
     * 传入需要的参数,设置给arguments 
     * @param argument 
     * @return 
     */  
    public static ContentFragment newInstance(String argument)  
    {  
        Bundle bundle = new Bundle();  
        bundle.putString(ARGUMENT, argument);  
        ContentFragment contentFragment = new ContentFragment();  
        contentFragment.setArguments(bundle);  
        return contentFragment;  
    }  

给Fragment添加newInstance方法,将需要的参数传入,设置到bundle中,然后setArguments(bundle),最后在onCreate中进行获取;

这样就完成了Fragment和Activity间的解耦。当然了这里需要注意:

setArguments方法必须在fragment创建以后,添加给Activity前完成。千万不要,首先调用了add,然后设置arguments。



二:Fragment+viewPager

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:hyman="http://schemas.android.com/apk/res/com.example.imooc_weixin"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- 2.在布局中使用 -->
    <!-- 使用自定义view,要添加的东西 -->
    <!-- xmlns:hyman="http://schemas.android.com/apk/res/com.example.imooc_weixin" -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#3CB371"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/searchView_Button_id"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="7dp"
            android:layout_weight="1"                   
             android:gravity="center_vertical|left"            
            android:text="   任务编号/发布人/金币"
            android:background="@drawable/shape" />

        
    </LinearLayout>

    <!-- ViewPager的常见用法和布局,占据大部分空白的区域 -->

    <android.support.v4.view.ViewPager
        android:id="@+id/id_viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </android.support.v4.view.ViewPager>

    <!-- 作为一个容器,存放四个自定义View,可以理解为一般的Button -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="53dp"
        android:background="@drawable/tag_bg"
        android:orientation="horizontal" >

        <!-- 使用自定义的View的格式,注意命名法,包名加类名 -->

        <com.example.imooc_weixin.ChangeColorIconWithText
            android:id="@+id/id_indicator_one"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="5dp"
            hyman:icon="@drawable/ic_menu_view"
            hyman:text="@string/tab_content"
            hyman:text_size="12sp"
            hyman:color="#ff45c01a" />

        <com.example.imooc_weixin.ChangeColorIconWithText
            android:id="@+id/id_indicator_two"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="5dp"
            hyman:icon="@drawable/ic_menu_myplaces"
            hyman:text="@string/tab_found"
            hyman:text_size="12sp"
            hyman:color="#ff45c01a" />

        <com.example.imooc_weixin.ChangeColorIconWithText
            android:id="@+id/id_indicator_three"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="5dp"
            hyman:icon="@drawable/ic_menu_mylocation"
            hyman:text="@string/tab_dongtai"
            hyman:text_size="12sp"
            hyman:color="#ff45c01a" />

        <com.example.imooc_weixin.ChangeColorIconWithText
            android:id="@+id/id_indicator_four"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:padding="5dp"
            hyman:icon="@drawable/ic_menu_myplaces"
            hyman:text="@string/tab_me"
            hyman:text_size="12sp"
            hyman:color="#ff45c01a" />
    </LinearLayout>

</LinearLayout>

分别创建四个自定义的fragment及其布局文件,,


MainActivity:

public class MainActivity extends FragmentActivity implements OnClickListener,
		OnPageChangeListener {// Activity改为FragmentActivity,因为我们需要FragmentManager

	Button searchView_Button;
	Button shaiXuan_Button;

	private ViewPager mViewPager;// 创建ViewPager对象
	private List<Fragment> mTabs = new ArrayList<Fragment>();// 存放Fragment的地方


	private FragmentPagerAdapter mAdapter;

	private List<ChangeColorIconWithText> mTabIndicators = new ArrayList<ChangeColorIconWithText>();

	/*
	 * 总结: 1.ActionBar的样式,设置样式,改变overFlowButtonStyle;反射,改变一些系统默认的设置
	 * 2.ViewPager + Fragment 3.TabIndicator自定义View
	 * 
	 * 注意:1.那个规律的使用 2.自定义 View:有五点 : 1.attr.xml 2.布局文件中使用 3.构造方法中获取自定义属性
	 * 4.onMeasure操作 5.onDraw操作
	 */

	/*
	 * ViewPager +
	 * Fragment:创建fragment,堆着,放到List里面去,然后得到一个适配器,把ViewPager适配一下适配器就可以
	 * 用TabFragment传递一个Bundle给Fragment才是传递参数的一个好方法
	 */

	/****************************** onCreate ***************************************/

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		searchView_Button = (Button) findViewById(R.id.searchView_Button_id);
		shaiXuan_Button = (Button) findViewById(R.id.shaiXuan_Button_id);
		searchView_Button.setOnClickListener(this);
		shaiXuan_Button.setOnClickListener(this);

//		ActionBar actionBar = getActionBar();// 得到ActionBar
//		// 隐藏ActionBar
//		actionBar.hide();

		initView();//初始化自定义的view(可以理解为Button),设置监听事件

		initDatas();//存放fragment,为viewPager设置设配器

		mViewPager.setAdapter(mAdapter);

		initEvent();//监听滑动
//如果需要加上其他效果,勿忘,所有的初始化顺序,其他效果应该在最后
	}
	
	
	/************************  各种方法         *************************/

	// 初始化滑动事件
	private void initEvent() {

		mViewPager.setOnPageChangeListener(this);// 系统自动监听够不够转

	}

	// 新建的方法,存放数据
	private void initDatas() {
		mTabs.add(new renwu_fragment());
		mTabs.add(new dingdan_fragment());
		mTabs.add(new dongtai_fragment());
		mTabs.add(new me_fragment());

		mViewPager = (ViewPager) findViewById(R.id.id_viewpager);

		// 为Fragment配置Adapter(FragmentPagerAdapter)
		mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

			@Override
			public Fragment getItem(int position) {
				// TODO Auto-generated method stub
				return mTabs.get(position);
			}

			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return mTabs.size();
			}

		};

	}

	// 新建的方法
	private void initView() {
		mViewPager = (ViewPager) findViewById(R.id.id_viewpager);

		// 得到四个自定义的View,并统一放进List中
		ChangeColorIconWithText one = (ChangeColorIconWithText) findViewById(R.id.id_indicator_one);
		mTabIndicators.add(one);
		ChangeColorIconWithText two = (ChangeColorIconWithText) findViewById(R.id.id_indicator_two);
		mTabIndicators.add(two);
		ChangeColorIconWithText three = (ChangeColorIconWithText) findViewById(R.id.id_indicator_three);
		mTabIndicators.add(three);
		ChangeColorIconWithText four = (ChangeColorIconWithText) findViewById(R.id.id_indicator_four);
		mTabIndicators.add(four);

		// 为四个自定义View设置监听
		one.setOnClickListener(this);
		two.setOnClickListener(this);
		three.setOnClickListener(this);
		four.setOnClickListener(this);

		// 设置默认第一个View为绿色,其他的View为透明,原View
		one.setIconAlpha(1.0f);
	}

	// 四个监听事件的操作
	@Override
	public void onClick(View v) {
		clickTab(v); // 重构起来,便于以后监听事件,不然会发生神奇的事情,因为这个额:resetOtherTabs();
		// switch(v.getId()){
		// case
		// }

		switch (v.getId()) {
		case R.id.searchView_Button_id:
			Intent intent = new Intent();
			intent.setClass(MainActivity.this, search_activity.class);
			MainActivity.this.startActivity(intent);
			break;
			
		case R.id.shaiXuan_Button_id:
			Intent sIntent = new Intent();
			sIntent.setClass(MainActivity.this, shaiXuan_activity.class);
			MainActivity.this.startActivity(sIntent);
			break;
			
		default:
			break;
		}

	}

	private void clickTab(View v) {
		// 重置
		resetOtherTabs();

		// 点击事件
		switch (v.getId()) {
		case R.id.id_indicator_one:
			mTabIndicators.get(0).setIconAlpha(1.0f);
			mViewPager.setCurrentItem(0, false);
			break;
		case R.id.id_indicator_two:
			mTabIndicators.get(1).setIconAlpha(1.0f);
			mViewPager.setCurrentItem(1, false);
			break;
		case R.id.id_indicator_three:
			mTabIndicators.get(2).setIconAlpha(1.0f);
			mViewPager.setCurrentItem(2, false);
			break;
		case R.id.id_indicator_four:
			mTabIndicators.get(3).setIconAlpha(1.0f);
			mViewPager.setCurrentItem(3, false);
			break;

		}
	}

	// 重置其他的TabIndeicator的颜色
	private void resetOtherTabs() {
		for (int i = 0; i < mTabIndicators.size(); i++) {
			mTabIndicators.get(i).setIconAlpha(0);
		}
	}

	// Fragment的三个手势事件处理
	@Override
	public void onPageScrollStateChanged(int arg0) {
		// TODO Auto-generated method stub

	}
	@Override
	public void onPageScrolled(int position, float positionOffset,
			int positionOffsetPixels) {

		// 找规律,(这是为了变色而码的,如果只是滑动,这些代码就用自动生成的即可)
		// Log.e("TAG", "position = " + position + "positionOffset = " +
		// positionOffset);

		/*
		 * 找到的规律是: 从第一页到第二页:position = 0; positionOffset范围是0.0到1.0
		 * 从第二页到第一页:position = 0; positionOffset范围是1.0到0.0
		 */
		if (positionOffset > 0) {
			ChangeColorIconWithText left = mTabIndicators.get(position);
			ChangeColorIconWithText right = mTabIndicators.get(position + 1);
			left.setIconAlpha(1 - positionOffset);
			right.setIconAlpha(positionOffset);
		}

	}

	@Override
	public void onPageSelected(int arg0) {
		// TODO Auto-generated method stub

	}


}


三:提一下ViewPager的PagerAdapter

常见的Fragment+ViewPager ,viewPager使用的Adapter是专用的Adapter:

mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

			@Override
			public Fragment getItem(int position) {
				// TODO Auto-generated method stub
				return mTabs.get(position);
			}

			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return mTabs.size();
			}

这个专用的Adapter,很轻便易用


如果在自己有需要重写PagerAdapter的话,需要实现如下方法:

class MyAdapter extends PagerAdapter {
    private List<TouchImageView> mImageViewList;

    public MyAdapter(List<TouchImageView> imageViewList) {//TouchImageView继承ImageView
        super();
        this.mImageViewList = imageViewList;
    }

    /* @Override
    public int getCount() {
        return 0;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return false;
    }*/



    // 获取要滑动的控件的数量,在这里我们以滑动的广告栏为例,那么这里就应该是展示的广告图片的ImageView数量
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mImageViewList.size();
    }

    // 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可,<span style="color: rgb(51, 51, 51); font-family: verdana, Arial, sans-serif; background-color: rgb(241, 246, 250);">判断instantiateItem(ViewGroup container, int position)返回的要加载的pager对象是不是view视图,是则返回true并显示,不是返回false不显示。</span><br style="height: 0px; overflow: hidden; color: rgb(51, 51, 51); font-family: verdana, Arial, sans-serif; background-color: rgb(241, 246, 250);" />
    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        // TODO Auto-generated method stub
        return arg0 == arg1;
    }

    // PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView(mImageViewList.get(position % mImageViewList.size()));
    }


   /* @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
    }*/


    // 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        container.addView(mImageViewList.get(position % mImageViewList.size()));
        return mImageViewList.get(position % mImageViewList.size());
    }


    /*@Override
    public Object instantiateItem(ViewGroup container, int position) {
        return super.instantiateItem(container, position);
    }*/
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章