Android viewpager+fragment實現動態載入碎片(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 動態載入APK(Fragment 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應用程序中進行作業調度提供了簡單卻強大的機制,它支持定時任務持久化到數據庫,從而避免了重啟服務器時任務丟失,支持分布式多節