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