android :fragment 复用

1.先来看看fragment的代码

[java] view plain copy

import java.util.ArrayList;  

import java.util.List;  


import com.example.fm_reuse.R;  


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 TestFm extends Fragment{  


private List list = new ArrayList();  

private int flag;  

private TextView tv;  

@Override  

public void onCreate(Bundle savedInstanceState) {  

// TODO Auto-generated method stub  

super.onCreate(savedInstanceState);  

Bundle bundle =this.getArguments();  

if(bundle != null){  

list = bundle.getStringArrayList("content");  

flag = bundle.getInt("flag");  

        }  

    }  


@Override  

public View onCreateView(LayoutInflater inflater, ViewGroup container,  

            Bundle savedInstanceState) {  

// TODO Auto-generated method stub  

View view = inflater.inflate(R.layout.fm_test, container,false);  

        initView(view);  

return view;  

    }  


public void initView(View view){  

        tv = (TextView)view.findViewById(R.id.tv);  

        tv.setText(list.get(flag));  

    }  



public static TestFm newInstance(List contentList,int flag){  

Bundle bundle =new Bundle();  

bundle.putStringArrayList("content", (ArrayList) contentList);  

bundle.putInt("flag", flag);  

TestFm testFm =new TestFm();  

        testFm.setArguments(bundle);  

return testFm;  


    }  


}  

fm_test.xml

[html] view plain copy


android:layout_width="match_parent"  

android:layout_height="match_parent"  

android:orientation="vertical" >  


android:id="@+id/tv"  

android:layout_width="match_parent"  

android:layout_height="match_parent"  

android:gravity="center"  

android:textSize="20sp"/>  



上面的代码很简单,newInstance这个方法在实例化fragment时将会用到,传入需要的数据并通过setArguments方法将数据保存,这样,当跳转到当前fragment时就可以在onCreate方法中通过getArguments拿到数据,就是这么的一个过程。下面我们来看一下MainActivity的代码:

[java] view plain copy

import java.util.ArrayList;  

import java.util.List;  


import android.graphics.Color;  

import android.os.Bundle;  

import android.support.v4.app.FragmentActivity;  

import android.support.v4.view.ViewPager;  

import android.view.Display;  

import android.view.Gravity;  

import android.view.View;  

import android.view.WindowManager;  

import android.widget.HorizontalScrollView;  

import android.widget.LinearLayout;  

import android.widget.LinearLayout.LayoutParams;  

import android.widget.TextView;  


import com.example.fm_reuse.adapter.FragmentVPAdapter;  

import com.example.fm_reuse.fragment.TestFm;  


public class MainActivity extends FragmentActivity {  


private List titleList = new ArrayList(); //标题链表  

private List contentList = new ArrayList(); //内容链表  

private List fragmentList = new ArrayList(); //碎片链表  

private int screenWidth; //屏幕宽度  

private ViewPager vp;  

private HorizontalScrollView scrollView;  

private List textViews = new ArrayList();  


@Override  

protected void onCreate(Bundle savedInstanceState) {  

super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  


initList();//初始化内容和标题  


//获取屏幕宽度  

WindowManager windowManager =this.getWindowManager();  

        Display display = windowManager.getDefaultDisplay();  

        screenWidth = display.getWidth();  


        vp = (ViewPager)findViewById(R.id.viewPager);  

        scrollView = (HorizontalScrollView)findViewById(R.id.scrollView);  


//有多少个标题就有多少个碎片,动态添加  

for(int i=0;i

TestFm testFm =new TestFm().newInstance(contentList, i);  

            fragmentList.add(testFm);  

        }  


//初始化导航栏布局  

LinearLayout navigationLl =new LinearLayout(this);  

LinearLayout.LayoutParams mParams =new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  

        navigationLl.setLayoutParams(mParams);  

        navigationLl.setOrientation(LinearLayout.HORIZONTAL);  

        navigationLl.setBackgroundColor(Color.GREEN);  


//往导航栏添加标题  

if(titleList.size() <= 3){ //标题栏小于4个时,平分屏幕宽度  

LinearLayout.LayoutParams params =new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  

params.weight =1;  

for (int i = 0; i < titleList.size(); i++) {  

final TextView tv = new TextView(this);  

                    tv.setText(titleList.get(i));  

                    tv.setGravity(Gravity.CENTER);  

final int finalI = i;  

tv.setOnClickListener(new View.OnClickListener() {  

@Override  

public void onClick(View view) {  

                            tv.setTextColor(Color.RED);  

                            vp.setCurrentItem(finalI);  

                        }  

                    });  

                    textViews.add(tv);  

navigationLl.addView(tv, params);//往导航栏添加标题  

                }  

        }  


if(titleList.size() > 3){ //标题大于四个,重新规划textView大小  

LinearLayout.LayoutParams params1 =new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  

params1.width =300;  

            params1.height = LayoutParams.MATCH_PARENT;  


for (int i = 0; i < titleList.size(); i++) {  

final TextView tv = new TextView(this);  

                tv.setText(titleList.get(i));  

                tv.setGravity(Gravity.CENTER);  

final int finalI = i;  

tv.setOnClickListener(new View.OnClickListener() {  

@Override  

public void onClick(View view) {  

                        tv.setTextColor(Color.RED);  

                        vp.setCurrentItem(finalI);  

                    }  

                });  

                textViews.add(tv);  

                navigationLl.addView(tv, params1);  

            }  

        }  


//第一个标题默认红色  

if (textViews != null && textViews.size() > 0) {  

textViews.get(0).setTextColor(Color.RED);  

            }  


scrollView.addView(navigationLl);//往scrollView添加导航栏  


vp.setAdapter(new FragmentVPAdapter(getSupportFragmentManager(), (ArrayList) fragmentList));  

vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  

@Override  

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


                }  


@Override  

public void onPageSelected(int position) {  

                    setSelect(position);  

if(position>=4){  

scrollView.scrollBy((int) (0.25*screenWidth), 0);  

}else if(position<4){  

scrollView.scrollBy(-(int) (0.25*screenWidth), 0);  

                    }  

                }  


@Override  

public void onPageScrollStateChanged(int state) {  


                }  

            });  



    }  



public void setSelect(int position) {  

            vp.setCurrentItem(position);  

for (int i = 0; i < textViews.size(); i++) {  

                textViews.get(i).setTextColor(Color.BLACK);  

            }  

            textViews.get(position).setTextColor(Color.RED);  


        }  


public void initList(){  

//添加标题  

titleList.add("标题一");  

titleList.add("标题二");  

titleList.add("标题三");  

titleList.add("标题四");  

titleList.add("标题五");  

titleList.add("标题六");  


//添加内容  

contentList.add("页面一");  

contentList.add("页面二");  

contentList.add("页面三");  

contentList.add("页面四");  

contentList.add("页面五");  

contentList.add("页面六");  

    }  



}  

注释也写得很清楚了,所以就不多说了,相信大家都能看懂。

activity_main.xml

[html] view plain copy

xmlns:tools="http://schemas.android.com/tools"  

android:layout_width="match_parent"  

android:layout_height="match_parent"  

android:orientation="vertical"  

tools:context=".MainActivity" >  


android:id="@+id/scrollView"  

android:layout_width="match_parent"  

android:layout_height="50dp"  

android:fillViewport="true"  

android:scrollbars="none"  

>  



android:id="@+id/viewPager"  

android:layout_width="match_parent"  

android:layout_height="match_parent" >  




最后把viewpager的适配器的代码也贴出来:


import android.support.v4.app.Fragment;  

import android.support.v4.app.FragmentManager;  

import android.support.v4.app.FragmentPagerAdapter;  

import android.support.v4.app.FragmentTransaction;  


import java.util.ArrayList;  


import com.example.fm_reuse.fragment.TestFm;  


/**

 * Created by _H_JY on 2015/11/23.

 */  



public class FragmentVPAdapter extends FragmentPagerAdapter {  

private ArrayList fragments;  

private FragmentManager fm;  

public FragmentVPAdapter(FragmentManager fm, ArrayList fragments) {  

super(fm);  

this.fm = fm;  

this.fragments = fragments;  

    }  


public void setFragments(ArrayList fragments) {  

if(this.fragments != null){  

            FragmentTransaction ft = fm.beginTransaction();  

for(Fragment f:this.fragments){  

                ft.remove(f);  

            }  

            ft.commit();  

ft=null;  

            fm.executePendingTransactions();  

        }  

this.fragments = fragments;  

        notifyDataSetChanged();  

    }  


@Override  

public int getItemPosition(Object object) {  

return POSITION_NONE;  

    }  


@Override  

public Fragment getItem(int arg0) {  

return fragments.get(arg0);  

    }  


@Override  

public int getCount() {  

return fragments.size();  

    }  

}  

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,671评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,442评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,524评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,623评论 1 275
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,642评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,584评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,953评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,621评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,865评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,608评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,698评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,378评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,958评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,940评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,173评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,419评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,425评论 2 342

推荐阅读更多精彩内容