Skip to content
This repository has been archived by the owner on Jun 6, 2019. It is now read-only.

Weex 扩展(Extend to Android) #27

Open
xkli opened this issue Jun 27, 2016 · 10 comments
Open

Weex 扩展(Extend to Android) #27

xkli opened this issue Jun 27, 2016 · 10 comments

Comments

@xkli
Copy link

xkli commented Jun 27, 2016

本文档已迁移至 https://weex-project.io/cn/references/advanced/extend-to-android.html , 此处不再维护,谢谢。

Weex 扩展(Extend to Android)

Weex 提供了扩展机制,可以根据自己的业务进行定制自己的功能。
主要分为两类扩展:

  • Module 扩展 非UI的特定功能。例如sendHttp、openURL 等。
  • Component 扩展 实现特别功能的Native控件。例如:RichTextview,RefreshListview等。
  • Adapter 扩展 Weex 对一些基础功能实现了统一的接口,可实现这些接口来定制自己的业务。例如:图片下载等。

Module 扩展

  1. Module扩展必须继承WXModule类。
  2. 扩展方法必须加上@WXModuleAnno 注解。Weex会根据注解来判断当前方法是否要运行在UI线程,和当前方法是否是扩展方法。
  3. Weex是根据反射来进行调用Module扩展方法,所以Module中的扩展方法必须是public类型。
  4. 同样因为是通过反射调用,Module不能被混淆。请在混淆文件中添加代码:-keep public class * extends com.taobao.weex.common.WXModule{*;}
  5. Module 扩展的方法可以使用int, double, float, String, Map, List 类型的参数
  6. 完成Module后一定要在初始化时注册 WXSDKEngine.registerModule("myModule", MyModule.class); 否则会报类似错误:ReportException :undefined:9: TypeError: Object #<Object> has no method 'printLog'

示例如下:

public class MyModule extends WXModule {

  @WXModuleAnno(runOnUIThread = true)
  public void printLog(String msg) {
    Toast.makeText(mWXSDKInstance.getContext(),msg,Toast.LENGTH_SHORT).show();
  }
}

JS 调用如下:

<template>
  <div>
    <text onclick="click">点击我测试</text>
  </div>
</template>

<script>
  module.exports = {
    methods: {
      click: function() {
        require('@weex-module/myModule').printLog("我是一个测试!");
      }
    }
  }
</script>

Component 扩展

  1. Component 扩展类必须集成WXComponent.
  2. Component 对应的设置属性的方法必须添加注解@WXComponentProp(name=value(value is attr or style of dsl))
  3. Weex sdk 通过反射调用对应的方法,所以Component对应的属性方法必须是public,并且不能被混淆。请在混淆文件中添加代码 -keep public class * extends com.taobao.weex.ui.component.WXComponent{*;}
  4. Component 扩展的方法可以使用int, double, float, String, Map, List 类型的参数
  5. 完成Component后一定要在初始化时注册 WXSDKEngine.registerComponent("richtext",RichText.class);

示例如下:

public class RichText extends WXComponent {

  public RichText(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, boolean isLazy) {
    super(instance, dom, parent, isLazy);
  }

  @Override
  protected void initView() {
    mHost=new TextView(mContext);
    ((TextView)mHost).setMovementMethod(LinkMovementMethod.getInstance());
  }

  @WXComponentProp(name = "tel")
  public void setTelLink(String tel){
    SpannableString spannable=new SpannableString(tel);
    spannable.setSpan(new URLSpan("tel:"+tel),0,tel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    ((TextView)mHost).setText(spannable);
  }
}

JS 调用如下:

<template>
  <div>
    <richText tel="12305" style="width:200;height:100">12305</text>
  </div>
</template>

Adapter扩展

图片下载:
需要时集成接口IWXImgLoaderAdapter,实现setImage 方法。
示例如下:

public class ImageAdapter implements IWXImgLoaderAdapter {

  public ImageAdapter() {
  }

  @Override
  public void setImage(final String url, final ImageView view,
                       WXImageQuality quality, WXImageStrategy strategy) {

    WXSDKManager.getInstance().postOnUiThread(new Runnable() {

      @Override
      public void run() {
        if(view==null||view.getLayoutParams()==null){
          return;
        }
        if (TextUtils.isEmpty(url)) {
          view.setImageBitmap(null);
          return;
        }
        String temp = url;
        if (url.startsWith("//")) {
          temp = "http:" + url;
        }
        if (view.getLayoutParams().width <= 0 || view.getLayoutParams().height <= 0) {
          return;
        }
        Picasso.with(WXEnvironment.getApplication())
            .load(temp)
            .into(view);
      }
    },0);
  }
}

注:工程要添加依赖 compile 'com.squareup.picasso:picasso:2.5.2'

@lvscar
Copy link

lvscar commented Jun 29, 2016

another chinese translation Android扩展 by @wangrunxiang

@liuguangli
Copy link

可以自己扩展实现网络请求么。

@Jinjiang
Copy link
Contributor

@liuguangli 可以

@cnx2016
Copy link

cnx2016 commented Nov 24, 2016

这不是三类扩展么?

@jiantao88
Copy link

这个例子RichText运行时 android端无法显示啊,按照demo里操作的,Weex那还需要引用么?

@yundongbot
Copy link

@liuguangli
可以,不过 Weex stream module 支持网络请求 http://alibaba.github.io/weex/cn/doc/modules/modal.html

@yulinho
Copy link

yulinho commented Jan 5, 2017

Module 扩展 可以用 callback.invoke 回调,那 Component 扩展如何实现回调 WEEX 里面的方法?

@yulinho
Copy link

yulinho commented Jan 5, 2017

可以了,参考 web 组件源码,用 fireevent 实现。

@yundongbot
Copy link

本文档已迁移至 https://weex-project.io/cn/references/advanced/extend-to-android.html , 此处不再维护,谢谢。

@AllenVork
Copy link

新地址404。我想问 调用 RichText 的 .we 代码是应该转换成 .js 代码然后调用的吧,但是这个转换异常啊

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants