尝试将数据绑定提供的上下文变量与BaseObservable一起使用时出错

卡斯拉·拉杰迪(Kasra rahjerdi)

根据此注释Android数据绑定教程,在数据绑定时,我应该有一个context可用变量:

会根据需要生成一个特殊的名为context的变量,用于绑定表达式。context的值是根视图的getContext()中的Context。上下文变量将被具有该名称的显式变量声明覆盖。

我正在使用扩展类BaseObservable来设置数据,但是无论我如何尝试context@Bindable方法中引入变量,都会出现编译时错误:

java.lang.RuntimeException:故障,有关详细信息,请参见日志。与方法关联的@Bindable必须遵循JavaBeans约定getStyledName(android.content.Context)

据我所知,我遵循JavaBeans约定。我已经在BrUtil中将错误跟踪到了这一行,但这也没有给我太多帮助。

我尝试更改方法和参数名称,尝试添加<variable>forcontext<import>for android.content.Context,但是没有任何区别。我的User.java下面有两种@Bindable方法,裸方法getName()可以正常工作,但尝试使用该context变量的方法却不行,因此我也不认为其余的数据绑定设置也有问题。

相关代码:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable name="user" type="com.kasra.androidsandbox.User" />
    </data>

    <LinearLayout
        android:id="@+id/main_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v7.widget.Toolbar
            android:id="@+id/main_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

        <TextView
            android:id="@+id/main_textview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="@{user.getStyledName(context)}" />
    </LinearLayout>
</layout>

User.java

public class User extends BaseObservable {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Bindable
    public String getName() {
        return this.name;
    }

    @Bindable
    public CharSequence getStyledName(Context ctx) {
        int color = ctx.getResources().getColor(R.color.branded_pink);

        Spannable textSpan = new SpannableString(name);
        textSpan.setSpan(new ForegroundColorSpan(color), 0, textSpan.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        return textSpan;
    }

}

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    User user = new User("Kasra");
    binding.setUser(user);

    Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
    setSupportActionBar(toolbar);
}
丽莎·雷(Lisa Wray)

我不知道这是错误还是预期的行为,但是我自己观察到了这种行为,因此您并不疯狂。

一种解决方法是创建一种@Bindable在用户中未标记的方法-需要上下文的方法。此方法不受JavaBeans命名约定的约束。

重要说明:为了确保已正确更新,应将可能更改的任何@Bindable字段作为输入。

User.java

public class User extends BaseObservable {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Bindable
    public String getName() {
        return this.name;
    }

    public CharSequence getStyledName(Context ctx, String name) {
        // construct styled name here
    }
}

并在您的布局中:

<TextView
        android:id="@+id/main_textview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="@{user.getStyledName(context, user.name)}" />

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将多个托管对象上下文与核心数据库一起使用

将WCF与负载平衡(AWS)一起使用时,无效的安全上下文令牌

将fnAddData与数据顺序一起使用时出错

将上下文与Redux一起使用

将 Keycloak 与 icCube 一起使用 - 如何使其工作(缺少 Keycloak 上下文令牌)?

React Context - 将 Provider 与 ContextName.Provider 之类的上下文一起使用

将Python Pool与上下文管理器一起使用或关闭并加入

将Django上下文处理器与表单一起使用

是否可以将SQL Server会话上下文与Azure弹性查询一起使用

如何将队列与“with”上下文管理器一起使用

了解侦听的方式:与Provider <SomeType> .of一起使用时,false起作用(上下文,侦听:false)

将变量与jQuery选择器一起使用时出错

将argv与函数一起使用时出错

将statsmodels与pyinstaller一起使用时出错

将 ScrollChor 与 NavItem 一起使用时出错

将FutureBuilder与本地JSON一起使用时出错

将AutoMapper与异步方法一起使用时出错

将ngMaterial与ngRoute一起使用时出错

将Express会话与Express一起使用时出错

将SharedElementTransition与recyclerView一起使用时出错

将SparkJob与NamedRddSupport一起使用时出错

将cout与指针值一起使用时出错

将 File 与 ImagePicker Flutter 一起使用时出错

例外:将CreateDocumentUri与分区文档数据库一起使用时,提供了分区键...

将事件侦听器与其他类Android的上下文一起使用

尝试将 Storybook 与 react-admin 一起使用时出错“必须在 <Form> 组件内使用 useField”

如何将ColorMatrix与Canvas上下文一起应用

将Pomelo MySQL EF提供程序与ASP.NET Core 2.0 Preview一起使用时出错

为什么将绑定数据上下文设置为控件的数据上下文?