标签: android-databinding

当 edittext 的默认文本为浮点值时,编辑文本光标重置为左侧

我正在使用绑定适配器来防止 2 路绑定的编辑文本的不断文本更新。

@BindingAdapter("binding")
public static void bindEditText(EditText editText, final String str) {
    if ((!editText.getText().toString().equals(str)) && !editText.getText().equals("")) {
        editText.setText(str);
    }
}
Run Code Online (Sandbox Code Playgroud)

它适用于带有整数默认文本的编辑文本。但是当涉及到使用浮动默认文本编辑文本时。例如:70.0,当我输入第一个数字时,编辑文本会刷新并变为例如:8.0。然后光标向左移动,后面的所有数字都将被添加到前面。例如:198.0

试过这个,但不起作用。

@BindingAdapter("binding")
public static void bindEditText(EditText editText, final String str) {
    if ((!(editText.getText().toString()+".0").equals(str)) && !editText.getText().equals("")) {
            editText.setText(str);
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么解决办法吗?

data-binding android android-edittext android-databinding

2
推荐指数
1
解决办法
1627
查看次数

为什么android数据绑定库没有按预期工作?

我是 Android 数据绑定概念的新手,我已经从这个博客中阅读了它,并且它与他们提供的简单示例一起正常工作,我进行了一个空白活动,因此将有两个文件activity_main.xmlcontent_main.xml

这是activity_main.xml代码

        <android.support.design.widget.CoordinatorLayout
            android:id="@+id/activity_main"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            tools:context=".activity.MainActivity">

            <android.support.design.widget.AppBarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:theme="@style/AppTheme.AppBarOverlay">

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    android:background="?attr/colorPrimary"
                    app:popupTheme="@style/AppTheme.PopupOverlay" />

            </android.support.design.widget.AppBarLayout>

            <include layout="@layout/content_main" />

            <android.support.design.widget.FloatingActionButton
                android:id="@+id/fab"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom|end"
                android:layout_margin="@dimen/fab_margin"
                android:src="@android:drawable/stat_notify_sync_noanim" />

        </android.support.design.widget.CoordinatorLayout>
    </layout>
Run Code Online (Sandbox Code Playgroud)

正如我所建议的那样,我已经将父级作为布局,并且从 Java 端我按如下方式访问它

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);


         setSupportActionBar(activityMainBinding.toolbar);
        //Floating Action Button
         activityMainBinding.fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with …
Run Code Online (Sandbox Code Playgroud)

data-binding android android-activity android-databinding

2
推荐指数
1
解决办法
2196
查看次数

ObservableField不传播更改

我正在尝试Android的数据绑定功能,并且Observable字段似乎不会将更改传播到UI。

如果我扩展BaseObservable该类,那么一切都会按预期工作,但是,当我切换到ObservableBooleanObservableField数据更改时,它并没有传播到UI。

该模型

public class User {
  public final ObservableBoolean tapped = new ObservableBoolean(false);

    public boolean isTapped() {
        return tapped.get();
    }

    public void setTapped(boolean tapped) {
        this.tapped.set(tapped);
    }
}
Run Code Online (Sandbox Code Playgroud)

布局

<layout 
    <data>
        <variable
            name="user"
            type="User"/>
          ....
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="@{user.tapped ? @color/colorAccent : @color/white}"
        android:onClick="@{() -> user_holder.onClickTest(user)}">

        ......
    </LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

data-binding android android-databinding

2
推荐指数
1
解决办法
1199
查看次数

android中膨胀布局的数据绑定不会刷新

目前我正在为Android开发一个应用程序,并为我的gui使用数据绑定.

我的问题是我要显示的数据不会自动刷新.

我认为我的问题的根源是我将多个子视图扩展到我的根视图中.我的视图层次结构看起来像这样:

  • layout_activity_main
    • fragment_layout_0(这里没有数据绑定)
    • fragment_layout_1(显示特定设备详细信息的布局)
      • process_data_view
        • value_0_view
        • value_1_view
        • ...
      • interface_view
      • ...

我对process_data_view和value_x_view使用数据绑定,以便自动刷新视图.如果设备不包含过程数据,则process_data_view应该是不可见的.直到这一点它工作正常,因为设备的数据绑定是在片段的onCreateView方法中设置的.

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup Bundle savedInstanceState) {
        binding = DataBindingUtil.inflate(inflater,R.layout.layout_details_new,container,false);
        return binding.getRoot();
    }
Run Code Online (Sandbox Code Playgroud)

当没有过程数据时,视图是不可见的,当我在运行期间接收过程数据时,视图将自动可见.

但现在我想为value_x_view充气另一个xml文件.我像这样膨胀它:

private void setValue(View view, int value){
            ValueViewBinding valueBinding = DataBindingUtil.inflate(getLayoutInflater(null), R.layout.value_view, (LinearLayout)view, false);
            valueBinding.setValue(value)
            View valueView = valueBinding.getRoot();
            ((LinearLayout) view).addView(valueView);
}
Run Code Online (Sandbox Code Playgroud)

*参数"view"是父片段布局中的LinearLayout

当我运行applikation并且它们显示正确时,我膨胀大约12个value_views.唯一的问题是他们没有得到更新.它们只显示value_view膨胀时有效的值.

有没有办法让数据绑定工作.我错过了什么或我做错了什么?

data-binding android android-databinding

2
推荐指数
1
解决办法
8618
查看次数

绑定适配器无效元素问题

与工作@BindingAdapter一直正常,直到如今.我得到一个不寻常的问题,我没有看到如何解决它的明确路径.

堆栈跟踪

@BindingAdapter on invalid element: setPieChartData(com.github.mikephil.charting.charts.PieChart,java.util.HashMap<java.lang.String,java.lang.Integer>,java.lang.String)
    at com.sun.tools.javac.main.Main.compile(Main.java:553)
    at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
    at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
    at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:46)
    at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:33)
    at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:104)
    at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:53)
    at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:38)
    at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:35)
    at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)
    at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:206)
    at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:187)
    at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:130)
    at com.android.build.gradle.tasks.factory.AndroidJavaCompile.compile(AndroidJavaCompile.java:49)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:163)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
    at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76)
Run Code Online (Sandbox Code Playgroud)

我的功能

@BindingAdapter({"bind:alternatives","bind:topic"})
private static void setPieChartData(PieChart pieChart, HashMap<String,Integer> alternatives, String topic) {
    PieChartHelper.initializePieChart(pieChart,alternatives,topic);
}
Run Code Online (Sandbox Code Playgroud)

我的XML布局

     <com.github.mikephil.charting.charts.PieChart
        android:id="@+id/pie_chart"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        app:alternatives="@{gameFeedItem.alternatives}"
        app:topic="@{gameFeedItem.topic}"/>
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我为其他观点做了类似的解决方案.但这是唯一一个完整的自定义视图.那么PieChart类不能以这种方式支持数据绑定吗?

使用的库可以在https://github.com/PhilJay/MPAndroidChart找到

data-binding android mpandroidchart android-databinding

2
推荐指数
1
解决办法
456
查看次数

使用数据绑定库将基本类型导入布局

我需要在项目布局中使用一个单独的布尔变量,该变量打算用作的一行recyclerView,以切换其中某些视图的状态。

我知道,我可以选择将布尔值包含在模型类中并使用它。我很好奇,是否有可能借助数据绑定库在布局内使用基本类型。

android mvvm android-databinding

2
推荐指数
1
解决办法
1215
查看次数

带数据绑定的ConstraintLayout

有可能做这样的事情:

XML:

        <android.support.constraint.Guideline
             app:layout_constraintGuide_percent="@{viewModel.guidelinePercent}"
        />
Run Code Online (Sandbox Code Playgroud)

视图模型:

  @Bindable
    public float getGuidelinePercent() {
        return condition ? 0.6f : 0.8f;
    }
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

在android.support.constraint.Guideline上找不到参数类型为float的属性'app:layout_constraintGuide_percent'的setter.

我已尝试使用BindingAdaptor,但它不会更改值:

视图模型:

@BindingAdapter(value = {"constraintPercent"})
public static void setConstraintPercent(Guideline view, float percent){
    ConstraintSet constraintSet = new ConstraintSet();
    constraintSet.setGuidelinePercent(view.getId(), percent);
}
Run Code Online (Sandbox Code Playgroud)

XML:

<android.support.constraint.Guideline
                 app:constraintPercent="@{viewModel.guidelinePercent}"
            />
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?
谢谢.

android android-databinding android-constraintlayout

2
推荐指数
2
解决办法
4215
查看次数

具有DataBinding的RecyclerView项Click侦听器

我已经使用baseadapter通过数据绑定实现了回收站视图,该适配器可处理任何布局项目的所有绑定。

我试图使用方法引用和侦听器绑定来实现每项单击侦听器,但是我无法做到这一点。

这是我的代码。您能给我一个示例,它是检测回收站视图中每个项目的简单方法,并且我想为每个项目添加单击侦听器以用于不同的目的。谢谢。

MyBaseAdapter

public abstract class MyBaseAdapter extends RecyclerView.Adapter<MyBaseAdapter.MyViewHold> {





public class MyViewHold extends RecyclerView.ViewHolder implements View.OnClickListener {

    public ViewDataBinding binding;
    Context context;

    public MyViewHold(ViewDataBinding binding) {

        super(binding.getRoot());
        this.binding = binding;

        context = binding.getRoot().getContext();
        binding.getRoot().setOnClickListener(this);



    }

    // Here BR.pojo must be matched to layout variable name
    //our layout variable was
    /*
     <variable
        name="pojo"
        type="com.durbinlabs.databinding.POJO"
        />
     */
    public void bind(Object obj) {
        binding.setVariable(BR.pojo, obj);
        binding.setVariable(BR.food, obj);


        binding.executePendingBindings();



    }


    @Override
    public void onClick(View view) {
        // for all view

    }




} …
Run Code Online (Sandbox Code Playgroud)

data-binding android android-recyclerview android-databinding

2
推荐指数
1
解决办法
2769
查看次数

如何从android数据绑定中的类导入公共静态字段

我想在android布局数据绑定中从接口常量导入一些字符串.

如果我使用此行,Gradle构建将失败

android:drawableRight="@{item.icon.equalsIgnoreCase(Constants.FOOD_TYPE_NON_VEG)? @drawable/ic_nonveg : @drawable/ic_veg}"
Run Code Online (Sandbox Code Playgroud)

但是线下工作

android:drawableRight="@{item.icon.equalsIgnoreCase(`nonveg`)? @drawable/ic_nonveg : @drawable/ic_veg}"
Run Code Online (Sandbox Code Playgroud)

样本xml是

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

    <data>

        <variable
            name="Constants"
            type="com.amelio.utils.Constants"/>

    </data>

    <TextView
        style="@style/tvVerySmall"
        android:layout_width="match_parent"
        android:drawableRight="@{item.icon.equalsIgnoreCase(`nonveg`)? @drawable/ic_nonveg : @drawable/ic_veg}"
        />

</layout>
Run Code Online (Sandbox Code Playgroud)

和Constants接口是

public interface Constants {
    String FOOD_TYPE_NON_VEG  = "nonveg";
}
Run Code Online (Sandbox Code Playgroud)

如何在数据绑定中从xml布局中的接口导入字符串?

data-binding android android-layout android-databinding

2
推荐指数
2
解决办法
1932
查看次数

数据绑定和包含的布局:找不到onClick的setter属性

我正在尝试OnClickListener<include>d布局设置a,但在编译时收到数据绑定错误,指出该数据绑定“找不到参数类型为android.view.View.OnClickListener的属性'android:onClick'的设置器”。

这里的上下文是我正在使用数据绑定来膨胀包含的布局,以便可以从viewModel绑定到包含布局的传递值到其中。

我为数据绑定表达式尝试了各种语法:

  • @{viewModel::onClickFunction}
  • @{viewModel.onClickFunction}
  • @{() -> viewModel.onClickFunction()}
  • @{(view) -> viewModel.onClickFunction()}
  • @{_ -> viewModel.onClickFunction()}

我已经尝试将以上所有onClickFunction功能和功能作为OnClickListener对象。

关于Stack Overflow的其他相关问题似乎可以通过清理项目以重新生成数据绑定文件来解决此问题,但这对我没有用。

以下相关代码段:

viewModel

class MyViewModel() {
    val onClickFunctionAsAListener: OnClickListener = object:OnClickListener{
        override fun onClick(v: View?) {
            //Do something
        }
    }

    fun onClickFunction() {
            //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

包括布局

<layout>

    <data>
        <variable name="viewModel" type="full.package.name.MyViewModel"/>
    </data>

    <LinearLayout>
        <include 
            layout="@layout/included_layout"
            android:onClick="@{viewModel.onClickListener}"
            app:customAttribute="@{`someText`}/>
    </LinearLayout>

</layout>
Run Code Online (Sandbox Code Playgroud)

包含布局

<layout>

    <data>
        <variable name="customAttribute" type="String"/>
    </data>

    <TextView
        layout="@layout/included_layout"
        android:text="@{customAttribute}"/>

</layout>
Run Code Online (Sandbox Code Playgroud)

android kotlin android-databinding

2
推荐指数
1
解决办法
843
查看次数