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);
    }*/
}






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