我想观察一个@Bindable通过Java,可以吗?
我读到我可以在此答案上观察到ObservableField:https : //stackoverflow.com/a/31885802/858257
但有时您需要原始字段,而最好的方法是使用@Bindable。
在数据绑定适配器中,我想检查int模型中的值是否不为零。因为从不显示提示,如果默认值为 0,则 0 显示为文本。如果值为零,我想显示提示。
下面无需检查 0 int 值即可正常工作
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/port"
android:inputType="number"
android:text="@={`` + item.port}"
/>
Run Code Online (Sandbox Code Playgroud)
我试过这个不起作用
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/port"
android:inputType="number"
android:text='@={item.port != 0 ? `` + item.port : ""}'
/>
Run Code Online (Sandbox Code Playgroud)
item.port是int价值
有什么建议可以只使用数据绑定来完成这项工作吗?
我在我的应用程序中使用 GreenDao。为调试构建启用 Proguard。
添加数据绑定支持后,出现以下问题:
/app/src/main/java/com/example/MainApplication.java:29: 错误:找不到符号
私有 DaoSession mDaoSession;
Run Code Online (Sandbox Code Playgroud)^符号:类 DaoSession
位置:类 Main Application
同样的问题即将到来DaoMaster。
另外,这个问题来了:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:kaptDebugKotlin'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
Run Code Online (Sandbox Code Playgroud)
应用程序 build.gradle:
apply plugin: 'kotlin-kapt'
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
//For green dao
apply plugin: 'org.greenrobot.greendao'
buildscript {
ext.kotlin_version = '1.2.41'
...
}
android {
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
...
}
dataBinding {
enabled = true
}
buildTypes {
debug {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' …Run Code Online (Sandbox Code Playgroud) 我想将UI LiveData与DataBinding一起使用时进行更改。但是随着LiveData变化,它并不能反映UI的变化。
MainViewModel.java
public class MainViewModel extends AndroidViewModel {
/**
* Boolean variable to see whether user is ClockedIn or ClockedOut
*/
public MutableLiveData<Boolean> isClockedIn;
public MainViewModel(Application application) {
super(application);
isClockedIn = new MutableLiveData<>();
//...
calculateClockedInOrNot(PreferencesManager.getString(mContext,PreferencesManager.CLOCK_STATUS_KEY));
}
/**
* An utility function to calculate whether user is clocked in or clocked out,
* this function is also called within this ViewModel after an api hit
*
* if string == "CLOCKED_OUT" or string == "mobileEventType.CLOCK_OUT" => user …Run Code Online (Sandbox Code Playgroud) android android-studio android-databinding android-architecture-components
我最近一直在使用数据绑定,并且遇到了 executePendingBindings 方法。文档几乎没有显示,我可以理解它是如何工作的或何时使用它。这是该方法用法的示例。
请举例说明使用和不使用它的区别。谢谢
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
Customer customer= List.get(position).second;
((CustomerViewHolder)holder).binding.setCustomer (customer)
((CustomerViewHolder)holder).binding.executePendingBindings();
}
Run Code Online (Sandbox Code Playgroud) 我有一个格式化一些文本的函数
fun String.formatTo(): String {
if (this.isNotEmpty()) {
val value = this.toDouble()
return "%.02f".format(value)
}
return ""
}
Run Code Online (Sandbox Code Playgroud)
我想使用数据绑定将这种乐趣应用到我的 textView 中,所以我调用了 textView ,在我的布局android:text="@{viewModel.text.formatTo()}"中导入类data
<data>
<import type="com.project.utils.extensions.ExtKt"/>
<variable
name="viewModel"
type="com.project.ViewModel" />
</data>
Run Code Online (Sandbox Code Playgroud)
但我在构建时遇到了错误:
Found data binding errors.
****/ data binding error ****msg:cannot find method formatTo() in class java.lang.String
Run Code Online (Sandbox Code Playgroud)
什么是问题?
我正在使用数据绑定应用自定义微调器。我以前从资源字符串数组传递数组,现在我从服务器获取数据,我需要将该数组放入微调器,那么我如何动态地做到这一点?就像这里我使用 android:entries 属性问题:如果从 API 获取数据,如何更新我的微调器值?
<data>
<variable
name="model"
type="com.abc.online.viewmodels.StoreHomeViewModel" />
</data>
<Spinner
android:id="@+id/isspSelectCity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:entries="@array/country_code_list"
android:gravity="center"
android:onItemSelected="@{(parent,view,pos,id)->model.onCitySelectItem(parent,view,pos,id)}" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我正在更换
android:entries="@array/country_code_list"
Run Code Online (Sandbox Code Playgroud)
和
android:entries="@{model.fetchCountriesCode()}"
Run Code Online (Sandbox Code Playgroud)
这是获取城市的功能
public List<String> fetchCountriesCode(){
List<String> list=new ArrayList<>();
if (getCitiesObj().getValue()!=null) {
Result[] cities = getCitiesObj().getValue().get(0).getResult();
for (Result cit : cities) {
list.add(cit.getName());
}
} return list;}
Run Code Online (Sandbox Code Playgroud)
android:entries 如果我们在渲染之前已经列出了值,则它不会在渲染后采用/更新值。那么我该怎么做呢?
<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 = "registrationViewModel"
type="com.android.freecommunity.ui.auth.AuthViewModel"/>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
tools:context=".ui.auth.Register">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="352dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/intro_background" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="32dp"
android:layout_marginEnd="32dp"
android:layout_marginBottom="32dp"
android:background="@drawable/round_layout_container"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0">
<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="45dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="@drawable/round_edit_text"
android:drawableLeft="@drawable/user"
android:drawablePadding="16dp"
android:ems="10"
android:hint="Fullname"
android:text="@={registrationViewModel.fullName}"
android:inputType="phone"
android:paddingStart="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
<EditText
android:id="@+id/editText2"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:background="@drawable/round_edit_text"
android:drawableLeft="@drawable/email"
android:drawablePadding="16dp"
android:ems="10"
android:hint="Email Address"
android:text="@={registrationViewModel.email}"
android:inputType="textEmailAddress"
android:paddingStart="16dp"
app:layout_constraintEnd_toEndOf="parent" …Run Code Online (Sandbox Code Playgroud) 不幸的是我已经经常遇到这个问题了。在我的 Android 项目中,我使用databinding将类绑定到我的 xml 布局,效果很好。基本上我是按以下方式进行的:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="myClass" type="com.somepackagename.myClass" />
</data>
</layout>
Run Code Online (Sandbox Code Playgroud)
在我的(相当大的)项目中,我经常对variable name许多不同的 xml 布局使用相同的布局。
经过大量重构后,由于以下构建错误,我现在无法再构建项目:
e: error: Cannot resolve type 'myClass'
e: error: cannot generate view binders android.databinding.tool.util.LoggedErrorException: failure, see logs for details.
Cannot resolve type 'myClass'
at android.databinding.tool.util.L.printMessage(L.java:134)
at android.databinding.tool.util.L.e(L.java:107)
at android.databinding.tool.expr.Expr.getResolvedType(Expr.java:386)
at android.databinding.tool.expr.ExprModel.lambda$resolveTypes$1(ExprModel.java:618)
...
Run Code Online (Sandbox Code Playgroud)
虽然 errorMessage 对我来说很清楚并告诉我哪个变量名导致了这个问题,但不幸的是它不是很详细并且没有告诉我:
如果您更改了许多 xml 布局,那么很难找到导致问题的原因。
难道没有更好的方法来调试此类错误吗?
我现在正在学习 Android ViewModel。我有 MainActivity 和 RegisterActivity ,它们可以在其中输入姓名、年龄和电话号码。在 RegisterActivity 中输入该信息后,我将该信息放入 ViewModel 并单击一个按钮并完成 RegisterActivity。问题是,我想在 MainActivity 中显示信息。那么如何在两个活动之间共享 viewModel 呢?我必须使用什么概念?
错误信息:
C:\FWE\Android\app\build\generated\data_binding_base_class_source_out\debug\out\com\test\app\databinding\RowCategoryBinding.java:14: error: cannot find symbol
import com.test.app.Models;
symbol: class Models
location: package com.test.app
Run Code Online (Sandbox Code Playgroud)
关于RowCategoryBinding.java:14,它包含这个
import com.test.app.Models;
Run Code Online (Sandbox Code Playgroud)
CategoriesModel.java如果我将文件放入 Models 文件夹中,则会出现错误
com.test.app
|
--- Adapters
--- Activites
--- Fragments
--- Models
|
--- CategoriesModel.java
--- Interfaces
--- Utils
--- ViewModels
Run Code Online (Sandbox Code Playgroud)
但是,如果我将CategoriesModel.java文件移到模型之外,那么该应用程序将正常运行而不会出现错误。是什么原因?
com.test.app
|
--- Adapters
--- Activites
--- Fragments
--- Models
--- Interfaces
--- Utils
--- ViewModels
--- CategoriesModel.java
Run Code Online (Sandbox Code Playgroud) 我正在学习使用数据绑定库。我知道,它消除了手动调用findViewById()的需要,并使代码更加健壮和易读。
为了了解其用途,我做了以下工作:
制作了一个temp_layout.xml,其中包含2个ID为'tv1'和'tv2'的文本视图
将<layout>标签添加为根
点击“构建项目”
现在,我发现有一个新的'TempLayoutBinding'类可用,其中包含变量'tv1'和'tv2'。
我的问题是,即使我已经<layout>在temp_layout.xml中指定了标签,为什么还需要调用mBinding = DataBindingUtil.setContentView(...)?具体是做什么的?
我所知道的
问题
android ×13
data-binding ×3
kotlin ×2
android-architecture-components ×1
gradle ×1
java ×1
mvvm ×1
performance ×1
spinner ×1
xml ×1