private String[] tab_array;
private DemandAdapter mDemandAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
// 给viewpager设置适配器
setViewPagerAdapter();
setTabBindViewPager();
setItem();
}
private void initData() {
tab_array = getResources().getStringArray(R.array.tab_main);
}
private void initView() {
mMViewPager = (ViewPager) findViewById(R.id.mViewPager);
mToolbarTab = (TabLayout) findViewById(R.id.toolbar_tab);
}
private void setViewPagerAdapter() {
mDemandAdapter = new DemandAdapter(getSupportFragmentManager());
mMViewPager.setAdapter(mDemandAdapter);
}
private void setTabBindViewPager() {
mToolbarTab.setupWithViewPager(mMViewPager);
}
private void setItem() {
/**
- 一定要在设置适配器之后设置Icon
*/
for (int i = 0; i < mToolbarTab.getTabCount(); i++) {
mToolbarTab.getTabAt(i).setCustomView(getTabView(i));
}
}
public View getTabView(int position) {
View view = LayoutInflater.from(this).inflate(R.layout.item_tab, null);
ImageView tab_image = view.findViewById(R.id.tab_image);
TextView tab_text = view.findViewById(R.id.tab_text);
tab_image.setImageResource(tabIcons[position]);
tab_text.setText(tab_array[position]);
return view;
}
/**
- 适配器
*/
public class DemandAdapter extends FragmentStatePagerAdapter {
public DemandAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
/**
-
在使用createObject前,需要再此页面之前已经存在activity,初始化Small,
-
否则获取不到Fragment,都是null
*/
Fragment fragment = Small.createObject(“fragment-v4”, fragments[position],
MainActivity.this);
return fragment;
}
@Override
public int getCount() {
return tabIcons.length;
}
}
}
特别要注意:
- 使用Small.createObject(“fragment-v4”, fragments[position],
MainActivity.this);来获取fragment时,各个插件模块的fragment命名一定要是MainFragment不然会出现空指针异常,这是Small框架的问题,在反射调用时已经写死了,同时需要在bundle.json中配置,一般直接创建在跟包名下面:
- 在使用createObject前,需要再此页面之前已经存在activity,初始化Small,例如我这里已经有了个启动页面LaunchActivity,不然也会出现空指针
-
如果这个时候要运行代码看效果,记得要执行as编译依次为cleanLib->cleanBundle->buildLib->buildBundle,、
-
记住在每次写完代码,运行到手机的时候都要进行此4部,否则新写的代码无效!
- _********插件之间的数据传递********_
一、跳转到Chat模块主页
在app.chat创建MainActivity,其实插件模块是一个可以独立运行的应用,和平时项目中的MainActivity没有区别,可看做独立的应用看待。
切记,在bundle.json中配置,我上面已经配置好了,包括后面要用的FromHomeActivity。并且运行时别忘了上面的那4部,后面不在说明。
{
“uri”: “chat”,
“pkg”: “tsou.cn.app.chat”,
“rules”: {
“FromHomeActivity”: “tsou.cn.app.chat.activity.FromHomeActivity”
}
}
执行代码如下:
Small.setUp(getContext(), new Small.OnCompleteListener() {
@Override
public void onComplete() {
Small.openUri(“chat”, getContext());
}
});
注意:Small.setUp是验证插件是否加载完成, Small.openUri是执行跳转
如果确定插件已经加载过了,或者这当前module内部进行跳转可以直接使用 Small.openUri
二、不带参数跳转到Chat模块指定Activity(FromHomeActivity)
执行代码如下:
Small.setUp(getContext(), new Small.OnCompleteListener() {
@Override
public void onComplete() {
/**
-
Small.openUri(“chat”, getContext());
-
直接跳转chat模块的主页。
-
Small.openUri(“chat/FromHomeActivity”, getContext());
-
跳转指定页面
*/
Small.openUri(“chat/FromHomeActivity”, getContext());
}
});
三、带参数跳转到Chat模块指定Activity(FromHomeActivity)
执行代码如下:
Small.setUp(getContext(), new Small.OnCompleteListener() {
@Override
public void onComplete() {
Small.openUri(“chat/FromHomeActivity?name=huangxiaoguo&age=25”, getContext());
}
});
FromHomeActivity中接收数据并使用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_from_home);
initData();
initView();
}
private void initData() {
Uri uri = Small.getUri(this);
if (uri != null) {
name = uri.getQueryParameter(“name”);
age = uri.getQueryParameter(“age”);
}
}
private void initView() {
mTextview = (TextView) findViewById(R.id.textview);
if (!TextUtils.isEmpty(name) && !TextUtils.isEmpty(age)) {
mTextview.setText(“name=” + name + “,age=” + age);
// UIUtils.showToast(“name=” + name + “,age=” + age);
}
四、small支持本地网页组件
small可以直接支持本地网页,我们不用再自己写一个webview页面了!
但是这里的本地网页组件功能很有限,只能显示比较简单的网页,复杂的暂时不支持,会崩溃,具体你可以试试就知道了。
//Small.openUri(“http://www.baidu.com”, getContext());
Small.openUri(“https://github.com/wequick/Small/issues”, getContext());
break;
五、使用eventBus数据传输
原理不说了,直接上代码
compile ‘org.simple:androideventbus:1.0.5.1’
public interface EvenBusTag {
String EVENT_GET_DATA = “evevt_get_data”;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
EventBus.getDefault().register(this);
View view = inflater.inflate(R.layout.fragment_home, null);
initView(view);
return view;
}
@Override
public void onDestroyView() {
EventBus.getDefault().unregister(this);
ThreadUtils.cancelLongBackThread();
super.onDestroyView();
}
@Subscriber(tag = EvenBusTag.EVENT_GET_DATA)
public void onEvent(String s) {
UIUtils.showToast(s);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.btn_fack_eventbus:
EventBus.getDefault().post(“eventBus从FromHomeActivity中返回数据了”, EvenBusTag.EVENT_GET_DATA);
finish();
break;
}
}
友好提示:我的这里的所有公用compile引入和一些自己定义的字段都放在lib.data中,因为我这里只有这个依赖库是专门提供给当前产品使用的,在开发新的产品时别的依赖库方便直接使用,我个人感觉方便点,当然看你自己想法!
六、插件化更新
- 修改代码
我修改的是app.chat中FromHomeActivity
在参数传递过来的时候,弹个吐司:
UIUtils.showToast(“name=” + name + “,age=” + age);
- 记得修改版本号:
versionCode 2 1——>2
versionName “1.1” 1.0->1.1
注意你修改的哪个插件修改哪个插件的版本即可,不是宿主app模块,我这里修改的是app.chat
-
两步:buildLib->buildBundle
-
查找so,在你的宿主模块中
- 部署服务器,我直接在我的电脑上部署一个tomcat
- 服务器的bundle.json
{
“manifest”: {
“bundles”: [
{
“pkg”: “tsou.cn.lib.data”,
“uri”: “lib.data”
},
{
“pkg”: “tsou.cn.lib.utils”,
“uri”: “lib.utils”
},
{
“pkg”: “tsou.cn.lib.style”,
“uri”: “lib.style”
},
{
“pkg”: “tsou.cn.lib.layout”,
“uri”: “lib.layout”
},
{
“pkg”: “tsou.cn.lib.icon”,
“uri”: “lib.icon”
},
{
“pkg”: “tsou.cn.app.home”,
“uri”: “home”
},
{
“pkg”: “tsou.cn.app.chat”,
“rules”: {
“FromHomeActivity”: “tsou.cn.app.chat.activity.FromHomeActivity”
},
“uri”: “chat”
},
{
“pkg”: “tsou.cn.app.recom”,
“uri”: “recom”
},
{
“pkg”: “tsou.cn.app.me”,
“uri”: “me”
}
],
“version”: “1.0.0”
},
“updates”: [
{
“pkg”: “tsou.cn.app.chat”,
“url”: “http://192.168.19.125:8080/json/libtsou_cn_app_chat.so”
}
]
}
- 实现插件化更新
/**
- 插件化更新
*/
private void checkUpgrade() {
new UpgradeManager(getContext()).checkUpgrade();
}
private static class UpgradeManager {
private static class UpdateInfo {
public String packageName;
public Strin