Android扩展 #28

Open
wangrunxiang opened this Issue Jun 27, 2016 · 12 comments

Projects

None yet
@wangrunxiang

Android扩展

模块扩展

Weex SDK 支持模块扩展,Weex SDK 只提供渲染的功能,而不是有其他的功能,比如网络,图片和URL重定向。如果你需要其他功能,你需要自己去实现它。

例子: 如果你想实现一个地址跳跃的功能 你可以按照以下步骤去实现一个模块

自定义模块的步骤

  1. 自定义模块必须继承 WXModule
  2. 必须添加@WXModuleAnno注解,因为他是唯一识别Weex的途径
  3. 方法的访问权限必须是 public
  4. 模块的class不能是内部类
  5. 不能使用ProGuard之类的混淆器去混淆
  6. 模块的方法要在UI线程使用,不要在这里放一些耗时的操作
  7. Weex的参数可以是int,double,float,String,Map,List和实现 WXObject接口的类

参照下面的例子

    import android.content.Intent;
    import android.net.Uri;
     ……………………

    public class WXEventModule extends WXModule{

    private static final String WEEX_CATEGORY="com.taobao.android.intent.category.WEEX";

    @WXModuleAnno
    public void openURL(String url){
        if (TextUtils.isEmpty(url)) {
            return;
        }
        StringBuilder builder=new StringBuilder("http:");
        builder.append(url);
        Uri uri = Uri.parse(builder.toString());
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        intent.addCategory(WEEX_CATEGORY);
        mWXSDKInstance.getContext().startActivity(intent);
       }
    }

模块注册

/**
   * Register module. This is a wrapper method for
   * {@link WXModuleManager#registerModule(String, Class)}. 
   * The module register here only needto
   * be singleton in {@link WXSDKInstance} level.
   * @param moduleName  module name
   * @param moduleClass module to be registered.
   * @return true for registration success, false for otherwise.
   * @see {@link WXModuleManager#registerModule(String, Class, boolean)}
   */
  WXSDKEngine.registerModule("event", WXEventModule.class);

组件扩展

weex有label,image,div,scroll等等的组件,你也可以自定义你自己的组件 #### 自定义组件的步骤 1. 自定义组件必须去继承WXComponent 或者 WXContainer 2. @WXComponentProp(name=value(value is attr or style of dsl)) for it be recognized by weex SDK. 3. 方法的访问权限必须是 **public** 4. 组件的class不能是内部类 5. 不能使用ProGuard之类的混淆器去混淆 6. 模块的方法要在UI线程使用,不要在这里放一些耗时的操作 7. Weex的参数可以是int,double,float,String,Map,List和实现 WXObject接口的类

参照下面的例子

    package com.taobao.weextest;
    ………………

    public class MyViewComponent extends WXComponent{ 
    public MyViewComponent(WXSDKInstance instance, WXDomObject dom,
                       WXVContainer parent, String instanceId, boolean isLazy) 
     { 
     public MyViewComponent(WXSDKInstance instance, WXDomObject dom,
       WXVContainer parent, String instanceId, boolean isLazy) {
      super(instance, dom, parent, instanceId, isLazy);
     }


     @Override
     protected void initView() {
        mHost = new TextView(mContext);
     }
     @WXComponentProp(name=WXDomPropConstant.WX_ATTR_VALUE)
     public void setMyViewValue(String value) {
        ((TextView)mHost).setText(value);
     }
    }

注册组件

  /**
   * Register component. The registration is singleton in {@link WXSDKEngine} level
   * @param type name of component. Same as type filed in the JS.
   * @param clazz the class of the {@link WXComponent} to be registered.
   * @param appendTree true for appendTree flag
   * @return true for registration success, false for otherwise.
   * @throws WXException Throws exception if type conflicts.
   */   
   WXSDKEngine.registerComponent("MyView", MyViewComponent.class);

扩展适配器

IWXImgLoaderAdapter

Weex SDK 还没有图片下载的功能,你需要实现IWXImgLoaderAdapter,参照下面的例子
package com.alibaba.weex.extend;

import android.app.Activity;
import android.text.TextUtils;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;
import com.taobao.weex.WXEnvironment;
import com.taobao.weex.adapter.IWXImgLoaderAdapter;
import com.taobao.weex.common.WXImageStrategy;
import com.taobao.weex.dom.WXImageQuality;

public class ImageAdapter implements IWXImgLoaderAdapter {

    private Activity mContext;

    public ImageAdapter(Activity activity) {
        mContext = activity;
    }

    @Override
    public void setImage(final String url, final ImageView view,
            WXImageQuality quality, WXImageStrategy strategy) {
        mContext.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                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)
                        .resize(view.getLayoutParams().width,
                                view.getLayoutParams().height).into(view);
            }
        });
    }
}
@EricHu1992

请问是否有安卓组件调用Weex里面function的方案?比如来了条推送,需要刷新界面上的红点这种需求

@JackyAndroid

@EricHu1992 我也找了半天,估计是没有

@hskj-zlh
hskj-zlh commented Aug 4, 2016

@EricHu1992 @JackyAndroid 请问是否找到 android 调用weex中function的方案? 能否实现android和weex互相通讯?

@duyuan199010

运行Demo,有时候会报如下异常:
ReportException : ReferenceError: weex_define is not defined
at Object. ((weex):47:3)
at webpack_require ((weex):20:30)
at (weex):40:18
at (weex):43:10
E/weex: [WXBridgeManager] invokeCreateInstance: framework.js uninitialized.
D/weex: WXDebugTool not found!

请问有什么解决办法吗?

@Apcan
Apcan commented Aug 29, 2016

@hskj-zlh 有办法的用事件触发的方式,在android触发特定事件并在weex中监听事件,我目前是这么干的,也没想到别的办法

@pitatensai

@Apcan 我想知道具体在android的weex sdk那一个类实现 用事件触发

@huoyabingqian

注册组件在哪注册,连个demo都没有,就两行代码,你是让我们猜吗?

@lilong-dev

给的demo都不具代表性性

@MARCUSW10

还要添加import com.taobao.weex.WXSDKManager; 不然WXSDKManager找不到

@nisang
nisang commented Nov 18, 2016

android怎样重写顶部的默认navbar?openURL时默认就出现顶部的返回按钮与中间字符。

@yulinho
yulinho commented Jan 5, 2017

请问是否有安卓组件调用Weex里面function的方案?比如来了条推送,需要刷新界面上的红点这种需求 +1 。同求解决方案

@yulinho
yulinho commented Jan 5, 2017

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment