一: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()) {@Overridepublic Fragment getItem(int position) {// TODO Auto-generated method stubreturn mTabs.get(position);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn 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为透明,原Viewone.setIconAlpha(1.0f);}// 四个监听事件的操作@Overridepublic 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的三个手势事件处理@Overridepublic 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);}}@Overridepublic 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); }*/}