我有一个带有一些 TextView 和 CardView 的布局。只有引用 binding.mycardview 返回一个对象CardView?,但根据文档:
空安全:由于视图绑定创建对视图的直接引用,因此不存在因视图 ID 无效而导致空指针异常的风险。此外,当视图仅出现在布局的某些配置中时,绑定类中包含其引用的字段将标记为 @Nullable。
我的布局 row.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/cVComune"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/space"
android:layout_marginTop="@dimen/space"
android:layout_marginEnd="@dimen/space"
android:layout_marginBottom="@dimen/space"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvComune"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/space"
android:layout_marginTop="@dimen/space"
android:textSize="@dimen/text_label_medium"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvCap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/space"
android:layout_marginTop="@dimen/space"
android:textSize="@dimen/text_label_medium"
app:layout_constraintStart_toEndOf="@+id/ivMail"
app:layout_constraintTop_toBottomOf="@+id/tvComune" />
<TextView
android:id="@+id/tvPrefisso"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/space"
android:layout_marginTop="@dimen/space"
android:textSize="@dimen/text_label_medium"
app:layout_constraintStart_toEndOf="@+id/ivPhone"
app:layout_constraintTop_toBottomOf="@+id/tvComune" />
<TextView
android:id="@+id/tvAbitanti"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/space"
android:layout_marginTop="@dimen/space"
android:textSize="@dimen/text_label_medium"
app:layout_constraintStart_toEndOf="@+id/ivAbitanti"
app:layout_constraintTop_toBottomOf="@+id/tvComune" …Run Code Online (Sandbox Code Playgroud) 我有一个风格,其中包含与我的main源集中相同的布局资源。这是因为它用特定的风味覆盖了主要的。我在很多地方都这样做过,在我引入ViewBinding. 为准确起见,布局是“包含”在片段中的嵌套布局。
这是结构:
main
- res
- - layout
- - - layout_sign_up_details_fields.xml
flavor
- res
- - layout
- - - layout_sign_up_details_fields.xml
Run Code Online (Sandbox Code Playgroud)
我til_sudf_first_name在我的主要资源中没有的特定于风味的布局资源中有一个视图,其 ID 是。这是有意的。View通过在运行此构建变体时查看生成的源,我可以看到这是在我的绑定类中“绑定”的。
main
- res
- - layout
- - - layout_sign_up_details_fields.xml
flavor
- res
- - layout
- - - layout_sign_up_details_fields.xml
Run Code Online (Sandbox Code Playgroud)
现在实际绑定发生在“基”类中,并使用protected可见性修饰符与子类共享,如下所示:
@NonNull
public final TextInputLayout tilSudfFirstName;
Run Code Online (Sandbox Code Playgroud)
问题是detailsBinding不包含我需要的视图,即使它存在于生成的类中。
此外,另一个奇怪的事情是,即使main布局文件中存在不在特定于风味的布局文件中的视图,它们仍然包含在生成的布局文件中。
我正在尝试做的甚至可能吗?我可用的解决方法是对这个实例使用 kotlin 的综合视图处理,因为我一直在尝试使用推荐的方法
data-binding android android-layout android-flavors android-viewbinding
实际代码:
我的主要活动:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val rollButton = binding.rollButton
rollButton.setOnClickListener { rollDice() }
setContentView(binding.root)
}
private fun rollDice() {
val randomDiceRoll = Random.nextInt(6) + 1
Toast.makeText(this, randomDiceRoll.toString(), Toast.LENGTH_SHORT).show()
binding.resultText.text = randomDiceRoll.toString()
}
Run Code Online (Sandbox Code Playgroud)
我的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/result_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/count"
android:textSize="30sp" />
<Button
android:id="@+id/roll_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/roll" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
在android studio中预览: …
所需功能:
我有一个活动,它有一个从后端接收到的值,该值指示使用两种布局之一。我们将此值称为layoutType,并假设为简单起见,在下面的示例代码中,我们不关心如何分配它。因此,我有两个布局 xml 文件,我们称它们为layout1.xml和layout2.xml。
实现: 我想使用View Binding。我创建了一个ViewBinding类型的变量,并尝试为其分配Layout1Binding或Layout2Binding。这个逻辑的伪代码总结如下:
private ViewBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(layoutType == 1){
binding = Layout1Binding.inflate(getLayoutInflater());
} else {
binding = Layout2Binding.inflate(getLayoutInflater());
}
setContentView(binding.getRoot());
}
Run Code Online (Sandbox Code Playgroud)
结果:当然,这不起作用,变量绑定似乎没有可以引用的内部子级。另外,当然如果我将变量的类型转换为Layout1Binding并且layoutType等于1,那么我就可以正确使用它。如果我使用Layout2Binding并且layoutType不等于 1,情况也是如此。所有这些都是有意义的,因为 ViewBinding 只是由生成的类Layout1Binding和Layout2Binding实现的接口。
问题:如何仅使用一个可以分配给两个不同生成类的绑定变量来实现上述所需的行为?还有其他替代方法吗?
我正在使用视图绑定,为此我使用了以下代码。
buildFeatures{ viewBinding true }
Run Code Online (Sandbox Code Playgroud)
我得到了这个错误:
> [databinding] {"msg":"Found \u003clayout\u003e but data binding is not
> enabled.\n\nAdd buildFeatures.dataBinding \u003d true to your
> build.gradle to enable
> it.","file":"C:\\Users\\akash\\AndroidStudioProjects\\NavigationSafeArgs\\app\\src\\main\\res\\layout\\fragment_home.xml","pos":[]}
Run Code Online (Sandbox Code Playgroud)
读完抛出的错误后,我认为它是说启用dataBinding所以我dataBinding true也在里面添加了buildFeatures。它仍然抛出同样的错误。
这是我的fragment_home.xml代码;
<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".HomeFragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/home_screen"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<Button
android:id="@+id/button_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/login" />
</LinearLayout>
</layout>
Run Code Online (Sandbox Code Playgroud) 我有一个活动及其ConstraintLayout片段:
<androidx.constraintlayout.widget.ConstraintLayout
...attributes....
>
<fragment
android:id="@+id/containerView"
app:navGraph="@navigation/some_navigation"
...other attributes...
/>
...other views...
Run Code Online (Sandbox Code Playgroud)
我在活动代码中使用视图绑定:
binding = ActivityMainBinding.inflate(layoutInflater)
Run Code Online (Sandbox Code Playgroud)
这里的问题是我无法访问binding.containerView. 万一fragment我应该使用findViewById?
Android studio 向我展示了这个问题,代码行下方有红线
“可疑的缩进:这是缩进的,但没有继续前面的表达式(binding.cllInternetA...)(这里是前面的语句)”
override fun onResume() {
super.onResume()
//Clear search edit text
binding.etSearch.text?.clear()
lookUpNumberVM.isInternetLiveData.observe(viewLifecycleOwner) {
if (it) {
binding.cllMain.visibility = View.VISIBLE
binding.cllInternetAvailability.visibility = View.GONE
} else {
binding.cllMain.visibility = View.GONE
binding.cllInternetAvailability.visibility = View.VISIBLE
makeSnackBar(binding.root,"No internet connection")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的代码在上面,您可以在附带问题的屏幕截图中看到问题。我会非常感谢你的努力。
如何/在哪里可以找到为 ViewBinding 生成的代码?
每当我尝试 control+click/control+b 来查看声明时,AndroidStudio 都会打开 XML 布局。
我使用包含布局,我需要更改它的可见性:
<include
android:id="@+id/layout_provinces"
layout="@layout/layout_select_provinces"
/>
Run Code Online (Sandbox Code Playgroud)
而 layout_select_provinces 是这样的:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/select_province"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/white"
android:visibility="gone">
<LinearLayout
android:id="@+id/layout_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/background_color"
android:orientation="vertical">
<TextView
android:id="@+id/txt_state"
style="@style/FontIranBold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/_8sdp"
android:layout_marginRight="@dimen/_4sdp"
android:layout_marginBottom="@dimen/_8sdp"
android:text="@string/txt_select_province"
android:textSize="@dimen/font_size_small" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/_1sdp"
android:background="@color/gray_special" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_estate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/layout_top"
android:layout_marginTop="@dimen/_8sdp" />
Run Code Online (Sandbox Code Playgroud)
但是当我将 Id 设置为 RelativeLayout 时,我的应用程序崩溃并且我无法更改可见性:
binding.layoutProvinces.selectProvince.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)
有没有人可以帮助我处理 ViewBinding 设置 ID 过程?
在我的项目中启用视图绑定后出现错误。
我尝试重新同步项目,使缓存无效。我的应用程序gradle文件:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.learning.aboutme"
minSdkVersion 19
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
viewBinding.enabled = true
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
Run Code Online (Sandbox Code Playgroud)
我的项目gradle文件
// Top-level build file where you can add configuration options …Run Code Online (Sandbox Code Playgroud)