1. 程式人生 > >Android viewpager+fragment實現動態載入碎片(fragment重複使用)

Android viewpager+fragment實現動態載入碎片(fragment重複使用)

    距離上次發部落格好像已經至少有兩個月的時間了,不禁感嘆時間過得真快,也是因為專案一直在忙,所以沒來發部落格,今天有閒情就來一發。好了,廢話不多說,今天講的是fragment複用的問題,提到碎片,相信大家都不陌生,fragment寄宿於Activity,依activity之存而存,依其銷燬而銷燬。今天我們大概要實現什麼樣的效果呢,那就是一個fragment
重複使用,通過點選介面上方的導航欄不同的標題向fragment傳遞不同的資料,從而達到動態載入fragment的目的。好了,下面直接看程式碼:


1.先來看看fragment的程式碼

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<String> list = new ArrayList<String>();
	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<String> contentList,int flag){
		Bundle bundle = new Bundle();
		bundle.putStringArrayList("content", (ArrayList<String>) contentList);
		bundle.putInt("flag", flag);
		TestFm testFm = new TestFm();
		testFm.setArguments(bundle);
		return testFm;
		
	}
	
}

fm_test.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="20sp"/>

</LinearLayout>



上面的程式碼很簡單,newInstance這個方法在例項化fragment時將會用到,傳入需要的資料並通過setArguments方法將資料儲存,這樣,當跳轉到當前fragment時就可以在onCreate方法中通過getArguments拿到資料,就是這麼的一個過程。下面我們來看一下MainActivity的程式碼:
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<String> titleList = new ArrayList<String>(); //標題連結串列
	private List<String> contentList = new ArrayList<String>(); //內容連結串列
	private List<TestFm> fragmentList = new ArrayList<TestFm>(); //碎片連結串列
	private int screenWidth; //螢幕寬度
	private ViewPager vp;
	private HorizontalScrollView scrollView;
	private List<TextView> textViews = new ArrayList<TextView>();
	
	@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<titleList.size();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<TestFm>) 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

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

    <HorizontalScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:fillViewport="true"
        android:scrollbars="none"
        >
    </HorizontalScrollView>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>

</LinearLayout>


最後把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<TestFm> fragments;
    private FragmentManager fm;
    public FragmentVPAdapter(FragmentManager fm, ArrayList<TestFm> fragments) {
        super(fm);
        this.fm = fm;
        this.fragments = fragments;
    }

    public void setFragments(ArrayList<TestFm> 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();
    }
}
執行結果圖我就不貼了,後面我再把原始碼補充上去。


相關推薦

Android viewpager+fragment實現動態載入碎片fragment重複使用

    距離上次發部落格好像已經至少有兩個月的時間了,不禁感嘆時間過得真快,也是因為專案一直在忙,所以沒來發部落格,今天有閒情就來一發。好了,廢話不多說,今天講的是fragment複用的問題,提到碎片,相信大家都不陌生,fragment寄宿於Activity,依activi

用ExtJS 實現動態載入Load tree

  用ExtJS 實現動態載入樹(Load tree) 1、資料庫背景:這裡有一個組織機構表,結構如下: Oracle DDL指令碼: createtable ORGANIZATION( ORGIDNUMBER(10) notnull, PARENTIDNUMBER(1

實現Android 動態載入APKFragment or Activity實現

最近由於專案太大了,導致編譯通不過(Android對一個應用中的方法個數貌似有限制),所以一直琢磨著能否將某些模組的APK不用安裝,動態載入,通過在網上查詢資料和網友的幫助,終於實現了APK的動態載入,網路上介紹APK動態載入的文章非常多,但是我覺得寫得非常好的就是這位大牛

Android 使用ViewPager真正實現左右無限滑動附原始碼

package com.viewpager; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import an

自己動手實現作業系統載入程式OS bootloader——藉助QEMU/GDB/losetup/dd等工具

    載入程式可以認為是PC加電啟動後執行的第一段程式碼,它是一段長度為512位元組的16位運行於真實模式的程式碼。事實上,機器啟動後會首先執行0xFFFF0處(也有的資料說是0xFFFFFFF0,BIOS這塊我也不熟:-( )ROM中的BIOS程式碼,之後會跳轉到0x0

頁面上動態載入內容checkbox框,選中取消事件

動態載入checkbox之後,選中,取消事件, //動態載入的checkbox內容 var dataObj = $.parseJSON(datas).CGYY;//datas為查找

asp.net頁面通過Javascript使用CanvasJS.Chart畫曲線,曲線實現動態載入後臺資料通過ajax

頁面程式碼: <html> <head> <script src="jQuery.js" type="text/javascript"></script> <script src="https://canvasjs.com/assets/

Android安全/開發基礎--10--圖形介面UI碎片Fragment

10-1、View理論 View的事件體系 View是Android中所有控制元件的基類。ViewGroup是控制元件組,內部包含了許多控制元件。 view的四個位置屬性:top、left、right、bottom MotionEvent:手指接觸屏幕後產生的

Android安全/開發基礎--11--圖形介面UI碎片Fragment

10-9、UI fragment與fragment管理器 採用fragment而不是activity來管理應用UI,可繞開Android系統activity使用規則的限制。fragment是一種控制器物件,activity可委派它執行任務。這些任務通常就是管理使

Android中的Fragment——02(Fragment動態載入)

動態載入和靜態載入:----所謂的靜態載入,不過是用xml定義的方式,將Fragment載入進記憶體---- 而動態載入,不過是通過程式碼 將一個Fragment載入進記憶體罷了 ----add(..) : 新增一個Fragment(指定要新增的Fragment和要插入的Vi

Android--Fragment 實現載入和不重複載入

基類: package fragment; import android.support.v4.app.Fragment; import android.view.View; /** * Cr

android中 程式碼實現截圖功能靜態+動態視訊

分享下靜態截圖的功能程式碼: public class ScreenShot { // 獲取指定Activity的截圖,儲存到png檔案 static Bitmap takeScreenShot(Activity activity) { L

Android UI-實現底部切換標籤fragment)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"

viewpager實現翻頁效果fragment

viewpager的運用核心在於介面卡的編寫,及最終的setadapter(adapter) 谷歌官方認為,ViewPager應該和Fragment一起使用時,此時ViewPager的介面卡是FragmentPagerAdapter,當你實現一個Fragmen

Android碎片Fragment的生命週期

1. 執行狀態 當一個碎片是可見的,並且它所關聯的活動正處於執行狀態時,該碎片也處於執行狀態。2. 暫停狀態 當一個活動進入暫停狀態時(由於另一個未佔滿螢幕的活動被新增到了棧頂),與它相關聯的可見碎片就會進入到暫停狀態。3. 停止狀態 當一個活動進入停止狀態時,與它相關聯的碎

Android Fragment實現載入

在最近的專案中一個介面中有四個Fragment。每個碎片中都要進行網路請求。 週期也開始並進行了載入。後來在網上進行了搜尋找到了一個非常簡單的官方自帶的方法setUserVisibleHint(boolean isVisibleToUser)。我們可以通過這

android Activity.this.getLayoutInflater()::動態載入佈局檔案,實現彈窗效

activity類的拓展方法1:getLayoutInflater():將layout的xml佈局檔案例項化為View類物件,實現動態載入佈局 MainActivity.java package com.example.dynamiclayout; import and

Android模仿iOS實現側滑返回類似微信

actionbar fin kth ins any lean blog 模仿 over 我們都知道側滑返回操作是 iOS 裏面比較常見的功能,一般是手指在靠近手機屏幕左邊緣向右滑動就可以關閉當前的界面,iOS 系統提供了這樣的 API,但是 Android 怎麽實現呢? 網

Android ViewPager+HorizontalScrollView實現標題欄滑動(騰訊新聞)

flat off net 單位 上一個 undle scrollto 一起 ava 1) ViewPager提供了左右滑動切換頁面的方法,但是它所提供的標題只是無語,估計沒有真正的項目會照搬拿過來;並且它只能一頁一頁滑,我想直接查看最後一頁要滑半天; 2) 看了騰訊新聞客

springboot和quartz整合實現動態定時任務持久化單節點

依賴 1.5 ostc read 自動 1.8 自動註入 etc string   Quartz是一個完全由java編寫的開源作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制,它支持定時任務持久化到數據庫,從而避免了重啟服務器時任務丟失,支持分布式多節