基於Fragment的外掛程式化

2021-09-07 20:44:03 字數 4137 閱讀 4648

--《摘自android外掛程式化開發指南》

2.activity切換fragment頁面

第一步:fragmentloaderactivity作為fragment的承載容器

<

activity

android:name

=".fragmentloaderactivity"

>

<

intent-filter

>

<

action

android:name

/>

<

category

android:name

="android.intent.category.default"

/>

intent-filter

>

activity

>

public

class basehostactivity extends

activity

protected

void

loadresources()

catch

(exception e)

resources superres = super

.getresources();

mresources = new

resources(massetmanager, superres.getdisplaymetrics(),

superres.getconfiguration());

mtheme =mresources.newtheme();

mtheme.setto(

super

.gettheme());

}@override

public

assetmanager getassets()

@override

public

resources getresources()

@override

public

theme gettheme()

}

public

class fragmentloaderactivity extends

basehostactivity );

object instance = localconstructor.newinstance(new

object {});

fragment f =(fragment) instance;

fragmentmanager fm =getfragmentmanager();

fragmenttransaction ft =fm.begintransaction();

ft.add(r.id.container, f);

ft.commit();

} catch

(exception e)

}}

第二步:

mainactivity跳轉到fragmentloaderactivity,傳兩個引數(dexpath和fragment的名稱),fragmentloaderactivity根據引數載入對應的fragment

intent intent = new

startactivity(intent);

3.外掛程式內部的fragment跳轉

public

class basefragment extends

fragment

public

void setcontainerid(int

containerid)

}

public

class fragment2 extends

basefragment

view.findviewbyid(r.id.btnreturn).setonclicklistener(

newview.onclicklistener()

});return

view;

}}

public

class fragment1 extends

basefragment

});return

view;

}}

其實就是利用fragmentmanager動態切換fragment技術來實現

4.外掛程式fragment跳轉外掛程式外部的fragment(包括宿主中的,另乙個外掛程式中的)

第一步:把宿主和外掛程式的資源都合併到一起,這樣就能想用哪個資源就用哪個資源

public

class

pluginmanager

}reloadinstalledpluginresources(pluginpaths);

} catch

(exception e)

}private

static

pluginitem generatepluginitem(string apkname)

private

static

void reloadinstalledpluginresources(arraylistpluginpaths)

resources newresources = new

resources(assetmanager,

mbasecontext.getresources().getdisplaymetrics(),

mbasecontext.getresources().getconfiguration());

refinvoke.setfieldobject(mbasecontext, "mresources", newresources);

//這是最主要的需要替換的,如果不支援外掛程式執行時更新,只留這乙個就可以了

refinvoke.setfieldobject(mpackageinfo, "mresources", newresources);

//清除一下之前的resource的資料,釋放一些記憶體

//因為這個resource有可能還被系統持有著,記憶體都沒被釋放

//clearresoucesdrawablecache(mnowresources);

mnowresources =newresources;

//需要清理mtheme物件,否則通過inflate方式載入資源會報錯

//如果是activity動態載入外掛程式,則需要把activity的mtheme物件也設定為null

refinvoke.setfieldobject(mbasecontext, "mtheme", null

); }

catch

(throwable e)

}}

第二步:把所有的外掛程式的classloader都放進乙個集合myclassloaders,在fragmentloaderactivity中,使用myclassloaders來載入相應外掛程式的fragment

public

class

myclassloaders

public

class fragmentloaderactivity extends

activity

else

fragment.setcontainerid(android.r.id.primary);

fragmentmanager fm =getfragmentmanager();

fragmenttransaction ft =fm.begintransaction();

ft.replace(android.r.id.primary, fragment);

ft.commit();

} catch

(exception e)

}@override

public

resources getresources()

}

fragment外掛程式化的好處避開了activity必須要面對ams的尷尬

避免fragment 重新例項化

在專案中需要進行fragment的切換,一直都是用replace 方法來替換fragment 但是,這樣會有乙個問題 應該很多朋友都遇到過 每次切換的時候,fragment都會重新例項化,也就是執行oncreatview 方法 那麼如何讓多個fragment彼此切換時不重新例項化?正確的切換方式是a...

基於jQuery 的外掛程式開發

談到jquery,對於開發人員是再熟悉不過了,從其誕生發展到到目前,一路走來,歷經風雨變化十幾載,依舊是開發人員使用最廣泛 最常用 也是最成熟的js庫。但其再成熟也不可能開發出所有的功能,於是乎就用了外掛程式這麼一說,用來拓展和補充jquery 的功能。外掛程式開發最常用的兩種方法 1.擴充套件 j...

火狐外掛程式安裝 基於web自動化測試

一 firebug 安裝 1 打 狐瀏覽器 選擇右上角 開啟選單 圖一 附件元件 圖二 圖一圖二 2 點選 擴充套件 圖三 用於所有附加元件的工具 圖四 選擇 從檔案安裝附加元件 圖三 圖四 3 找到firebug 2.0.16 xpi的路徑 點選開啟 圖五 4 彈出框點選 安裝 5 重啟瀏覽器按下...